diff options
author | Étienne Loks <etienne.loks@iggdrasil.net> | 2017-02-03 20:13:55 +0100 |
---|---|---|
committer | Étienne Loks <etienne.loks@iggdrasil.net> | 2017-02-03 20:14:17 +0100 |
commit | 22876892d057f11be2c29c7ca26bfbaa6e3d8e61 (patch) | |
tree | 5409c36417d3d15381f9f58ed4eaca69556bad68 | |
parent | f2de1a673e0686e5d8f03700a64bedef7ccb0ff3 (diff) | |
download | Ishtar-22876892d057f11be2c29c7ca26bfbaa6e3d8e61.tar.bz2 Ishtar-22876892d057f11be2c29c7ca26bfbaa6e3d8e61.zip |
Admin: add CSV export to general types
-rw-r--r-- | ishtar_common/admin.py | 42 | ||||
-rw-r--r-- | ishtar_common/tests.py | 9 |
2 files changed, 49 insertions, 2 deletions
diff --git a/ishtar_common/admin.py b/ishtar_common/admin.py index e19583c85..7b671caae 100644 --- a/ishtar_common/admin.py +++ b/ishtar_common/admin.py @@ -26,10 +26,11 @@ from django.conf import settings from django.contrib import admin from django.contrib.auth.admin import GroupAdmin from django.contrib.auth.models import Group -from django.http import HttpResponseRedirect +from django.http import HttpResponseRedirect, HttpResponse from django.shortcuts import render_to_response from django.template import RequestContext from django.template.defaultfilters import slugify +from django.utils.translation import ugettext_lazy as _, ugettext from django import forms @@ -75,6 +76,43 @@ def gen_import_generic(self, request, queryset): gen_import_generic.short_description = "Import from a CSV file" +def export_as_csv_action(description=_(u"Export selected as CSV file"), + fields=None, exclude=None, header=True): + """ + This function returns an export csv action + 'fields' and 'exclude' work like in django ModelForm + 'header' is whether or not to output the column names as the first row + """ + def export_as_csv(modeladmin, request, queryset): + """ + Generic csv export admin action. + based on http://djangosnippets.org/snippets/1697/ + """ + opts = modeladmin.model._meta + field_names = set([field.name for field in opts.fields]) + if fields: + fieldset = set(fields) + field_names = field_names & fieldset + elif exclude: + excludeset = set(exclude) + field_names = field_names - excludeset + + response = HttpResponse(mimetype='text/csv') + response['Content-Disposition'] = 'attachment; filename=%s.csv' % \ + unicode(opts).replace('.', '_') + + writer = csv.writer(response) + if header: + writer.writerow(list(field_names)) + for obj in queryset: + writer.writerow([ + unicode(getattr(obj, field)).encode("utf-8", "replace") + for field in field_names]) + return response + export_as_csv.short_description = description + return export_as_csv + + class HistorizedObjectAdmin(admin.ModelAdmin): readonly_fields = ('history_modifier',) @@ -163,7 +201,7 @@ admin.site.register(models.GlobalVar, GlobalVarAdmin) class GeneralTypeAdmin(admin.ModelAdmin): list_display = ['label', 'txt_idx', 'available', 'comment'] - actions = ['import_generic'] + actions = ['import_generic', export_as_csv_action()] import_generic = gen_import_generic diff --git a/ishtar_common/tests.py b/ishtar_common/tests.py index 458083ac3..0082624d7 100644 --- a/ishtar_common/tests.py +++ b/ishtar_common/tests.py @@ -300,6 +300,15 @@ class AdminGenTypeTest(TestCase): response.status_code, 200, msg="Can not access admin detail for {}.".format(model)) + def test_csv_export(self): + for model in self.models: + url = '/admin/{}/{}/'.format(self.module_name, + model.__name__.lower()) + response = self.client.post(url, {'action': 'export_as_csv'}) + self.assertEqual( + response.status_code, 200, + msg="Can not export as CSV for {}.".format(model)) + def test_str(self): # test __str__ for model in self.models: |