diff --git a/wagtail/admin/templates/wagtailadmin/pages/search_results.html b/wagtail/admin/templates/wagtailadmin/pages/search_results.html index 9c470acfa8..1ffb3583da 100644 --- a/wagtail/admin/templates/wagtailadmin/pages/search_results.html +++ b/wagtail/admin/templates/wagtailadmin/pages/search_results.html @@ -2,7 +2,7 @@
{% if pages %}

- {% blocktrans count counter=pages.paginator.count %} + {% blocktrans count counter=all_pages.count %} There is one matching page {% plural %} There are {{ counter }} matching pages @@ -11,6 +11,27 @@ {% search_other %} + {% if pages.object_list.supports_facet %} + + {% endif %} + {% include "wagtailadmin/pages/listing/_list_explore.html" with show_parent=1 %} {% url 'wagtailadmin_pages:search' as pagination_base_url %} @@ -18,7 +39,7 @@ {% else %} {% if query_string %}

{% blocktrans %}Sorry, no pages match "{{ query_string }}"{% endblocktrans %}

- + {% search_other %} {% else %}

{% trans 'Enter a search term above' %}

diff --git a/wagtail/admin/views/pages.py b/wagtail/admin/views/pages.py index c8e6958b62..20c64a48a0 100644 --- a/wagtail/admin/views/pages.py +++ b/wagtail/admin/views/pages.py @@ -886,31 +886,63 @@ def copy(request, page_id): @vary_on_headers('X-Requested-With') @user_passes_test(user_has_any_page_permission) def search(request): - pages = [] + pages = all_pages = Page.objects.all().prefetch_related('content_type').specific() q = MATCH_ALL + content_types = [] + pagination_query_params = {} + + if 'content_type' in request.GET: + pagination_query_params['content_type'] = request.GET['content_type'] + + app_label, model_name = request.GET['content_type'].split('.') + + try: + selected_content_type = ContentType.objects.get_by_natural_key(app_label, model_name) + except ContentType.DoesNotExist: + raise Http404 + + pages = pages.filter(content_type=selected_content_type) + else: + selected_content_type = None if 'q' in request.GET: form = SearchForm(request.GET) if form.is_valid(): q = form.cleaned_data['q'] + pagination_query_params['q'] = q + + all_pages = all_pages.search(q) + pages = pages.search(q) + + if pages.supports_facet: + content_types = [ + (ContentType.objects.get(id=content_type_id), count) + for content_type_id, count in all_pages.facet('content_type_id').items() + ] - pages = Page.objects.all().prefetch_related('content_type').specific().search(q) - paginator, pages = paginate(request, pages) else: form = SearchForm() + paginator, pages = paginate(request, pages) + if request.is_ajax(): return render(request, "wagtailadmin/pages/search_results.html", { 'pages': pages, + 'all_pages': all_pages, 'query_string': q, - 'pagination_query_params': ('q=%s' % q) if q else '' + 'content_types': content_types, + 'selected_content_type': selected_content_type, + 'pagination_query_params': '&'.join('{}={}'.format(*p) for p in pagination_query_params.items()), }) else: return render(request, "wagtailadmin/pages/search.html", { 'search_form': form, 'pages': pages, + 'all_pages': all_pages, 'query_string': q, - 'pagination_query_params': ('q=%s' % q) if q else '' + 'content_types': content_types, + 'selected_content_type': selected_content_type, + 'pagination_query_params': '&'.join('{}={}'.format(*p) for p in pagination_query_params.items()), })