summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorÉtienne Loks <etienne.loks@peacefrogs.net>2011-02-01 00:19:36 +0100
committerÉtienne Loks <etienne.loks@peacefrogs.net>2011-02-01 00:19:36 +0100
commitd53fe70a3458cc8cd02367997c63bb17718dd45d (patch)
treeea588f9231d6c5cdf69ca0547aa9b901f1a3092f
parent603b94b71f230cccfc1edd325c884c701660c473 (diff)
downloadIshtar-d53fe70a3458cc8cd02367997c63bb17718dd45d.tar.bz2
Ishtar-d53fe70a3458cc8cd02367997c63bb17718dd45d.zip
Export tables as CSV (closes #158)
-rw-r--r--ishtar/furnitures/forms.py4
-rw-r--r--ishtar/furnitures/urls.py8
-rw-r--r--ishtar/furnitures/views.py59
-rw-r--r--ishtar/furnitures/widgets.py6
4 files changed, 56 insertions, 21 deletions
diff --git a/ishtar/furnitures/forms.py b/ishtar/furnitures/forms.py
index db440081c..e436d0664 100644
--- a/ishtar/furnitures/forms.py
+++ b/ishtar/furnitures/forms.py
@@ -681,7 +681,7 @@ class FileFormSelection(forms.Form):
associated_models = {'pk':models.File}
currents = {'pk':models.File}
pk = forms.IntegerField(label="", required=False,
- widget=widgets.JQueryJqGrid(reverse_lazy('json-file'),
+ widget=widgets.JQueryJqGrid(reverse_lazy('get-file'),
FileSelect(), ['file_type', 'year']),
validators=[models.valid_id(models.File)])
@@ -1168,7 +1168,7 @@ class OperationFormSelection(forms.Form):
associated_models = {'pk':models.Operation}
currents = {'pk':models.Operation}
pk = forms.IntegerField(label="", required=False,
- widget=widgets.JQueryJqGrid(reverse_lazy('json-operation'),
+ widget=widgets.JQueryJqGrid(reverse_lazy('get-operation'),
OperationSelect(), ['operation_type', 'year']),
validators=[models.valid_id(models.Operation)])
diff --git a/ishtar/furnitures/urls.py b/ishtar/furnitures/urls.py
index d20ae6035..7d9a6873a 100644
--- a/ishtar/furnitures/urls.py
+++ b/ishtar/furnitures/urls.py
@@ -69,12 +69,12 @@ urlpatterns += patterns('ishtar.furnitures.views',
name='autocomplete-organization'),
url(BASE_URL + r'autocomplete-file/$', 'autocomplete_file',
name='autocomplete-file'),
- url(BASE_URL + r'json-file/$', 'json_file',
- name='json-file'),
+ url(BASE_URL + r'get-file/(?P<type>.+)?$', 'get_file',
+ name='get-file'),
url(BASE_URL + r'autocomplete-operation/$', 'autocomplete_operation',
name='autocomplete-operation'),
- url(BASE_URL + r'json-operation/$', 'json_operation',
- name='json-operation'),
+ url(BASE_URL + r'get-operation/(?P<type>.+)?$', 'get_operation',
+ name='get-operation'),
url(BASE_URL + r'update-current-item/$', 'update_current_item',
name='update-current-item'),
)
diff --git a/ishtar/furnitures/views.py b/ishtar/furnitures/views.py
index 041ebfb76..3b6263517 100644
--- a/ishtar/furnitures/views.py
+++ b/ishtar/furnitures/views.py
@@ -21,7 +21,10 @@
Furnitures views
"""
+import csv
import json
+import datetime
+
from django.http import HttpResponse
from django.template import RequestContext
from django.shortcuts import render_to_response, redirect
@@ -120,9 +123,9 @@ def autocomplete_file(request):
for file in files])
return HttpResponse(data, mimetype='text/plain')
-def json_file(request):
- if not request.GET:
- return HttpResponse(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',
@@ -135,14 +138,14 @@ def json_file(request):
continue
dct[request_keys[k]] = q
if not dct:
- if 'json_file' in request.session:
- dct = request.session['json_file']
+ if 'get_file' in request.session:
+ dct = request.session['get_file']
elif 'file' in request.session:
dct = {"pk":request.session['file']}
if not dct:
return HttpResponse(mimetype='text/plain')
else:
- request.session['json_file'] = dct
+ request.session['get_file'] = dct
query = Q(**dct)
files = models.File.objects.filter(query)
q = request.GET.get('sidx')
@@ -157,13 +160,27 @@ def json_file(request):
sign + 'numeric_reference')
else:
files = files.order_by(sign + k)
- data = json.dumps({
+ 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')
def autocomplete_operation(request, non_closed=True):
@@ -187,9 +204,9 @@ def autocomplete_operation(request, non_closed=True):
for operation in operations])
return HttpResponse(data, mimetype='text/plain')
-def json_operation(request, non_closed=True):
- if not request.GET:
- return HttpResponse(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',
@@ -203,14 +220,14 @@ def json_operation(request, non_closed=True):
continue
dct[request_keys[k]] = q
if not dct:
- if 'json_operation' in request.session:
- dct = request.session['json_operation']
+ 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['json_operation'] = dct
+ request.session['get_operation'] = dct
query = Q(**dct)
operations = models.Operation.objects.filter(query)
q = request.GET.get('sidx')
@@ -226,13 +243,27 @@ def json_operation(request, non_closed=True):
sign + 'operation_code')
else:
operations = operations.order_by(sign + k)
- data = json.dumps({
+ 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')
def autocomplete_organization(request, orga_type=None):
diff --git a/ishtar/furnitures/widgets.py b/ishtar/furnitures/widgets.py
index 6276e2771..932770f29 100644
--- a/ishtar/furnitures/widgets.py
+++ b/ishtar/furnitures/widgets.py
@@ -163,7 +163,11 @@ class JQueryJqGrid(forms.RadioSelect):
extra_cols = extra_cols and ",".join([""]+extra_cols) or ""
rendered += """<table id="grid_%s" class='jqgrid'></table>
<div id="pager_%s"></div>
-<input type="hidden" id="hidden_%s" name="%s">""" % (name, name, name, name)
+""" % (name, name)
+ rendered += """
+<div id="foot_%s" class="gridfooter"><a href="%scsv" target="_blank">%s</a></div>
+<input type="hidden" id="hidden_%s" name="%s">""" % (name,
+ unicode(self.source), unicode(_("Export as CSV")), name, name)
rendered += """
<script type="text/javascript">
var query_vars = new Array(%(col_idx)s);