]> git.0d.be Git - django-panik-nonstop.git/commitdiff
add csv download field to search results
authorFrédéric Péters <fpeters@0d.be>
Mon, 5 Feb 2018 13:30:43 +0000 (14:30 +0100)
committerFrédéric Péters <fpeters@0d.be>
Mon, 5 Feb 2018 13:30:43 +0000 (14:30 +0100)
nonstop/templates/nonstop/search.html
nonstop/urls.py
nonstop/views.py

index 72d1163d737ca61e5e5e8fde81d9bb61aff1f390..7ce6adf62a2e7b85e2c23e0816538791c09ac1f4 100644 (file)
@@ -42,6 +42,9 @@
             <a href="?{{ qs }}&page={{ tracks.next_page_number }}">→</a>
         {% endif %}
     </span>
+    <span class="download">
+      <a href="csv?{{ qs }}" download="nonstop.csv">CSV</a>
+    </span>
 </div>
 {% endif %}
 
index 34b1d01269979cbe364c04af18644d25da810076..a17d5715cb44023d7277f9d6a66332d27456c67d 100644 (file)
@@ -1,6 +1,6 @@
 from django.conf.urls import url
 
-from .views import SomaDayArchiveView, SomaDayArchiveCsvView, RedirectTodayView, TrackDetailView, ArtistDetailView, ArtistListView, StatisticsView, UploadTracksView, RecentTracksView, QuickLinksView, SearchView, CleanupView
+from .views import SomaDayArchiveView, SomaDayArchiveCsvView, RedirectTodayView, TrackDetailView, ArtistDetailView, ArtistListView, StatisticsView, UploadTracksView, RecentTracksView, QuickLinksView, SearchView, CleanupView, SearchCsvView
 
 urlpatterns = [
     # Example: /2012/nov/10/
@@ -19,6 +19,7 @@ urlpatterns = [
     url(r'^upload/$', UploadTracksView.as_view(), name='nonstop-upload-tracks'),
     url(r'^recent/$', RecentTracksView.as_view(), name='nonstop-recent-tracks'),
     url(r'^search/$', SearchView.as_view(), name='nonstop-search'),
+    url(r'^search/csv$', SearchCsvView.as_view(), name='nonstop-search-csv'),
     url(r'^quick-links/$', QuickLinksView.as_view(), name='nonstop-quick-links'),
     url(r'^cleanup/$', CleanupView.as_view(), name='nonstop-cleanup'),
 ]
index 832b3aa14b1884a28ade7e902a92c199b8aa1d70..f89e17cd38adf9f700ea8c5688089095b589d950 100644 (file)
@@ -248,9 +248,7 @@ class QuickLinksView(TemplateView):
 class SearchView(TemplateView):
     template_name = 'nonstop/search.html'
 
-    def get_context_data(self, **kwargs):
-        ctx = super(SearchView, self).get_context_data(**kwargs)
-        ctx['form'] = TrackSearchForm(self.request.GET)
+    def get_queryset(self):
         queryset = Track.objects.all()
 
         q = self.request.GET.get('q')
@@ -267,15 +265,20 @@ class SearchView(TemplateView):
             else:
                 queryset = queryset.filter(nonstop_zones=zone)
 
-        qs = self.request.GET.copy()
-        qs.pop('page', None)
-        ctx['qs'] = qs.urlencode()
-
         order = self.request.GET.get('order_by') or 'title'
         if order:
             if 'added_to_nonstop_timestamp' in order:
                 queryset = queryset.filter(added_to_nonstop_timestamp__isnull=False)
             queryset = queryset.order_by(order)
+        return queryset
+
+    def get_context_data(self, **kwargs):
+        ctx = super(SearchView, self).get_context_data(**kwargs)
+        ctx['form'] = TrackSearchForm(self.request.GET)
+        queryset = self.get_queryset()
+        qs = self.request.GET.copy()
+        qs.pop('page', None)
+        ctx['qs'] = qs.urlencode()
 
         tracks = Paginator(queryset.select_related(), 20)
 
@@ -290,6 +293,22 @@ class SearchView(TemplateView):
         return ctx
 
 
+class SearchCsvView(SearchView):
+    def get(self, request, *args, **kwargs):
+        out = StringIO()
+        writer = csv.writer(out)
+        writer.writerow(['Title', 'Artist', 'Zones', 'Language', 'Instru', 'CFWB'])
+        for track in self.get_queryset():
+            writer.writerow([
+                track.title.encode('utf-8', 'replace') if track.title else 'Inconnu',
+                track.artist.name.encode('utf-8', 'replace') if (track.artist and track.artist.name) else 'Inconnu',
+                ' + '.join([x.title.encode('utf-8') for x in track.nonstop_zones.all()]),
+                track.language or '',
+                track.instru and 'instru' or '',
+                track.cfwb and 'cfwb' or ''])
+        return HttpResponse(out.getvalue(), content_type='text/csv; charset=utf-8')
+
+
 class CleanupView(TemplateView):
     template_name = 'nonstop/cleanup.html'