diff options
author | Étienne Loks <etienne.loks@iggdrasil.net> | 2019-08-12 23:56:05 +0200 |
---|---|---|
committer | Étienne Loks <etienne.loks@iggdrasil.net> | 2019-08-12 23:56:05 +0200 |
commit | 00d0be457177da30ee5c83456e0ffac58aed497a (patch) | |
tree | 283d995b3b366d74953ab03d356b62a4a230aa48 /commcrawler | |
parent | ca70f94db0692180c015bb6fd87c606cc675970c (diff) | |
download | Comm-on-net-00d0be457177da30ee5c83456e0ffac58aed497a.tar.bz2 Comm-on-net-00d0be457177da30ee5c83456e0ffac58aed497a.zip |
Admin: export results as CSV
Diffstat (limited to 'commcrawler')
-rw-r--r-- | commcrawler/admin.py | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/commcrawler/admin.py b/commcrawler/admin.py index e475325..6a72e41 100644 --- a/commcrawler/admin.py +++ b/commcrawler/admin.py @@ -1,3 +1,4 @@ +import csv import json from pygments import highlight @@ -6,6 +7,7 @@ from pygments.formatters.html import HtmlFormatter from ajax_select import make_ajax_form from django.contrib import admin +from django.http import HttpResponse from django.utils.translation import ugettext_lazy as _ from django.utils.safestring import mark_safe @@ -13,6 +15,41 @@ from commonnet.admin_site import admin_site from commcrawler import models +def export_as_csv_action(field_names, + description=_("Export selected as CSV file"), + header=True): + def export_as_csv(modeladmin, request, queryset): + """ + Generic csv export admin action. + based on http://djangosnippets.org/snippets/1697/ + """ + opts = modeladmin.model._meta + + response = HttpResponse(content_type='text/csv') + response['Content-Disposition'] = 'attachment; filename=%s.csv' % \ + str(opts).replace('.', '_') + + writer = csv.writer(response) + if header: + writer.writerow(list(field_names)) + for obj in queryset.values(*field_names).order_by('pk'): + row = [] + for field in field_names: + value = obj[field] + if value is None: + value = "" + else: + value = str(value) + row.append(value) + + writer.writerow(row) + return response + export_as_csv.short_description = description + return export_as_csv + + + + class CrawlAdmin(admin.ModelAdmin): model = models.Crawl list_display = ("name", "status", "target_nb", "created", "started", @@ -48,6 +85,16 @@ class CrawlResultAdmin(admin.ModelAdmin): ) exclude = ("crawl_result",) form = make_ajax_form(model, {'target': 'target'}) + actions = [ + export_as_csv_action( + ("target_id", "target__name", "target__url", "nb_external_link", + "nb_internal_link", "nb_images", "nb_facebook", "nb_twitter", + "nb_instagram", "nb_youtube", "nb_dailymotion", "nb_vimeo", + "nb_video", "nb_audio", "nb_internal_pdf", "nb_external_pdf", + "nb_internal_office", "nb_external_office", "is_online", + "redirection") + ) + ] def open_link(self, obj): url = obj.url() @@ -74,6 +121,11 @@ class CrawlRelationAdmin(admin.ModelAdmin): list_filter = ("crawl",) search_fields = ["source__name", "destination__name"] form = make_ajax_form(model, {'source': 'target', 'destination': 'target'}) + actions = [ + export_as_csv_action( + ("source_id", "destination_id", "number") + ) + ] admin_site.register(models.CrawlRelation, CrawlRelationAdmin) |