Projet

Général

Profil

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

Benjamin Dauvergne, 18 janvier 2019 09:19

Télécharger (9,77 ko)

Voir les différences:

Subject: [PATCH] =?UTF-8?q?feeder:=C2=B7import=C2=B7boolean=C2=B7form's?=
 =?UTF-8?q?=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/olap.model   |   8 ++++
 tests/test_wcs.py  |   1 +
 wcs_olap/feeder.py | 117 ++++++++++++++++++++++++++-------------------
 4 files changed, 80 insertions(+), 48 deletions(-)
tests/conftest.py
91 91
    fields.StringField(id='1', label='1st field', type='string', anonymise=False, varname='field_string'),
92 92
    fields.ItemField(id='2', label='2nd field', type='item',
93 93
                     items=['foo', 'bar', 'baz'], varname='field_item'),
94
    fields.BoolField(id='3', label='3rd field', type='bool', varname='field_bool'),
94 95
]
95 96
formdef.store()
96 97

  
......
110 111
    else:
111 112
        formdata.data['2'] = 'baz'
112 113
        formdata.data['2_display'] = 'baz'
114
    formdata.data['3'] = bool(i % 2)
113 115
    if i%3 == 0:
114 116
        formdata.jump_status('new')
115 117
    else:
tests/olap.model
249 249
               "type" : "integer",
250 250
               "value" : "\"field_item\".id",
251 251
               "value_label" : "\"field_item\".label"
252
            },
253
            {
254
             "filter": true,
255
             "label": "3rd field",
256
             "name": "field_bool",
257
             "type": "bool",
258
             "value": "\"field_bool\"",
259
             "value_label": "(case when \"field_bool\" IS NOT NULL then 'Oui' else 'Non' end)"
252 260
            }
253 261
         ],
254 262
         "fact_table" : "formdata_demande",
tests/test_wcs.py
67 67
        ('formdata_demande', 'json_data'),
68 68
        ('formdata_demande', 'status_id'),
69 69
        ('formdata_demande', 'field_field_item'),
70
        ('formdata_demande', 'field_field_bool'),
70 71
        ('formdata_demande', 'function__receiver'),
71 72
        ('formdata_demande_field_field_item', 'id'),
72 73
        ('formdata_demande_field_field_item', 'label'),
wcs_olap/feeder.py
536 536
        if self.formdef.schema.workflow:
537 537
            fields += self.formdef.schema.workflow.fields
538 538
        for field in fields:
539
            if not field.type == 'item':
540
                continue
541 539
            if field.anonymise is True:
542 540
                continue
543 541
            if not field.varname or '-' in field.varname:
544 542
                continue
545 543
            if field.varname in duplicated_varnames:
546 544
                continue
547
            self.fields.append(field)
548
            comment = (u'valeurs du champ « %s » du formulaire %s'
549
                       % (field.label, self.formdef.schema.name))
550
            table_name = self.hash_table_name('{formdata_table}_field_%s' % field.varname)
551
            # create table and mapping
552
            if field.items:
553
                self.create_labeled_table(table_name, enumerate(field.items),
554
                                          comment=comment)
555
                self.items_mappings[field.varname] = dict(
556
                    (item, i) for i, item in enumerate(field.items))
557
            elif field.options:
558
                options = enumerate(field.options)
559
                self.create_labeled_table(table_name, [(i, o['label']) for i, o in options],
560
                                          comment=comment)
561
                self.items_mappings[field.varname] = dict((o['value'], i) for i, o in options)
545
            if field.type == 'item':
546
                comment = (u'valeurs du champ « %s » du formulaire %s'
547
                           % (field.label, self.formdef.schema.name))
548
                table_name = self.hash_table_name('{formdata_table}_field_%s' % field.varname)
549
                # create table and mapping
550
                if field.items:
551
                    self.create_labeled_table(table_name, enumerate(field.items),
552
                                              comment=comment)
553
                    self.items_mappings[field.varname] = dict(
554
                        (item, i) for i, item in enumerate(field.items))
555
                elif field.options:
556
                    options = enumerate(field.options)
557
                    self.create_labeled_table(table_name, [(i, o['label']) for i, o in options],
558
                                              comment=comment)
559
                    self.items_mappings[field.varname] = dict((o['value'], i) for i, o in options)
560
                else:
561
                    # open item field, from data sources...
562
                    self.create_labeled_table(table_name, [], serial=True, comment=comment)
563
                field_def = 'smallint REFERENCES %s (id)' % table_name
564
            elif field.type == 'bool':
565
                field_def = 'boolean'
562 566
            else:
563
                # open item field, from data sources...
564
                self.create_labeled_table(table_name, [], serial=True, comment=comment)
565

  
567
                continue
568
            self.fields.append(field)
566 569
            at = 'field_%s' % field.varname
567
            columns.append([at, 'smallint REFERENCES %s (id)' % table_name])
570
            columns.append([at, field_def])
568 571
            comments[at] = field.label
569 572

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

  
700 706
                # unstructured storage of field values
701
                if field.varname and raw:
707
                if field.varname and raw is not None:
702 708
                    json_data[field.varname] = raw
703 709

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

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

  
882 903
        self.model['cubes'].append(cube)
883 904
        if self.do_feed:
884
-