diff options
| -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: | 
