28 |
28 |
def get_dict_with_varnames(fields, data):
|
29 |
29 |
new_data = {}
|
30 |
30 |
for field in fields:
|
31 |
|
if not hasattr(field, str('get_view_value')):
|
|
31 |
if not hasattr(field, 'get_view_value'):
|
32 |
32 |
continue
|
33 |
33 |
if data is not None:
|
34 |
|
raw_value = data.get(field.id)
|
|
34 |
value = data.get(field.id)
|
35 |
35 |
if field.convert_value_to_str:
|
36 |
|
raw_value = field.convert_value_to_str(raw_value)
|
|
36 |
value = field.convert_value_to_str(value)
|
37 |
37 |
display_value = data.get('%s_display' % field.id)
|
38 |
38 |
else:
|
39 |
|
raw_value = ''
|
|
39 |
value = ''
|
40 |
40 |
display_value = ''
|
41 |
|
value = display_value or raw_value
|
42 |
41 |
# add it as f$n$
|
43 |
42 |
new_data['f%s' % field.id] = value
|
44 |
43 |
|
... | ... | |
48 |
47 |
|
49 |
48 |
# and finally add it as its manually defined variable name
|
50 |
49 |
if field.varname:
|
51 |
|
new_data['var_%s' % field.varname] = value
|
52 |
|
if display_value:
|
53 |
|
new_data['var_%s_raw' % field.varname] = raw_value
|
|
50 |
if field.store_display_value:
|
|
51 |
new_data['var_%s_raw' % field.varname] = value
|
|
52 |
new_data['var_%s' % field.varname] = display_value
|
|
53 |
else:
|
|
54 |
new_data['var_%s' % field.varname] = value
|
54 |
55 |
return new_data
|
55 |
56 |
|
56 |
57 |
def flatten_dict(d):
|
... | ... | |
62 |
63 |
del d[k]
|
63 |
64 |
|
64 |
65 |
|
|
66 |
def get_json_dict(fields, data):
|
|
67 |
new_data = {}
|
|
68 |
for field in fields:
|
|
69 |
if not field.varname: # exports only named fields
|
|
70 |
continue
|
|
71 |
if data is not None:
|
|
72 |
value = data.get(field.id)
|
|
73 |
if value and hasattr(field, 'get_json_value'):
|
|
74 |
value = field.get_json_value(value)
|
|
75 |
display_value = data.get('%s_display' % field.id)
|
|
76 |
else:
|
|
77 |
value = display_value = None
|
|
78 |
if field.store_display_value:
|
|
79 |
new_data[field.varname + '_raw'] = value
|
|
80 |
new_data[field.varname] = data.get('%s_display' % field.id)
|
|
81 |
else:
|
|
82 |
new_data[field.varname] = value
|
|
83 |
return new_data
|
|
84 |
|
|
85 |
class JSONEncoder(json.JSONEncoder):
|
|
86 |
def default(self, obj):
|
|
87 |
if isinstance(obj, time.struct_time):
|
|
88 |
return time.strftime('%Y-%m-%dT%H:%M:%S', obj)
|
|
89 |
# Let the base class default method raise the TypeError
|
|
90 |
return json.JSONEncoder.default(self, obj)
|
|
91 |
|
|
92 |
|
65 |
93 |
class Evolution:
|
66 |
94 |
who = None
|
67 |
95 |
status = None
|
... | ... | |
401 |
429 |
|
402 |
430 |
def export_to_json(self):
|
403 |
431 |
data = {}
|
404 |
|
|
405 |
432 |
data['id'] = '%s/%s' % (self.formdef.url_name, self.id)
|
406 |
433 |
data['display_id'] = self.get_display_id()
|
407 |
|
|
408 |
|
if self.receipt_time is not None:
|
409 |
|
data['receipt_time'] = qommon.strftime.strftime('%Y-%m-%dT%H:%M:%S', self.receipt_time)
|
|
434 |
data['receipt_time'] = self.receipt_time
|
410 |
435 |
|
411 |
436 |
try:
|
412 |
437 |
user = get_publisher().user_class.get(self.user_id)
|
413 |
438 |
except KeyError:
|
414 |
439 |
user = None
|
415 |
|
|
416 |
440 |
# this is custom code so it is possible to mark forms as anonyms, this
|
417 |
441 |
# is done through the VoteAnonymity field, this is very specific but
|
418 |
442 |
# isn't generalised yet into an useful extension mechanism, as it's not
|
... | ... | |
421 |
445 |
if f.key == 'vote-anonymity':
|
422 |
446 |
user = None
|
423 |
447 |
break
|
424 |
|
|
425 |
448 |
if user:
|
426 |
449 |
data['user'] = {'id': user.id, 'name': user.display_name}
|
427 |
450 |
|
... | ... | |
433 |
456 |
else:
|
434 |
457 |
data['signature'] = {'status': 'missing'}
|
435 |
458 |
|
436 |
|
data['fields'] = {}
|
437 |
|
for f in self.formdef.fields:
|
438 |
|
if not f.varname:
|
439 |
|
continue
|
440 |
|
if not self.data.has_key(f.id):
|
441 |
|
continue
|
442 |
|
|
443 |
|
value = self.data[f.id]
|
444 |
|
|
445 |
|
if value is None:
|
446 |
|
value = ''
|
447 |
|
|
448 |
|
if not hasattr(f, str('get_view_value')):
|
449 |
|
continue
|
450 |
|
|
451 |
|
if type(value) is str:
|
452 |
|
value = unicode(value, get_publisher().site_charset)
|
453 |
|
elif type(value) in (unicode, bool, int, type(None), list, tuple, dict):
|
454 |
|
pass
|
455 |
|
else:
|
456 |
|
value = f.get_view_value(value)
|
457 |
|
data['fields'][f.varname] = value
|
458 |
|
if f.store_display_value and ('%s_display' % f.id) in self.data:
|
459 |
|
data['fields'][f.varname + '_raw'] = data['fields'][f.varname]
|
460 |
|
display_value = self.data['%s_display' % f.id]
|
461 |
|
if display_value is not None:
|
462 |
|
if type(display_value) is str:
|
463 |
|
display_value = unicode(display_value, get_publisher().site_charset)
|
464 |
|
data['fields'][f.varname] = unicode(display_value)
|
|
459 |
data['fields'] = get_json_dict(self.formdef.fields, self.data)
|
465 |
460 |
|
466 |
461 |
data['workflow'] = {}
|
467 |
462 |
wf_status = self.get_visible_status()
|
... | ... | |
470 |
465 |
if self.workflow_data:
|
471 |
466 |
data['workflow']['data'] = self.workflow_data
|
472 |
467 |
|
473 |
|
return json.dumps(data)
|
|
468 |
return json.dumps(data,
|
|
469 |
cls=JSONEncoder,
|
|
470 |
encoding=get_publisher().site_charset)
|
474 |
471 |
|
475 |
472 |
|
476 |
473 |
# don't pickle _formdef cache
|