summaryrefslogtreecommitdiff
path: root/ishtar/furnitures/views.py
diff options
context:
space:
mode:
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
commit6e76724c700da8a77cc64c96262c6a685ad5382b (patch)
tree2f72b6a7238cb9ca83fa7675b3ee27f747a05628 /ishtar/furnitures/views.py
parent989c625b2b4f580822c0e59146d36e66342accea (diff)
downloadIshtar-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.py199
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'):