csv export: support for bools and lists
[edumed.git] / contact / admin.py
index bb43881..0a0aaa0 100644 (file)
@@ -1,13 +1,15 @@
 # -*- coding: utf-8 -*-
+import csv
+
 from django.contrib import admin
-from .models import Contact
 from django.utils.translation import ugettext as _
-from .forms import contact_forms, admin_list_width
 from django.utils.safestring import mark_safe
 from django.conf.urls import patterns, url
 from django.http import HttpResponse, Http404
 
-from .utils import csv_prepare
+from edumed.utils import UnicodeCSVWriter
+from .forms import contact_forms, admin_list_width
+from .models import Contact
 
 
 class ContactAdminMeta(admin.ModelAdmin.__class__):
@@ -41,7 +43,7 @@ class ContactAdmin(admin.ModelAdmin):
             return lambda obj: self.admin_list(obj, nr)
         raise AttributeError(name)
 
-    def change_view(self, request, object_id, from_url='', extra_context=None):
+    def change_view(self, request, object_id, form_url='', extra_context=None):
         if object_id:
             try:
                 instance = Contact.objects.get(pk=object_id)
@@ -92,7 +94,7 @@ class ContactAdmin(admin.ModelAdmin):
                     f.short_description = orig_fields[k].label if k in orig_fields else _(k)
                     setattr(self, "body__%s" % k, f)
         return super(ContactAdmin, self).change_view(
-            request, object_id, from_url=from_url, extra_context=extra_context)
+            request, object_id, form_url=form_url, extra_context=extra_context)
 
     def changelist_view(self, request, extra_context=None):
         context = dict()
@@ -114,7 +116,6 @@ class ContactAdmin(admin.ModelAdmin):
 
 
 def extract_view(request, form_tag, extract_type_slug):
-    toret = u''
     contacts_by_spec = dict()
     form = contact_forms.get(form_tag)
     if form is None and extract_type_slug not in ('contacts', 'all'):
@@ -137,10 +138,13 @@ def extract_view(request, form_tag, extract_type_slug):
         else:
             keys = form.get_extract_fields(contact, extract_type_slug)
         contacts_by_spec.setdefault(tuple(keys), []).append(contact)
-    
+
+    response = HttpResponse(content_type='text/csv')
+    csv_writer = UnicodeCSVWriter(response)
+
     # Generate list for each body key set
     for keys, contacts in contacts_by_spec.items():
-        toret += u','.join(keys) + '\n'
+        csv_writer.writerow(keys)
         for contact in contacts:
             if extract_type_slug == 'contacts':
                 records = [dict(contact=contact.contact)]
@@ -153,11 +157,14 @@ def extract_view(request, form_tag, extract_type_slug):
                 for key in keys:
                     if key not in record:
                         record[key] = ''
-                    record[key] = csv_prepare(record[key])
-                toret += u','.join([record[key] for key in keys]) + '\n'
-        toret += '\n\n'
+                    if isinstance(record[key], bool):
+                        record[key] = 'tak' if record[key] else 'nie'
+                    if isinstance(record[key], (list, tuple)):
+                        record[key] = '; '.join(record[key])
+
+                csv_writer.writerow([record[key] for key in keys])
+        csv_writer.writerow([])
 
-    response = HttpResponse(toret, content_type='text/csv')
     response['Content-Disposition'] = 'attachment; filename="kontakt.csv"'
     return response