app/soc/views/models/base.py
changeset 1806 d321d5123928
parent 1805 7204ec5ead23
child 1809 66aec0241d61
equal deleted inserted replaced
1805:7204ec5ead23 1806:d321d5123928
    21   '"Sverre Rabbelier" <sverre@rabbelier.nl>',
    21   '"Sverre Rabbelier" <sverre@rabbelier.nl>',
    22   '"Lennard de Rijk" <ljvderijk@gmail.com>',
    22   '"Lennard de Rijk" <ljvderijk@gmail.com>',
    23   '"Pawel Solyga" <pawel.solyga@gmail.com>',
    23   '"Pawel Solyga" <pawel.solyga@gmail.com>',
    24   ]
    24   ]
    25 
    25 
       
    26 
       
    27 import csv
       
    28 import StringIO
       
    29 
    26 from google.appengine.ext import db
    30 from google.appengine.ext import db
    27 
    31 
    28 from django import http
    32 from django import http
    29 from django.utils import simplejson
    33 from django.utils import simplejson
    30 from django.utils.translation import ugettext
    34 from django.utils.translation import ugettext
   510     return self._list(request, params, contents, page_name)
   514     return self._list(request, params, contents, page_name)
   511 
   515 
   512   def _list(self, request, params, contents, page_name, context=None):
   516   def _list(self, request, params, contents, page_name, context=None):
   513     """Returns the list page for the specified contents.
   517     """Returns the list page for the specified contents.
   514 
   518 
       
   519     If the export parameter is present in request.GET a csv export of
       
   520     the specified list is returned instead, see csv().
       
   521 
   515     Args:
   522     Args:
   516       request: the standard Django HTTP request object
   523       request: the standard Django HTTP request object
   517       params: a dict with params for this View
   524       params: a dict with params for this View
   518       contents: a list of content dicts
   525       contents: a list of content dicts
   519       page_name: the page name displayed in templates as page and header title
   526       page_name: the page name displayed in templates as page and header title
   526         the entity_type_plural value in the context so that the
   533         the entity_type_plural value in the context so that the
   527         template can refer to it.
   534         template can refer to it.
   528       list_template: The list_template value is used as template for
   535       list_template: The list_template value is used as template for
   529         to display the list of all entities for this View.
   536         to display the list of all entities for this View.
   530     """
   537     """
       
   538 
       
   539     try:
       
   540       export = int(request.GET.get('export', -1))
       
   541       export = export if export >= 0 else None
       
   542     except ValueError:
       
   543       export = None
       
   544 
       
   545     if export is not None and export < len(contents):
       
   546       content = contents[export]
       
   547       key_order = content.get('key_order')
       
   548 
       
   549       data = [i.toDict() for i in content['data']]
       
   550 
       
   551       if not key_order:
       
   552         data = [i.values() for i in data]
       
   553 
       
   554       filename = "export_%d" % export
       
   555       return self.csv(request, data, filename, params, key_order)
   531 
   556 
   532     context = dicts.merge(context,
   557     context = dicts.merge(context,
   533         helper.responses.getUniversalContext(request))
   558         helper.responses.getUniversalContext(request))
   534     helper.responses.useJavaScript(context, params['js_uses_all'])
   559     helper.responses.useJavaScript(context, params['js_uses_all'])
   535     context['page_name'] = page_name
   560     context['page_name'] = page_name
   703     # if the browser supports HTTP/1.0
   728     # if the browser supports HTTP/1.0
   704     response['Pragma'] = 'no-cache'
   729     response['Pragma'] = 'no-cache'
   705 
   730 
   706     return response
   731     return response
   707 
   732 
       
   733   def csv(self, request, data, filename, params, key_order=None):
       
   734     """Returns data as a csv file
       
   735 
       
   736     If key_order is set data should be a sequence of dicts, otherwise
       
   737     data should be a sequence of lists,s ee csv.writer and
       
   738     csv.DictWriter for more information.
       
   739     """
       
   740 
       
   741     params = params.copy()
       
   742     params['export_extension'] = '.csv'
       
   743     fieldnames = params['csv_fieldnames']
       
   744 
       
   745     f = StringIO.StringIO()
       
   746 
       
   747     if key_order:
       
   748       writer = csv.DictWriter(f, key_order, dialect='excel')
       
   749     else:
       
   750       writer = csv.writer(f, dialect='excel')
       
   751 
       
   752     writer.writerows(data)
       
   753 
       
   754     data = f.getvalue()
       
   755 
       
   756     return self.download(request, data, filename, params)
       
   757 
   708   def _editPost(self, request, entity, fields):
   758   def _editPost(self, request, entity, fields):
   709     """Performs any required processing on the entity to post its edit page.
   759     """Performs any required processing on the entity to post its edit page.
   710 
   760 
   711     Args:
   761     Args:
   712       request: the django request object
   762       request: the django request object