Browse Source

Change admin search forms to admin filter forms

rafalp 6 years ago
parent
commit
9b7d2232be

+ 18 - 18
misago/admin/views/generic/list.py

@@ -74,7 +74,7 @@ class ListView(AdminView):
             "page": None,
             "order_by": [],
             "order": None,
-            "search_form": None,
+            "filter_form": None,
             "active_filters": {},
             "querystring": "",
             "query_order": {},
@@ -114,15 +114,15 @@ class ListView(AdminView):
                 # So address ball contains copy-friendly link
                 refresh_querystring = True
 
-        search_form = self.get_search_form(request)
-        if search_form:
-            filtering_methods = self.get_filtering_methods(request, search_form)
+        filter_form = self.get_filter_form(request)
+        if filter_form:
+            filtering_methods = self.get_filtering_methods(request, filter_form)
             active_filters = self.get_filtering_method_to_use(filtering_methods)
             if request.GET.get("clear_filters"):
                 # Clear filters from querystring
                 request.session.pop(self.filters_session_key, None)
                 active_filters = {}
-            self.apply_filtering_on_context(context, active_filters, search_form)
+            self.apply_filtering_on_context(context, active_filters, filter_form)
 
             if (
                 filtering_methods["GET"]
@@ -174,19 +174,19 @@ class ListView(AdminView):
         context["items"] = context["page"].object_list
 
     # Filter list items
-    search_form = None
+    filter_form = None
 
-    def get_search_form(self, request):
-        return self.search_form
+    def get_filter_form(self, request):
+        return self.filter_form
 
     @property
     def filters_session_key(self):
         return "misago_admin_%s_filters" % self.root_link
 
-    def get_filtering_methods(self, request, search_form):
+    def get_filtering_methods(self, request, filter_form):
         methods = {
-            "GET": self.get_filters_from_GET(request, search_form),
-            "session": self.get_filters_from_session(request, search_form),
+            "GET": self.get_filters_from_GET(request, filter_form),
+            "session": self.get_filters_from_session(request, filter_form),
         }
 
         if request.GET.get("set_filters"):
@@ -194,14 +194,14 @@ class ListView(AdminView):
 
         return methods
 
-    def get_filters_from_GET(self, request, search_form):
-        form = search_form(request.GET)
+    def get_filters_from_GET(self, request, filter_form):
+        form = filter_form(request.GET)
         form.is_valid()
         return self.clean_filtering_data(form.cleaned_data)
 
-    def get_filters_from_session(self, request, search_form):
+    def get_filters_from_session(self, request, filter_form):
         session_filters = request.session.get(self.filters_session_key, {})
-        form = search_form(session_filters)
+        form = filter_form(session_filters)
         form.is_valid()
         return self.clean_filtering_data(form.cleaned_data)
 
@@ -217,12 +217,12 @@ class ListView(AdminView):
                 return methods.get(method)
         return {}
 
-    def apply_filtering_on_context(self, context, active_filters, search_form):
+    def apply_filtering_on_context(self, context, active_filters, filter_form):
         context["active_filters"] = active_filters
-        context["search_form"] = search_form(initial=context["active_filters"])
+        context["filter_form"] = filter_form(initial=context["active_filters"])
 
         if context["active_filters"]:
-            context["items"] = context["search_form"].filter_queryset(
+            context["items"] = context["filter_form"].filter_queryset(
                 active_filters, context["items"]
             )
 

+ 2 - 3
misago/legal/forms.py

@@ -57,14 +57,13 @@ class AgreementForm(forms.ModelForm):
         return agreement
 
 
-class SearchAgreementsForm(forms.Form):
+class FilterAgreementsForm(forms.Form):
     type = forms.MultipleChoiceField(
         label=_("Type"), required=False, choices=Agreement.TYPE_CHOICES
     )
     content = forms.CharField(label=_("Content"), required=False)
 
-    def filter_queryset(self, search_criteria, queryset):
-        criteria = search_criteria
+    def filter_queryset(self, criteria, queryset):
         if criteria.get("type") is not None:
             queryset = queryset.filter(type__in=criteria["type"])
 

+ 2 - 2
misago/legal/views/admin.py

@@ -3,7 +3,7 @@ from django.utils import timezone
 from django.utils.translation import gettext_lazy as _
 
 from ...admin.views import generic
-from ..forms import AgreementForm, SearchAgreementsForm
+from ..forms import AgreementForm, FilterAgreementsForm
 from ..models import Agreement
 from ..utils import set_agreement_as_active
 
@@ -27,7 +27,7 @@ class AgreementAdmin(generic.AdminBaseMixin):
 class AgreementsList(AgreementAdmin, generic.ListView):
     items_per_page = 30
     ordering = [("-id", _("From newest")), ("id", _("From oldest"))]
-    search_form = SearchAgreementsForm
+    filter_form = FilterAgreementsForm
     selection_label = _("With agreements: 0")
     empty_selection_label = _("Select agreements")
     mass_actions = (

+ 4 - 9
misago/templates/misago/admin/agreements/list.html

@@ -133,20 +133,15 @@
 {% endblock %}
 
 
-{% block modal-title %}
-{% trans "Search bans" %}
-{% endblock modal-title %}
-
-
-{% block modal-body %}
+{% block filters-modal-body %}
 <div class="row">
   <div class="col-md-12">
-    {% form_row search_form.type %}
+    {% form_row filter_form.type %}
   </div>
 </div>
 <div class="row">
   <div class="col-md-12">
-    {% form_row search_form.content %}
+    {% form_row filter_form.content %}
   </div>
 </div>
-{% endblock modal-body %}
+{% endblock filters-modal-body %}

+ 6 - 11
misago/templates/misago/admin/attachments/list.html

@@ -77,33 +77,28 @@
 {% endblock emptylist %}
 
 
-{% block modal-title %}
-{% trans "Search attachments" %}
-{% endblock modal-title %}
-
-
-{% block modal-body %}
+{% block filters-modal-body %}
 <div class="row">
   <div class="col-md-12">
-    {% form_row search_form.uploader %}
+    {% form_row filter_form.uploader %}
   </div>
 </div>
 <div class="row">
   <div class="col-md-12">
-    {% form_row search_form.filename %}
+    {% form_row filter_form.filename %}
   </div>
 </div>
 <div class="row">
   <div class="col-md-12">
-    {% form_row search_form.filetype %}
+    {% form_row filter_form.filetype %}
   </div>
 </div>
 <div class="row">
   <div class="col-md-12">
-    {% form_row search_form.is_orphan %}
+    {% form_row filter_form.is_orphan %}
   </div>
 </div>
-{% endblock modal-body %}
+{% endblock filters-modal-body %}
 
 
 {% block javascripts %}

+ 6 - 11
misago/templates/misago/admin/bans/list.html

@@ -93,27 +93,22 @@
 {% endblock %}
 
 
-{% block modal-title %}
-{% trans "Search bans" %}
-{% endblock modal-title %}
-
-
-{% block modal-body %}
+{% block filters-modal-body %}
 <div class="row">
   <div class="col-md-6">
-    {% form_row search_form.check_type %}
+    {% form_row filter_form.check_type %}
   </div>
   <div class="col-md-6">
-    {% form_row search_form.value %}
+    {% form_row filter_form.value %}
   </div>
 </div>
 <div class="row">
   <div class="col-md-6">
-    {% form_row search_form.registration_only %}
+    {% form_row filter_form.registration_only %}
   </div>
   <div class="col-md-6">
-    {% form_row search_form.state %}
+    {% form_row filter_form.state %}
   </div>
 </div>
-{% endblock modal-body %}
+{% endblock filters-modal-body %}
 

+ 1 - 2
misago/templates/misago/admin/categoryroles/categoryroles.html

@@ -6,7 +6,7 @@
 {% blocktrans trimmed with category=target %}
   {{ category }}: Permissions
 {% endblocktrans %} | {{ block.super }}
-{% endblock title%}
+{% endblock title %}
 
 
 {% block page-actions %}
@@ -35,7 +35,6 @@
     {{ category }}: Permissions
   {% endblocktrans %}
 </div>
-{% endif %}
 {% endblock %}
 
 

+ 1 - 1
misago/templates/misago/admin/categoryroles/rolecategories.html

@@ -6,7 +6,7 @@
 {% blocktrans trimmed with role=target %}
   {{ role }}: Category permissions
 {% endblocktrans %} | {{ block.super }}
-{% endblock title%}
+{% endblock title %}
 
 
 {% block page-header %}

+ 5 - 10
misago/templates/misago/admin/datadownloads/list.html

@@ -91,25 +91,20 @@
 {% endblock emptylist %}
 
 
-{% block modal-title %}
-{% trans "Search data downloads" %}
-{% endblock modal-title %}
-
-
-{% block modal-body %}
+{% block filters-modal-body %}
 <div class="row">
   <div class="col-md-12">
-    {% form_row search_form.status %}
+    {% form_row filter_form.status %}
   </div>
 </div>
 <div class="row">
   <div class="col-md-12">
-    {% form_row search_form.user %}
+    {% form_row filter_form.user %}
   </div>
 </div>
 <div class="row">
   <div class="col-md-12">
-    {% form_row search_form.requested_by %}
+    {% form_row filter_form.requested_by %}
   </div>
 </div>
-{% endblock modal-body %}
+{% endblock filters-modal-body %}

+ 3 - 3
misago/templates/misago/admin/generic/search_form.html → misago/templates/misago/admin/generic/filter_form.html

@@ -3,8 +3,8 @@
   <form method="get">
     <input type="hidden" name="clear_filters" value="1">
     <button class="btn btn-light btn-sm" type="button" data-toggle="modal" data-target="#filter-modal">
-      <span class="fa fa-search"></span>
-      {% trans "Search" %}
+      <span class="fa fa-filter"></span>
+      {% trans "Filter" %}
       {% if active_filters %}
         <span class="badge badge-primary">
           {{ active_filters|length }}
@@ -14,7 +14,7 @@
     {% if active_filters %}
       <button class="btn btn-light btn-sm ml-1" type="submit">
         <span class="fa fa-times"></span>
-        {% trans "Remove search" %}
+        {% trans "Clear filters" %}
       </button>
     </form>
   {% endif %}

+ 15 - 11
misago/templates/misago/admin/generic/list.html

@@ -4,12 +4,12 @@
 
 {% block title %}
 {{ active_link.name }} | {{ block.super }}
-{% endblock title%}
+{% endblock title %}
 
 
 {% block view %}
 <div class="card card-admin-table shadow-sm">
-  {% if paginator or order_by or search_form or mass_actions %}
+  {% if paginator or order_by or filter_form or mass_actions %}
     <div class="card-body">
       <div class="row align-items-center">
 
@@ -19,8 +19,8 @@
         {% if order_by %}
           {% include "misago/admin/generic/order_by.html" %}
         {% endif %}
-        {% if search_form %}
-          {% include "misago/admin/generic/search_form.html" %}
+        {% if filter_form %}
+          {% include "misago/admin/generic/filter_form.html" %}
         {% endif %}
         {% if mass_actions %}
           {% include "misago/admin/generic/mass_actions.html" %}
@@ -72,12 +72,16 @@
 
 {% block content %}
 {{ block.super }}
-{% if search_form %}
+{% if filter_form %}
   <div class="modal fade" id="filter-modal" tabindex="-1" role="dialog" aria-labelledby="filter-modal-label" aria-hidden="true">
     <div class="modal-dialog" role="document">
       <div class="modal-content">
         <div class="modal-header">
-          <h5 class="modal-title" id="exampleModalLabel">{% block modal-title %}{% endblock modal-title %}</h5>
+          <h5 class="modal-title" id="exampleModalLabel">
+            {% block filters-modal-title %}
+              {% trans "Filters" %}
+            {% endblock filters-modal-title %}
+          </h5>
           <button type="button" class="close" data-dismiss="modal" aria-label="{% trans 'Close' %}">
             <span aria-hidden="true">&times;</span>
           </button>
@@ -88,17 +92,17 @@
             <input type="hidden" name="{{ name }}" value="{{ value }}">
           {% endfor %}
           <div class="modal-body">
-            {% block modal-body %}{% endblock modal-body %}
+            {% block filters-modal-body %}{% endblock filters-modal-body %}
           </div>
           <div class="modal-footer">
-            {% block modal-footer %}
-              <button type="button" class="btn btn-default" data-dismiss="modal">
+            {% block filters-modal-footer %}
+              <button type="button" class="btn btn-light" data-dismiss="modal">
                 {% trans "Close" %}
               </button>
               <button type="submit" class="btn btn-primary">
-                {% trans "Save changes" %}
+                {% trans "Done" %}
               </button>
-            {% endblock modal-footer %}
+            {% endblock filters-modal-footer %}
           </div>
         </form>
       </div>

+ 1 - 1
misago/templates/misago/admin/themes/assets/list.html

@@ -4,7 +4,7 @@
 
 {% block title %}
 {% trans "Assets" %} | {{ theme }} | {{ active_link.name }} | {{ block.super }}
-{% endblock title%}
+{% endblock title %}
 
 
 {% block extra-head %}

+ 11 - 16
misago/templates/misago/admin/users/list.html

@@ -109,47 +109,42 @@
 {% endblock emptylist %}
 
 
-{% block modal-title %}
-{% trans "Search users" %}
-{% endblock modal-title %}
-
-
-{% block modal-body %}
+{% block filters-modal-body %}
 <div class="row">
   <div class="col-md-6">
-    {% form_row search_form.username %}
+    {% form_row filter_form.username %}
   </div>
   <div class="col-md-6">
-    {% form_row search_form.email %}
+    {% form_row filter_form.email %}
   </div>
 </div>
 <div class="row">
   <div class="col-md-6">
-    {% form_row search_form.rank %}
+    {% form_row filter_form.rank %}
   </div>
   <div class="col-md-6">
-    {% form_row search_form.role %}
+    {% form_row filter_form.role %}
   </div>
 </div>
 <div class="row">
   <div class="col-md-12">
-    {% form_row search_form.profilefields %}
+    {% form_row filter_form.profilefields %}
   </div>
 </div>
 <div class="row">
   <div class="col-md-6">
-    {% form_row search_form.inactive %}
+    {% form_row filter_form.inactive %}
   </div>
   <div class="col-md-6">
-    {% form_row search_form.disabled %}
+    {% form_row filter_form.disabled %}
   </div>
 </div>
 <div class="row">
   <div class="col-md-6">
-    {% form_row search_form.is_deleting_account %}
+    {% form_row filter_form.is_deleting_account %}
   </div>
   <div class="col-md-6">
-    {% form_row search_form.is_staff %}
+    {% form_row filter_form.is_staff %}
   </div>
 </div>
-{% endblock modal-body %}
+{% endblock filters-modal-body %}

+ 1 - 1
misago/threads/forms.py

@@ -10,7 +10,7 @@ def get_searchable_filetypes():
     return choices
 
 
-class SearchAttachmentsForm(forms.Form):
+class FilterAttachmentsForm(forms.Form):
     uploader = forms.CharField(label=_("Uploader name contains"), required=False)
     filename = forms.CharField(label=_("Filename contains"), required=False)
     filetype = forms.TypedChoiceField(

+ 2 - 4
misago/threads/views/admin/attachments.py

@@ -3,7 +3,7 @@ from django.db import transaction
 from django.utils.translation import gettext_lazy as _
 
 from ....admin.views import generic
-from ...forms import SearchAttachmentsForm
+from ...forms import FilterAttachmentsForm
 from ...models import Attachment, Post
 
 
@@ -41,9 +41,7 @@ class AttachmentsList(AttachmentAdmin, generic.ListView):
             "is_atomic": False,
         }
     ]
-
-    def get_search_form(self, request):
-        return SearchAttachmentsForm
+    filter_form = FilterAttachmentsForm
 
     def action_delete(self, request, attachments):
         deleted_attachments = []

+ 7 - 9
misago/users/forms/admin.py

@@ -307,7 +307,7 @@ def EditUserFormFactory(
     return FormType
 
 
-class BaseSearchUsersForm(forms.Form):
+class BaseFilterUsersForm(forms.Form):
     username = forms.CharField(label=_("Username starts with"), required=False)
     email = forms.CharField(label=_("E-mail starts with"), required=False)
     profilefields = forms.CharField(label=_("Profile fields contain"), required=False)
@@ -351,7 +351,7 @@ class BaseSearchUsersForm(forms.Form):
         return queryset
 
 
-def create_search_users_form():
+def create_filter_users_form():
     """
     Factory that uses cache for ranks and roles,
     and makes those ranks and roles typed choice fields that play nice
@@ -374,7 +374,7 @@ def create_search_users_form():
         ),
     }
 
-    return type("SearchUsersForm", (BaseSearchUsersForm,), extra_fields)
+    return type("FilterUsersForm", (BaseFilterUsersForm,), extra_fields)
 
 
 class RankForm(forms.ModelForm):
@@ -568,7 +568,7 @@ class BanForm(forms.ModelForm):
         return data
 
 
-class SearchBansForm(forms.Form):
+class FilterBansForm(forms.Form):
     check_type = forms.ChoiceField(
         label=_("Type"),
         required=False,
@@ -591,8 +591,7 @@ class SearchBansForm(forms.Form):
         choices=[("", _("Any")), ("used", _("Active")), ("unused", _("Expired"))],
     )
 
-    def filter_queryset(self, search_criteria, queryset):
-        criteria = search_criteria
+    def filter_queryset(self, criteria, queryset):
         if criteria.get("check_type") == "names":
             queryset = queryset.filter(check_type=0)
 
@@ -668,15 +667,14 @@ class RequestDataDownloadsForm(forms.Form):
         return data
 
 
-class SearchDataDownloadsForm(forms.Form):
+class FilterDataDownloadsForm(forms.Form):
     status = forms.ChoiceField(
         label=_("Status"), required=False, choices=DataDownload.STATUS_CHOICES
     )
     user = forms.CharField(label=_("User"), required=False)
     requested_by = forms.CharField(label=_("Requested by"), required=False)
 
-    def filter_queryset(self, search_criteria, queryset):
-        criteria = search_criteria
+    def filter_queryset(self, criteria, queryset):
         if criteria.get("status") is not None:
             queryset = queryset.filter(status=criteria["status"])
 

+ 7 - 7
misago/users/tests/test_useradmin_views.py

@@ -33,8 +33,8 @@ class UserAdminViewsTests(AdminTestCase):
         self.assertEqual(response.status_code, 200)
         self.assertContains(response, self.user.username)
 
-    def test_list_search(self):
-        """users list is searchable"""
+    def test_list_filtering(self):
+        """users list can be filtered"""
         response = self.client.get(reverse("misago:admin:users:accounts:index"))
         self.assertEqual(response.status_code, 302)
 
@@ -46,25 +46,25 @@ class UserAdminViewsTests(AdminTestCase):
         user_b = create_test_user("Tyrion", "t321@test.com")
         user_c = create_test_user("Karen", "t432@test.com")
 
-        # Search both
+        # Partial search for "tyr" returns both "tyrael" and "tyrion"
         response = self.client.get("%s&username=tyr" % link_base)
         self.assertEqual(response.status_code, 200)
         self.assertContains(response, user_a.username)
         self.assertContains(response, user_b.username)
 
-        # Search tyrion
+        # Search for "tyrion" returns it only
         response = self.client.get("%s&username=tyrion" % link_base)
         self.assertEqual(response.status_code, 200)
         self.assertNotContains(response, user_a.username)
         self.assertContains(response, user_b.username)
 
-        # Search tyrael
+        # Search for "tyrael" returns it only
         response = self.client.get("%s&email=t123@test.com" % link_base)
         self.assertEqual(response.status_code, 200)
         self.assertContains(response, user_a.username)
         self.assertNotContains(response, user_b.username)
 
-        # Search disabled
+        # Search for disabled user
         user_c.is_active = False
         user_c.save()
 
@@ -74,7 +74,7 @@ class UserAdminViewsTests(AdminTestCase):
         self.assertNotContains(response, user_b.username)
         self.assertContains(response, user_c.username)
 
-        # Search requested own account delete
+        # Search for requested own account delete
         user_c.is_deleting_account = True
         user_c.save()
 

+ 2 - 2
misago/users/views/admin/bans.py

@@ -2,7 +2,7 @@ from django.contrib import messages
 from django.utils.translation import gettext_lazy as _
 
 from ....admin.views import generic
-from ...forms.admin import BanForm, SearchBansForm
+from ...forms.admin import BanForm, FilterBansForm
 from ...models import Ban
 
 
@@ -26,7 +26,7 @@ class BansList(BanAdmin, generic.ListView):
         ("banned_value", _("A to z")),
         ("-banned_value", _("Z to a")),
     ]
-    search_form = SearchBansForm
+    filter_form = FilterBansForm
     selection_label = _("With bans: 0")
     empty_selection_label = _("Select bans")
     mass_actions = (

+ 2 - 4
misago/users/views/admin/datadownloads.py

@@ -7,7 +7,7 @@ from ...datadownloads import (
     request_user_data_download,
     user_has_data_download_request,
 )
-from ...forms.admin import RequestDataDownloadsForm, SearchDataDownloadsForm
+from ...forms.admin import RequestDataDownloadsForm, FilterDataDownloadsForm
 from ...models import DataDownload
 
 
@@ -40,14 +40,12 @@ class DataDownloadsList(DataDownloadAdmin, generic.ListView):
             ),
         },
     ]
+    filter_form = FilterDataDownloadsForm
 
     def get_queryset(self):
         qs = super().get_queryset()
         return qs.select_related("user", "requester")
 
-    def get_search_form(self, request):
-        return SearchDataDownloadsForm
-
     def action_expire(self, request, data_downloads):
         for data_download in data_downloads:
             expire_user_data_download(data_download)

+ 3 - 3
misago/users/views/admin/users.py

@@ -19,7 +19,7 @@ from ...forms.admin import (
     EditUserForm,
     EditUserFormFactory,
     NewUserForm,
-    create_search_users_form,
+    create_filter_users_form,
 )
 from ...models import Ban
 from ...profilefields import profilefields
@@ -101,8 +101,8 @@ class UsersList(UserAdmin, generic.ListView):
         qs = super().get_queryset()
         return qs.select_related("rank")
 
-    def get_search_form(self, request):
-        return create_search_users_form()
+    def get_filter_form(self, request):
+        return create_filter_users_form()
 
     def action_activate(self, request, users):
         inactive_users = []