Projet

Général

Profil

wcs-better-json-try3.patch

Thomas Noël, 21 mai 2013 13:54

Télécharger (7,4 ko)

Voir les différences:


  

wcs/fields.py
645 645
            return ['[download]files/%s/%s' % (self.id, value.base_filename)]
646 646
        return ['%s' % value]
647 647

  
648
    def get_json_value(self, value):
649
        return {'field_id': self.id, 'filename': value.base_filename}
650

  
648 651
    def perform_more_widget_changes(self, form, kwargs, edit = True):
649 652
        if not edit:
650 653
            value = get_request().get_field(self.field_key)
......
826 829

  
827 830
        get_request().form[self.field_key + '_label'] = label_value # :/
828 831
        form.add(StringWidget, self.field_key + '_label', title = self.label,
829
                 value=label_value, readonly = 'readonly', size=len(label_value))
832
                 value=label_value, readonly = 'readonly', size=len(label_value or ''))
830 833
        form.add(HiddenWidget, self.field_key, value=real_value)
831 834

  
832 835
    def store_display_value(self, data, field_id):
wcs/formdata.py
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 qommon.strftime.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
wcs/wf/form.py
22 22
from wcs.formdef import FormDef
23 23

  
24 24
from wcs.admin.fields import FieldWidget, FieldDefPage, FieldsDirectory
25
from wcs.formdata import get_dict_with_varnames
25
from wcs.formdata import get_json_dict
26 26

  
27 27

  
28 28
class WorkflowFormFieldsFormDef(FormDef):
......
98 98
    def submit_form(self, form, formdata, user, evo):
99 99
        if form.get_submit() == 'submit' and not form.has_errors():
100 100
            workflow_data = {}
101
            for k, v in get_dict_with_varnames(
101
            for k, v in get_json_dict(
102 102
                            self.formdef.fields, self.formdef.get_data(form)).items():
103 103
                workflow_data['%s_%s' % (self.varname, k)] = v
104 104
            formdata.update_workflow_data(workflow_data)