diff options
author | Étienne Loks <etienne.loks@peacefrogs.net> | 2011-02-01 14:44:38 +0100 |
---|---|---|
committer | Étienne Loks <etienne.loks@peacefrogs.net> | 2011-02-01 14:44:38 +0100 |
commit | 6e76724c700da8a77cc64c96262c6a685ad5382b (patch) | |
tree | 2f72b6a7238cb9ca83fa7675b3ee27f747a05628 /ishtar/furnitures/views.py | |
parent | 989c625b2b4f580822c0e59146d36e66342accea (diff) | |
download | Ishtar-6e76724c700da8a77cc64c96262c6a685ad5382b.tar.bz2 Ishtar-6e76724c700da8a77cc64c96262c6a685ad5382b.zip |
Better management of CSV files (refs #159) and grids
Diffstat (limited to 'ishtar/furnitures/views.py')
-rw-r--r-- | ishtar/furnitures/views.py | 199 |
1 files changed, 81 insertions, 118 deletions
diff --git a/ishtar/furnitures/views.py b/ishtar/furnitures/views.py index 3b6263517..ec61ad339 100644 --- a/ishtar/furnitures/views.py +++ b/ishtar/furnitures/views.py @@ -25,6 +25,8 @@ import csv import json import datetime +CSV_OPTIONS = {'delimiter':';', 'quotechar':'"', 'quoting':csv.QUOTE_ALL} + from django.http import HttpResponse from django.template import RequestContext from django.shortcuts import render_to_response, redirect @@ -123,65 +125,86 @@ def autocomplete_file(request): for file in files]) return HttpResponse(data, mimetype='text/plain') -def get_file(request, type='json'): - if not type: - type = 'json' - request_keys = {'town':'towns__pk', - 'file_type':'file_type__pk', - 'year':'year', - 'value':'name', - } - dct = {} - for k in request_keys: - q = request.GET.get(k) - if not q: - continue - dct[request_keys[k]] = q - if not dct: - if 'get_file' in request.session: - dct = request.session['get_file'] - elif 'file' in request.session: - dct = {"pk":request.session['file']} +def get_item(model, func_name, default_name): + """ + Generic treatment of tables + """ + def func(request, type='json', **dct): + if not type: + type = 'json' + request_keys = dict([(field.name, + field.name + (hasattr(field, 'rel') and '__pk' or '')) + for field in model._meta.fields]) + dct = {} + for k in request_keys: + q = request.GET.get(k) + if not q: + continue + dct[request_keys[k]] = q if not dct: - return HttpResponse(mimetype='text/plain') - else: - request.session['get_file'] = dct - query = Q(**dct) - files = models.File.objects.filter(query) - q = request.GET.get('sidx') - if q and q in request_keys: - k = request_keys[q] - if k.endswith("__pk"): - k = k[:-len("__pk")] + "__label" - q = request.GET.get('sord') - sign = q and q == u'desc' and "-" or '' - if k == "name": - files = files.order_by(sign + 'year').order_by( - sign + 'numeric_reference') + if func_name in request.session: + dct = request.session[func_name] + elif default_name in request.session: + dct = {"pk":request.session[default_name]} + if not dct: + return HttpResponse(mimetype='text/plain') else: - files = files.order_by(sign + k) - data = None - if type == "json": - data = json.dumps({ - "records":len(files), - "rows":[{"id":unicode(fle.pk), - "cell":(unicode(fle.pk), unicode(fle), - unicode(fle.file_type), unicode(fle.year))} - for fle in files] - }) - return HttpResponse(data, mimetype='text/plain') - elif type == "csv": - response = HttpResponse(mimetype='text/csv') - n = datetime.datetime.now() - filename = u'files_%s.csv' % n.strftime('%Y%m%d-%H%M%S') - response['Content-Disposition'] = 'attachment; filename=%s' % filename - writer = csv.writer(response) - for fle in files: - writer.writerow([unicode(fle).encode('utf-8'), - unicode(fle.file_type).encode('utf-8'), - unicode(fle.year).encode('utf-8')]) - return response - return HttpResponse(data, mimetype='text/plain') + request.session[func_name] = dct + query = Q(**dct) + items = model.objects.filter(query) + q = request.GET.get('sidx') + if q and q in request_keys: + k = request_keys[q] + if k.endswith("__pk"): + k = k[:-len("__pk")] + "__label" + q = request.GET.get('sord') + sign = q and q == u'desc' and "-" or '' + items = items.order_by(sign + k) + datas = [] + f = items[0] + for item in items: + data = [item.pk] + for k in model.TABLE_COLS: + val = getattr(item, k) + if hasattr(val, 'all'): # manage related objects + data.append(", ".join([v and unicode(v) or u"" + for v in getattr(val, 'all')()])) + else: + data.append(val and unicode(val) or u"") + datas.append(data) + if type == "json": + rows = [] + for data in datas: + rows.append({"id":unicode(data[0]), + "cell":data}) + data = json.dumps({ + "records":len(items), + "rows":rows + }) + return HttpResponse(data, mimetype='text/plain') + elif type == "csv": + response = HttpResponse(mimetype='text/csv') + n = datetime.datetime.now() + filename = u'%s_%s.csv' % (default_name, n.strftime('%Y%m%d-%H%M%S')) + response['Content-Disposition'] = 'attachment; filename=%s' % filename + writer = csv.writer(response, **CSV_OPTIONS) + col_names = [] + for field_name in model.TABLE_COLS: + try: + field = model._meta.get_field(field_name) + except: + col_names.append(u"".encode('utf-8')) + continue + col_names.append(unicode(field.verbose_name).encode('utf-8')) + writer.writerow(col_names) + for data in datas: + writer.writerow([val.encode('utf-8') for val in data[1:]]) + return response + return HttpResponse(None, mimetype='text/plain') + + return func + +get_file = get_item(models.File, 'get_file', 'file') def autocomplete_operation(request, non_closed=True): if not request.GET.get('term'): @@ -204,67 +227,7 @@ def autocomplete_operation(request, non_closed=True): for operation in operations]) return HttpResponse(data, mimetype='text/plain') -def get_operation(request, type='json', non_closed=True): - if not type: - type = 'json' - request_keys = {'town':'towns__pk', - 'operation_type':'operation_type__pk', - 'operation_code':'operation_code', - 'year':'year', - 'value':'name', - } - dct = {} - for k in request_keys: - q = request.GET.get(k) - if not q: - continue - dct[request_keys[k]] = q - if not dct: - if 'get_operation' in request.session: - dct = request.session['get_operation'] - elif 'operation' in request.session: - dct = {"pk":request.session['operation']} - if not dct: - return HttpResponse(mimetype='text/plain') - else: - request.session['get_operation'] = dct - query = Q(**dct) - operations = models.Operation.objects.filter(query) - q = request.GET.get('sidx') - if q and q in request_keys: - k = request_keys[q] - if k.endswith("__pk"): - k = k[:-len("__pk")] + "__label" - q = request.GET.get('sord') - sign = q and q == u'desc' and "-" or '' - if k == "name": - k = "operation_code" - operations = operations.order_by(sign + 'year').order_by( - sign + 'operation_code') - else: - operations = operations.order_by(sign + k) - data = None - if type == 'json': - data = json.dumps({ - "records":len(operations), - "rows":[{"id":unicode(operation.pk), - "cell":(unicode(operation.pk), unicode(operation), - unicode(operation.operation_type), unicode(operation.year))} - for operation in operations] - }) - return HttpResponse(data, mimetype='text/plain') - elif type == "csv": - response = HttpResponse(mimetype='text/csv') - n = datetime.datetime.now() - filename = 'operations_%s.csv' % n.strftime('%Y%m%d-%H%M%S') - response['Content-Disposition'] = 'attachment; filename=%s' % filename - writer = csv.writer(response) - for ope in operations: - writer.writerow([unicode(ope).encode('utf-8'), - unicode(ope.operation_type).encode('utf-8'), - unicode(ope.year).encode('utf-8')]) - return response - return HttpResponse(data, mimetype='text/plain') +get_operation = get_item(models.Operation, 'get_operation', 'operation') def autocomplete_organization(request, orga_type=None): if not request.GET.get('term'): |