Skip to content
Snippets Groups Projects
Commit 26c866ba authored by Nik | Klampfradler's avatar Nik | Klampfradler Committed by root
Browse files

Implement search bar backend

parent 2663a731
No related branches found
No related tags found
1 merge request!204Resolve "Global search"
......@@ -71,6 +71,13 @@ class ExtensibleModel(CRUDMixin):
- Dominik George <dominik.george@teckids.org>
"""
# Defines a material design icon associated with this type of model
icon_ = "radio_button_unchecked"
def get_absolute_url(self) -> str:
""" Get the URL o a view representing this model instance """
pass
@property
def crud_event_create(self) -> Optional[CRUDEvent]:
""" Return create event of this object """
......
......@@ -7,6 +7,7 @@ from django.contrib.contenttypes.models import ContentType
from django.db import models
from django.db.models import QuerySet
from django.forms.widgets import Media
from django.urls import reverse
from django.utils import timezone
from django.utils.translation import ugettext_lazy as _
from image_cropping import ImageCropField, ImageRatioField
......@@ -133,6 +134,9 @@ class Person(ExtensibleModel):
primary_group = models.ForeignKey("Group", models.SET_NULL, null=True, blank=True)
def get_absolute_url(self) -> str:
return reverse("person_by_id", args=[self.id])
@property
def primary_group_short_name(self) -> Optional[str]:
""" Returns the short_name field of the primary
......@@ -237,6 +241,9 @@ class Group(ExtensibleModel):
blank=True,
)
def get_absolute_url(self) -> str:
return reverse("group_by_id", args=[self.id])
@property
def announcement_recipients(self):
return list(self.members.all()) + list(self.owners.all())
......
<a href="{{ result.object.get_absolute_url|default:"#" }}" class="collection-item">
<span class="secondary-content">
<i class="material-icons">{{ result.object.icon }}</i>
</span>
{{ result.object }}
</a>
\ No newline at end of file
<div class="collection">
{% for result in results %}
{% include "search/searchbar_snippet.html" %}
{% endfor %}
</div>
......@@ -39,6 +39,7 @@ urlpatterns = [
path("announcement/create/", views.announcement_form, name="add_announcement"),
path("announcement/edit/<int:pk>/", views.announcement_form, name="edit_announcement"),
path("announcement/delete/<int:pk>/", views.delete_announcement, name="delete_announcement"),
path("search/searchbar/", views.searchbar_snippets, name="searchbar_snippets"),
path("maintenance-mode/", include("maintenance_mode.urls")),
path("impersonate/", include("impersonate.urls")),
path("__i18n__/", include("django.conf.urls.i18n")),
......
......@@ -7,6 +7,7 @@ from django.shortcuts import get_object_or_404, redirect, render
from django.utils.translation import ugettext_lazy as _
from django_tables2 import RequestConfig
from haystack.query import SearchQuerySet
from .decorators import admin_required, person_required
from .forms import (
......@@ -320,3 +321,14 @@ def delete_announcement(request: HttpRequest, pk: int) -> HttpResponse:
messages.success(request, _("The announcement has been deleted."))
return redirect("announcements")
@login_required
def searchbar_snippets(request: HttpRequest) -> HttpResponse:
query = request.GET.get('q', '')
limit = int(request.GET.get('limit', '5'))
results = SearchQuerySet().autocomplete(text=query)[:limit]
context = {"results": results}
return render(request, "search/searchbar_snippets.html", context)
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment