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 |