Projet

Général

Profil

0002-feeder-import-boolean-form-s-fields-fixes-13612.patch

Benjamin Dauvergne, 16 janvier 2019 17:19

Télécharger (9,1 ko)

Voir les différences:

Subject: [PATCH 2/2] =?UTF-8?q?feeder:=C2=B7import=C2=B7boolean=C2=B7form'?=
 =?UTF-8?q?s=C2=B7fields=C2=B7(fixes=C2=B7#13612)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

 tests/conftest.py  |   2 +
 tests/test_wcs.py  |   1 +
 wcs_olap/feeder.py | 117 ++++++++++++++++++++++++++-------------------
 3 files changed, 72 insertions(+), 48 deletions(-)
tests/conftest.py
88 88
    fields.StringField(id='1', label='1st field', type='string', anonymise=False, varname='field_string'),
89 89
    fields.ItemField(id='2', label='2nd field', type='item',
90 90
                     items=['foo', 'bar', 'baz'], varname='field_item'),
91
    fields.BoolField(id='3', label='3rd field', type='bool', varname='field_bool'),
91 92
]
92 93
formdef.store()
93 94

  
......
107 108
    else:
108 109
        formdata.data['2'] = 'baz'
109 110
        formdata.data['2_display'] = 'baz'
111
    formdata.data['3'] = bool(i % 2)
110 112
    if i%3 == 0:
111 113
        formdata.jump_status('new')
112 114
    else:
tests/test_wcs.py
66 66
        ('formdata_demande', 'json_data'),
67 67
        ('formdata_demande', 'status_id'),
68 68
        ('formdata_demande', 'field_field_item'),
69
        ('formdata_demande', 'field_field_bool'),
69 70
        ('formdata_demande', 'function__receiver'),
70 71
        ('formdata_demande_field_field_item', 'id'),
71 72
        ('formdata_demande_field_field_item', 'label'),
wcs_olap/feeder.py
531 531
        if self.formdef.schema.workflow:
532 532
            fields += self.formdef.schema.workflow.fields
533 533
        for field in fields:
534
            if not field.type == 'item':
535
                continue
536 534
            if field.anonymise is True:
537 535
                continue
538 536
            if not field.varname or '-' in field.varname:
539 537
                continue
540 538
            if field.varname in duplicated_varnames:
541 539
                continue
542
            self.fields.append(field)
543
            comment = (u'valeurs du champ « %s » du formulaire %s'
544
                       % (field.label, self.formdef.schema.name))
545
            table_name = self.hash_table_name('{formdata_table}_field_%s' % field.varname)
546
            # create table and mapping
547
            if field.items:
548
                self.create_labeled_table(table_name, enumerate(field.items),
549
                                          comment=comment)
550
                self.items_mappings[field.varname] = dict(
551
                    (item, i) for i, item in enumerate(field.items))
552
            elif field.options:
553
                options = enumerate(field.options)
554
                self.create_labeled_table(table_name, [(i, o['label']) for i, o in options],
555
                                          comment=comment)
556
                self.items_mappings[field.varname] = dict((o['value'], i) for i, o in options)
540
            if field.type == 'item':
541
                comment = (u'valeurs du champ « %s » du formulaire %s'
542
                           % (field.label, self.formdef.schema.name))
543
                table_name = self.hash_table_name('{formdata_table}_field_%s' % field.varname)
544
                # create table and mapping
545
                if field.items:
546
                    self.create_labeled_table(table_name, enumerate(field.items),
547
                                              comment=comment)
548
                    self.items_mappings[field.varname] = dict(
549
                        (item, i) for i, item in enumerate(field.items))
550
                elif field.options:
551
                    options = enumerate(field.options)
552
                    self.create_labeled_table(table_name, [(i, o['label']) for i, o in options],
553
                                              comment=comment)
554
                    self.items_mappings[field.varname] = dict((o['value'], i) for i, o in options)
555
                else:
556
                    # open item field, from data sources...
557
                    self.create_labeled_table(table_name, [], serial=True, comment=comment)
558
                field_def = 'smallint REFERENCES %s (id)' % table_name
559
            elif field.type == 'bool':
560
                field_def = 'boolean'
557 561
            else:
558
                # open item field, from data sources...
559
                self.create_labeled_table(table_name, [], serial=True, comment=comment)
560

  
562
                continue
563
            self.fields.append(field)
561 564
            at = 'field_%s' % field.varname
562
            columns.append([at, 'smallint REFERENCES %s (id)' % table_name])
565
            columns.append([at, field_def])
563 566
            comments[at] = field.label
564 567

  
565 568
        # add geolocation fields
......
680 683
            for field in self.fields:
681 684
                v = None
682 685
                raw = None
686
                if field.varname in data.fields:
687
                    raw = data.fields[field.varname]
688
                elif field.varname in data.workflow.fields:
689
                    raw = data.workflow.fields[field.varname]
690
                else:
691
                    raw = None
683 692
                if field.type == 'item':
684
                    if field.varname in data.fields:
685
                        raw = data.fields[field.varname]
686
                    elif field.varname in data.workflow.fields:
687
                        raw = data.workflow.fields[field.varname]
688
                    else:
689
                        raw = None
690 693
                    # map items to sql id
691 694
                    if field.items or field.options:
692 695
                        v = self.items_mappings[field.varname].get(raw)
693 696
                    else:
694 697
                        v = raw and self.get_item_id(field, raw)
698
                elif field.type == 'bool':
699
                    v = raw
700

  
695 701
                # unstructured storage of field values
696
                if field.varname and raw:
702
                if field.varname and raw is not None:
697 703
                    json_data[field.varname] = raw
698 704

  
699 705
                row['field_%s' % field.varname] = v
......
847 853
        if self.formdef.schema.workflow:
848 854
            fields += self.formdef.schema.workflow.fields
849 855
        for field in fields:
850
            if not field.type == 'item':
851
                continue
852 856
            if field.anonymise is True:
853 857
                continue
854 858
            if not field.varname:
855 859
                continue
856 860
            if '-' in field.varname:
857 861
                continue
858
            table_name = self.hash_table_name('{formdata_table}_field_%s' % field.varname)
859
            cube['joins'].append({
860
                'name': field.varname,
861
                'table': table_name,
862
                'master': 'field_%s' % field.varname,
863
                'detail': 'id',
864
            })
865
            if not field.required:
866
                cube['joins'][-1]['kind'] = 'full'
867
            cube['dimensions'].append({
868
                'name': field.varname,
869
                'label': field.label.lower(),
870
                'join': [field.varname],
871
                'type': 'integer',
872
                'value': '"%s".id' % field.varname,
873
                'value_label': '"%s".label' % field.varname,
874
                'filter': True,
875
            })
862
            join = None
863

  
864
            if field.type == 'item':
865
                table_name = self.hash_table_name('{formdata_table}_field_%s' % field.varname)
866
                join = {
867
                    'name': field.varname,
868
                    'table': table_name,
869
                    'master': 'field_%s' % field.varname,
870
                    'detail': 'id',
871
                }
872
                if not field.required:
873
                    join['kind'] = 'full'
874
                dimension = {
875
                    'name': field.varname,
876
                    'label': field.label.lower(),
877
                    'join': [field.varname],
878
                    'type': 'integer',
879
                    'value': '"%s".id' % field.varname,
880
                    'value_label': '"%s".label' % field.varname,
881
                    'filter': True,
882
                }
883
            elif field.type == 'bool':
884
                dimension = {
885
                    'name': field.varname,
886
                    'label': field.label.lower(),
887
                    'type': 'bool',
888
                    'value': '"%s"' % field.varname,
889
                    'value_label': '(case when "%s" IS NOT NULL then \'Oui\' else \'Non\' end)' % field.varname,
890
                    'filter': True,
891
                }
892
            else:
893
                continue
894
            if join:
895
                cube['joins'].append(join)
896
            cube['dimensions'].append(dimension)
876 897

  
877 898
        self.model['cubes'].append(cube)
878 899
        if self.do_feed:
879
-