summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
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
commit22876892d057f11be2c29c7ca26bfbaa6e3d8e61 (patch)
tree5409c36417d3d15381f9f58ed4eaca69556bad68
parentf2de1a673e0686e5d8f03700a64bedef7ccb0ff3 (diff)
downloadIshtar-22876892d057f11be2c29c7ca26bfbaa6e3d8e61.tar.bz2
Ishtar-22876892d057f11be2c29c7ca26bfbaa6e3d8e61.zip
Admin: add CSV export to general types
-rw-r--r--ishtar_common/admin.py42
-rw-r--r--ishtar_common/tests.py9
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: