Source code for djmvc_dal_topbar.views

from collections import OrderedDict

from dal_alight_queryset_sequence.views import AlightQuerySetSequenceView
from django import http
from django.utils.html import format_html
from queryset_sequence import QuerySetSequence

from djmvc.view import ViewMixin

from .lookup import (
    apply_search,
    find_detail_url,
    get_list_queryset,
    iter_searchable_list_views,
)


[docs] class SiteSearchView(ViewMixin, AlightQuerySetSequenceView): """Site-wide autocomplete across permitted model-controller list views.""" urlpath = 'search/' tags = [] @property def codename(self): return 'search' mixup = True paginate_by = 10
[docs] def has_permission(self): return self.request.user.is_authenticated
[docs] def get_queryset(self): if not self.q: return QuerySetSequence() querysets = [] for list_view in iter_searchable_list_views(self.request): qs = get_list_queryset(list_view) qs = apply_search(qs, list_view.search_fields, self.q) querysets.append(qs) if not querysets: return QuerySetSequence() return self.mixup_querysets(QuerySetSequence(*querysets))
[docs] def render_to_response(self, context): groups = OrderedDict() for result in context['object_list']: groups.setdefault(type(result), []).append(result) html = [] for model, results in groups.items(): html.append(format_html( '<div class="autocomplete-light-group djmvc-site-search-group">{}</div>', model._meta.verbose_name, )) for result in results: detail_url = find_detail_url(model, result.pk) if not detail_url: continue html.append(format_html( '<div data-value="{}" data-url="{}">{}</div>', self.get_result_value(result), detail_url, str(result), )) return http.HttpResponse( ''.join(html), content_type='text/html; charset=utf-8', )