]> git.0d.be Git - django-panik-nonstop.git/commitdiff
add filtering on artists list view
authorFrédéric Péters <fpeters@0d.be>
Sun, 27 Aug 2023 12:29:37 +0000 (14:29 +0200)
committerFrédéric Péters <fpeters@0d.be>
Sun, 27 Aug 2023 12:35:32 +0000 (14:35 +0200)
nonstop/forms.py
nonstop/templates/nonstop/artist_list.html
nonstop/views.py

index 594a5112b8c93c42f076cc9ef0dcbf6f7dab39d0..2fc4d9299f0782ebdb3b3da0b8e8842129f955b9 100644 (file)
@@ -17,7 +17,7 @@ def get_optional_nonstop_zones():
 
 def get_search_nonstop_zones():
     return (
-        [('', ''), ('any', _('Any zone')), ('', '--------------')]
+        [('', ''), ('any', _('Any zone')), ('active', _('Active zones')), ('', '--------------')]
         + get_nonstop_zones()
         + [('', '--------------'), ('none', _('None'))]
     )
@@ -211,3 +211,8 @@ class RecurringDeleteForm(forms.Form):
 class RecurringStreamForm(forms.Form):
     jingle = forms.ChoiceField(label=_('Jingle'), choices=get_optional_jingle_choices, required=False)
     stream = forms.ChoiceField(label=_('Stream'), choices=get_stream_choices, required=True)
+
+
+class ArtistSearchForm(forms.Form):
+    q = forms.CharField(label=_('Name'), required=False)
+    zone = forms.ChoiceField(label=_('Nonstop Zone'), choices=get_search_nonstop_zones, required=False)
index f419290c653b3be404f0a0faeeada14c5abaf030..34c55476dbce16820251507e053078f6f54ddfcd 100644 (file)
 
 {% block content %}
 
+  <form id="artist-search">
+    {{ form.as_p }}
+    <button>{% trans 'Filter' context "action" %}</button>
+  </form>
+
   <div class="section">
     <ul class="artists-list">
       {% for artist in object_list %}
index 730f12a2dab39230f86b0940e8d398bfe32bd046..9b943aaa91d1b44a65f0a4f45f7f433a2d1f435d 100644 (file)
@@ -32,6 +32,7 @@ from . import utils
 from .app_settings import app_settings
 from .forms import (
     ArtistForm,
+    ArtistSearchForm,
     CleanupForm,
     RecurringDeleteForm,
     RecurringPlaylistAddForm,
@@ -245,6 +246,40 @@ class ArtistDetailView(DetailView):
 class ArtistListView(ListView):
     model = Artist
 
+    def get_queryset(self):
+        qs = super().get_queryset()
+        if self.request.GET.get('q'):
+            for part in self.request.GET.get('q').split():
+                part = part.strip()
+                if not part:
+                    continue
+                qs = qs.filter(name__icontains=part)
+
+        zone = self.request.GET.get('zone')
+        if zone:
+            from emissions.models import Nonstop
+
+            if zone == 'none':
+                qs = qs.filter(track__nonstop_zones=None)
+            elif zone == 'any':
+                qs = qs.filter(track__nonstop_zones__isnull=False).distinct()
+            elif zone == 'active':
+                active_zones = []
+                for z in Nonstop.objects.all():
+                    if z.start != z.end:
+                        active_zones.append(z.id)
+                        active_zones.extend([x['id'] for x in z.extra_zones.values('id')])
+                qs = qs.filter(track__nonstop_zones__in=active_zones)
+            else:
+                qs = qs.filter(track__nonstop_zones=zone)
+
+        return qs
+
+    def get_context_data(self, **kwargs):
+        context = super().get_context_data(**kwargs)
+        context['form'] = ArtistSearchForm(self.request.GET)
+        return context
+
 
 class ArtistEditView(FormView):
     form_class = ArtistForm
@@ -677,6 +712,13 @@ class SearchView(TemplateView):
                 queryset = queryset.filter(nonstop_zones=None)
             elif zone == 'any':
                 queryset = queryset.filter(nonstop_zones__isnull=False).distinct()
+            elif zone == 'active':
+                active_zones = []
+                for z in Nonstop.objects.all():
+                    if z.start != z.end:
+                        active_zones.append(z.id)
+                        active_zones.extend([x['id'] for x in z.extra_zones.values('id')])
+                queryset = queryset.filter(nonstop_zones__in=active_zones)
             else:
                 queryset = queryset.filter(nonstop_zones=zone)