From f2de1a673e0686e5d8f03700a64bedef7ccb0ff3 Mon Sep 17 00:00:00 2001 From: Étienne Loks Date: Fri, 3 Feb 2017 20:08:22 +0100 Subject: Admin: add basic tests for general types --- ishtar_common/tests.py | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) (limited to 'ishtar_common/tests.py') diff --git a/ishtar_common/tests.py b/ishtar_common/tests.py index 90fc3f0f5..458083ac3 100644 --- a/ishtar_common/tests.py +++ b/ishtar_common/tests.py @@ -260,6 +260,52 @@ class CacheTest(TestCase): self.assertFalse('testy' in types) +class AdminGenTypeTest(TestCase): + fixtures = [settings.ROOT_PATH + + '../fixtures/initial_data-auth-fr.json', + settings.ROOT_PATH + + '../ishtar_common/fixtures/initial_data-fr.json', + settings.ROOT_PATH + + '../ishtar_common/fixtures/initial_spatialrefsystem-fr.json', + settings.ROOT_PATH + + '../ishtar_common/fixtures/initial_importtypes-fr.json', + settings.ROOT_PATH + + '../archaeological_operations/fixtures/initial_data-fr.json'] + models = [models.OrganizationType, models.PersonType, models.TitleType, + models.AuthorType, models.SourceType, models.OperationType, + models.SpatialReferenceSystem] + # models.Format, models.SupportType -- need fixtures + module_name = 'ishtar_common' + + def setUp(self): + password = 'mypassword' + my_admin = User.objects.create_superuser( + 'myuser', 'myemail@test.com', password) + self.client = Client() + self.client.login(username=my_admin.username, password=password) + + def test_listing_and_detail(self): + for model in self.models: + # quick test to verify basic access to listing + base_url = '/admin/{}/{}/'.format(self.module_name, + model.__name__.lower()) + url = base_url + response = self.client.get(url) + self.assertEqual( + response.status_code, 200, + msg="Can not access admin list for {}.".format(model)) + url = base_url + "{}/".format(model.objects.all()[0].pk) + response = self.client.get(url) + self.assertEqual( + response.status_code, 200, + msg="Can not access admin detail for {}.".format(model)) + + def test_str(self): + # test __str__ + for model in self.models: + self.assertTrue(str(model.objects.all()[0])) + + class MergeTest(TestCase): def setUp(self): self.user, created = User.objects.get_or_create(username='username') -- cgit v1.2.3 From 22876892d057f11be2c29c7ca26bfbaa6e3d8e61 Mon Sep 17 00:00:00 2001 From: Étienne Loks Date: Fri, 3 Feb 2017 20:13:55 +0100 Subject: Admin: add CSV export to general types --- ishtar_common/admin.py | 42 ++++++++++++++++++++++++++++++++++++++++-- ishtar_common/tests.py | 9 +++++++++ 2 files changed, 49 insertions(+), 2 deletions(-) (limited to 'ishtar_common/tests.py') 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: -- cgit v1.2.3