class ArtistSearchForm(forms.Form):
q = forms.CharField(label=_('Name'), required=False)
zone = forms.ChoiceField(label=_('Nonstop Zone'), choices=get_search_nonstop_zones, required=False)
+
+
+class TracksAddToZoneForm(forms.Form):
+ zone = forms.ChoiceField(label=_('Nonstop Zone'), choices=get_nonstop_zones, required=True)
StreamsListView,
TrackDetailView,
TrackEditView,
+ TracksAddToZoneView,
UploadTracksView,
ZoneAddView,
ZoneDeleteView,
),
path('search/', SearchView.as_view(), name='nonstop-search'),
path('search/csv', SearchCsvView.as_view(), name='nonstop-search-csv'),
+ path('search/add-to-zone', TracksAddToZoneView.as_view(), name='nonstop-search-add-to-zone'),
path('quick-links/', RedirectView.as_view(url=reverse_lazy('nonstop-quick-links'))),
path('cleanup/', CleanupView.as_view(), name='nonstop-cleanup'),
path('force-switch/', force_switch_view, name='nonstop-force-switch'),
import os
import subprocess
import tempfile
+import urllib.parse
from io import StringIO
import mutagen
RecurringStreamForm,
TrackArtistTitleForm,
TrackMetaForm,
+ TracksAddToZoneForm,
TrackSearchForm,
UploadTracksForm,
ZoneSettingsForm,
class SearchView(TemplateView):
template_name = 'nonstop/search.html'
- def get_queryset(self):
+ @classmethod
+ def get_search_queryset(cls, q=None, zone=None):
queryset = Track.objects.all()
- q = self.request.GET.get('q')
if q:
queryset = queryset.filter(Q(title__icontains=q.lower()) | Q(artist__name__icontains=q.lower()))
- zone = self.request.GET.get('zone')
if zone:
from emissions.models import Nonstop
else:
queryset = queryset.filter(nonstop_zones=zone).distinct()
+ return queryset
+
+ def get_queryset(self):
+ queryset = self.get_search_queryset(q=self.request.GET.get('q'), zone=self.request.GET.get('zone'))
order = self.request.GET.get('order_by') or 'title'
if order:
if 'added_to_nonstop_timestamp' in order:
return HttpResponse(out.getvalue(), content_type='text/csv; charset=utf-8')
+class TracksAddToZoneView(FormView):
+ form_class = TracksAddToZoneForm
+ template_name = 'nonstop/search-add-to-zone.html'
+
+ def get_context_data(self, **kwargs):
+ ctx = super().get_context_data(**kwargs)
+ qs = self.request.GET.copy()
+ ctx['qs'] = qs.urlencode()
+ return ctx
+
+ def form_valid(self, form):
+ assert self.request.user.has_perm('nonstop.add_track')
+ add_to_zone = Nonstop.objects.get(id=form.cleaned_data['zone'])
+ query_string = dict(urllib.parse.parse_qs(self.request.POST['qs']))
+ q = query_string['q'][0] if query_string.get('q') else None
+ zone = query_string['zone'][0] if query_string.get('zone') else None
+ for track in SearchView.get_search_queryset(q=q, zone=zone):
+ track.nonstop_zones.add(add_to_zone)
+ return super().form_valid(form)
+
+ def get_success_url(self):
+ return reverse('nonstop-search') + '?' + self.request.POST['qs']
+
+
class CleanupView(TemplateView):
template_name = 'nonstop/cleanup.html'