forked from uw-ictd/pyxform_interface
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathviews.py
102 lines (86 loc) · 3.48 KB
/
views.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
# Create your views here.
from django.http import HttpResponse
from django.shortcuts import render_to_response
from django import forms
import datetime
import tempfile
import os
import json
import pyxform
from pyxform import xls2json
SERVER_TMP_DIR = '/tmp'
class UploadFileForm(forms.Form):
file = forms.FileField()
def handle_uploaded_file(f, temp_dir):
xls_path = os.path.join(temp_dir, f.name)
destination = open(xls_path, 'wb+')
for chunk in f.chunks():
destination.write(chunk)
destination.close()
return xls_path
def json_workbook(request):
error = None
warningsList = []
#Make a randomly generated directory to prevent name collisions
temp_dir = tempfile.mkdtemp(dir=SERVER_TMP_DIR)
form_name = request.POST.get('name', 'form')
output_filename = form_name + '.xml'
out_path = os.path.join(temp_dir, output_filename)
fo = open(out_path, "wb+")
fo.close()
try:
json_survey = xls2json.workbook_to_json(json.loads(request.POST['workbookJson']), form_name=form_name, warnings=warningsList)
survey = pyxform.create_survey_element_from_dict(json_survey)
survey.print_xform_to_file(out_path, warnings=warningsList)
except Exception as e:
error = str(e)
return HttpResponse(json.dumps({
'dir': os.path.split(temp_dir)[-1],
'name' : output_filename,
'error': error,
'warnings': warningsList,
}, indent=4), mimetype="application/json")
def index(request):
if request.method == 'POST': # If the form has been submitted...
form = UploadFileForm(request.POST, request.FILES) # A form bound to the POST data
if form.is_valid(): # All validation rules pass
error = None
warnings = None
filename, ext = os.path.splitext(request.FILES['file'].name)
#Make a randomly generated directory to prevent name collisions
temp_dir = tempfile.mkdtemp(dir=SERVER_TMP_DIR)
xml_path = os.path.join(temp_dir, filename + '.xml')
#Init the output xml file.
fo = open(xml_path, "wb+")
fo.close()
try:
#TODO: use the file object directly
xls_path = handle_uploaded_file(request.FILES['file'], temp_dir)
warnings = []
json_survey = xls2json.parse_file_to_json(xls_path, warnings=warnings)
survey = pyxform.create_survey_element_from_dict(json_survey)
survey.print_xform_to_file(xml_path, warnings=warnings)
except Exception as e:
error = 'Error: ' + str(e)
return render_to_response('upload.html', {
'form': UploadFileForm(),
'xml_path' : '.' + xml_path,
'xml_url' : request.build_absolute_uri('.' + xml_path),
'success': not error,
'error': error,
'warnings': warnings,
'result': True,
})
else:
form = UploadFileForm() # An unbound form
return render_to_response('upload.html', {
'form': form,
})
def serve_xform(request, path):
fo = open(os.path.join(SERVER_TMP_DIR,path))
data = fo.read()
fo.close()
response = HttpResponse(mimetype='application/octet-stream')
#response['Content-Disposition'] = 'attachment; filename=somefilename.xml'
response.write(data)
return response