From 4e08ad3d1bbb0c57862856f293cc5f51ab613400 Mon Sep 17 00:00:00 2001 From: Andrew Williams Date: Sat, 24 Dec 2011 01:12:08 +0000 Subject: [PATCH] Moved EVE API views into their own module, added some CSV mixins --- app/eve_api/views/__init__.py | 1 + app/eve_api/{views.py => views/base.py} | 0 app/eve_api/views/mixins.py | 62 +++++++++++++++++++++++++ 3 files changed, 63 insertions(+) create mode 100644 app/eve_api/views/__init__.py rename app/eve_api/{views.py => views/base.py} (100%) create mode 100644 app/eve_api/views/mixins.py diff --git a/app/eve_api/views/__init__.py b/app/eve_api/views/__init__.py new file mode 100644 index 0000000..0cb7498 --- /dev/null +++ b/app/eve_api/views/__init__.py @@ -0,0 +1 @@ +from eve_api.views.base import * diff --git a/app/eve_api/views.py b/app/eve_api/views/base.py similarity index 100% rename from app/eve_api/views.py rename to app/eve_api/views/base.py diff --git a/app/eve_api/views/mixins.py b/app/eve_api/views/mixins.py new file mode 100644 index 0000000..8d649e1 --- /dev/null +++ b/app/eve_api/views/mixins.py @@ -0,0 +1,62 @@ +import csv +import codecs + +from django.core.exceptions import ImproperlyConfigured +from django.http import HttpResponse +from django.views.generic.list import MultipleObjectMixin + + +class CSVResponseMixin(object): + + def get_csv_headers(self): + self.data = self.get_csv_data() + if not len(self.data): + raise ImproperlyConfigured("No data returned, so we're unable to create the header row") + return [x for x in self.data[0].keys()] + + def get_csv_data(self): + return getattr(self, 'csv_data', []) + + def get_dialect(self): + return getattr(self, 'dialect', csv.excel) + + def get_charset(self): + charset = getattr(self, 'charset', 'windows-1252') + try: + codecs.lookup(charset) + except LookupError: + raise ImproperlyConfigured("Invalid output characterset (%s) provided" % charset) + return charset + + def get_filename(self): + return getattr(self, 'csv_filename', 'output.csv') + + def get(self, request, *args, **kwargs): + # Initial setup + charset = self.get_charset() + response = HttpResponse(mimetype='text/csv; charset=%s' % charset) + response['Content-Disposition'] = 'attachment; filename=%s' % self.get_filename() + + w = csv.writer(response, self.get_dialect()) + + # Headings + headings = [unicode(c).encode(charset, 'replace') for c in self.get_csv_headers()] + w.writerow(headings) + + # Rows + for row in self.data: + row = [unicode(c).encode(charset, 'replace') for c in row.values()] + w.writerow(row) + + # Done + return response + + +class MultipleObjectCSVResponseMixin(CSVResponseMixin, MultipleObjectMixin): + + def get_filename(self): + return '%s.csv' % self.model.__name__ + + def get_csv_data(self): + return self.queryset.all().values() +