Projet

Général

Profil

0001-misc-give-unique-identifiers-to-backoffice-fields-17.patch

Frédéric Péters, 08 avril 2019 19:21

Télécharger (10,9 ko)

Voir les différences:

Subject: [PATCH] misc: give unique identifiers to backoffice fields (#17375)

 tests/test_admin_pages.py | 11 ++++---
 wcs/sql.py                | 63 +++++++++++++++++++++------------------
 wcs/workflows.py          |  5 +---
 3 files changed, 40 insertions(+), 39 deletions(-)
tests/test_admin_pages.py
2848 2848
    resp = resp.follow()
2849 2849
    workflow = Workflow.get(workflow.id)
2850 2850
    assert len(workflow.backoffice_fields_formdef.fields) == 2
2851
    assert workflow.backoffice_fields_formdef.fields[0].id == 'bo1'
2852
    assert workflow.backoffice_fields_formdef.fields[1].id == 'bo2'
2851
    first_field_id = workflow.backoffice_fields_formdef.fields[0].id
2852
    assert workflow.backoffice_fields_formdef.fields[1].id != first_field_id
2853 2853

  
2854 2854
    # check there's no prefill field
2855
    resp = app.get('/backoffice/workflows/1/backoffice-fields/fields/bo2/')
2855
    resp = app.get('/backoffice/workflows/1/backoffice-fields/fields/%s/' % workflow.backoffice_fields_formdef.fields[1].id)
2856 2856
    assert not 'prefill$type' in resp.form.fields.keys()
2857 2857

  
2858 2858
    # add a title field
......
2862 2862
    resp = resp.form.submit()
2863 2863
    workflow = Workflow.get(workflow.id)
2864 2864
    assert len(workflow.backoffice_fields_formdef.fields) == 3
2865
    assert workflow.backoffice_fields_formdef.fields[2].id == 'bo3'
2866 2865

  
2867 2866
    # check backoffice fields are available in set backoffice fields action
2868 2867
    resp = app.get('/backoffice/workflows/1/')
......
2874 2873
    assert 'foobar2' in options
2875 2874
    assert 'foobar3' not in options
2876 2875

  
2877
    resp.form['fields$element0$field_id'] = 'bo1'
2876
    resp.form['fields$element0$field_id'] = first_field_id
2878 2877
    resp.form['fields$element0$value$value_text'] = 'Hello'
2879 2878
    resp = resp.form.submit('submit')
2880 2879
    workflow = Workflow.get(workflow.id)
2881
    assert workflow.possible_status[0].items[0].fields == [{'field_id': 'bo1', 'value': 'Hello'}]
2880
    assert workflow.possible_status[0].items[0].fields == [{'field_id': first_field_id, 'value': 'Hello'}]
2882 2881

  
2883 2882
def test_workflows_functions(pub):
2884 2883
    create_superuser(pub)
wcs/sql.py
207 207
    return name
208 208

  
209 209

  
210
def get_field_id(field):
211
    return 'f' + str(field.id).replace('-', '_')
212

  
210 213
def parse_clause(clause):
211 214
    # returns a three-elements tuple with:
212 215
    #  - a list of SQL 'WHERE' clauses
......
450 453
        sql_type = SQL_TYPE_MAPPING.get(field.key, 'varchar')
451 454
        if sql_type is None:
452 455
            continue
453
        needed_fields.add('f%s' % field.id)
454
        if 'f%s' % field.id not in existing_fields:
456
        needed_fields.add(get_field_id(field))
457
        if get_field_id(field) not in existing_fields:
455 458
            cur.execute('''ALTER TABLE %s ADD COLUMN %s %s''' % (
456 459
                                    table_name,
457
                                    'f%s' % field.id,
460
                                    get_field_id(field),
458 461
                                    sql_type))
459 462
        if field.store_display_value:
460
            needed_fields.add('f%s_display' % field.id)
461
            if 'f%s_display' % field.id not in existing_fields:
463
            needed_fields.add('%s_display' % get_field_id(field))
464
            if '%s_display' % get_field_id(field) not in existing_fields:
462 465
                cur.execute('''ALTER TABLE %s ADD COLUMN %s varchar''' % (
463
                                        table_name, 'f%s_display' % field.id))
466
                                        table_name,
467
                                        '%s_display' % get_field_id(field)))
464 468
        if field.store_structured_value:
465 469
            needed_fields.add('f%s_structured' % field.id)
466
            if 'f%s_structured' % field.id not in existing_fields:
470
            if '%s_structured' % get_field_id(field) not in existing_fields:
467 471
                cur.execute('''ALTER TABLE %s ADD COLUMN %s bytea''' % (
468
                                        table_name, 'f%s_structured' % field.id))
472
                                        table_name,
473
                                        '%s_structured' % get_field_id(field)))
469 474

  
470 475
    for field in (formdef.geolocations or {}).keys():
471 476
        column_name = 'geoloc_%s' % field
......
563 568
        sql_type = SQL_TYPE_MAPPING.get(field.key, 'varchar')
564 569
        if sql_type is None:
565 570
            continue
566
        needed_fields.add('f%s' % field.id)
567
        if 'f%s' % field.id not in existing_fields:
571
        needed_fields.add(get_field_id(field))
572
        if get_field_id(field) not in existing_fields:
568 573
            cur.execute('''ALTER TABLE %s ADD COLUMN %s %s''' % (
569 574
                                    table_name,
570
                                    'f%s' % field.id,
575
                                    get_field_id(field),
571 576
                                    sql_type))
572 577
        if field.store_display_value:
573
            needed_fields.add('f%s_display' % field.id)
574
            if 'f%s_display' % field.id not in existing_fields:
578
            needed_fields.add('%s_display' % get_field_id(field))
579
            if '%s_display' % get_field_id(field) not in existing_fields:
575 580
                cur.execute('''ALTER TABLE %s ADD COLUMN %s varchar''' % (
576
                                        table_name, 'f%s_display' % field.id))
581
                                        table_name, '%s_display' % get_field_id(field)))
577 582
        if field.store_structured_value:
578
            needed_fields.add('f%s_structured' % field.id)
579
            if 'f%s_structured' % field.id not in existing_fields:
583
            needed_fields.add('%s_structured' % get_field_id(field))
584
            if '%s_structured' % get_field_id(field) not in existing_fields:
580 585
                cur.execute('''ALTER TABLE %s ADD COLUMN %s bytea''' % (
581
                                        table_name, 'f%s_structured' % field.id))
586
                                        table_name, '%s_structured' % get_field_id(field)))
582 587

  
583 588
    # migrations
584 589
    if not 'fts' in existing_fields:
......
742 747

  
743 748
    column_names = {}
744 749
    for field in formdef.get_all_fields():
745
        field_key = 'f%s' % field.id
750
        field_key = get_field_id(field)
746 751
        if field.type in ('page', 'title', 'subtitle', 'comment'):
747 752
            continue
748 753
        if field.varname:
......
751 756
            # doesn't contain invalid characters.
752 757
            field_name = 'f_%s' % get_name_as_sql_identifier(field.varname)[:50]
753 758
        else:
754
            field_name = 'f%s_%s' % (field.id, get_name_as_sql_identifier(field.label))
759
            field_name = '%s_%s' % (get_field_id(field), get_name_as_sql_identifier(field.label))
755 760
            field_name = field_name[:50]
756 761
        if field_name in column_names:
757 762
            # it may happen that the same varname is used on multiple fields
......
763 768
        column_names[field_name] = 1
764 769
        view_fields.append((field_key, field_name))
765 770
        if field.store_display_value:
766
            field_key = 'f%s_display' % field.id
771
            field_key = '%s_display' % get_field_id(field)
767 772
            view_fields.append((field_key, field_name + '_display'))
768 773

  
769 774
    view_fields.append(('''ARRAY(SELECT status FROM %s_evolutions '''\
......
1088 1093
                    value = bytearray(cPickle.dumps(value, protocol=2))
1089 1094
                elif sql_type == 'boolean':
1090 1095
                    pass
1091
            sql_dict['f%s' % field.id] = value
1096
            sql_dict[get_field_id(field)] = value
1092 1097
            if field.store_display_value:
1093
                sql_dict['f%s_display' % field.id] = data.get('%s_display' % field.id)
1098
                sql_dict['%s_display' % get_field_id(field)] = data.get('%s_display' % field.id)
1094 1099
            if field.store_structured_value:
1095
                sql_dict['f%s_structured' % field.id] = bytearray(
1100
                sql_dict['%s_structured' % get_field_id(field)] = bytearray(
1096 1101
                        cPickle.dumps(data.get('%s_structured' % field.id), protocol=2))
1097 1102
        return sql_dict
1098 1103

  
......
1479 1484
            sql_type = SQL_TYPE_MAPPING.get(field.key, 'varchar')
1480 1485
            if sql_type is None:
1481 1486
                continue
1482
            data_fields.append('f%s' % field.id)
1487
            data_fields.append(get_field_id(field))
1483 1488
            if field.store_display_value:
1484
                data_fields.append('f%s_display' % field.id)
1489
                data_fields.append('%s_display' % get_field_id(field))
1485 1490
            if field.store_structured_value:
1486
                data_fields.append('f%s_structured' % field.id)
1491
                data_fields.append('%s_structured' % get_field_id(field))
1487 1492
        return data_fields
1488 1493

  
1489 1494
    @classmethod
......
1722 1727
            sql_type = SQL_TYPE_MAPPING.get(field.key, 'varchar')
1723 1728
            if sql_type is None:
1724 1729
                continue
1725
            data_fields.append('f%s' % field.id)
1730
            data_fields.append(get_field_id(field))
1726 1731
            if field.store_display_value:
1727
                data_fields.append('f%s_display' % field.id)
1732
                data_fields.append('%s_display' % get_field_id(field))
1728 1733
            if field.store_structured_value:
1729
                data_fields.append('f%s_structured' % field.id)
1734
                data_fields.append('%s_structured' % get_field_id(field))
1730 1735
        return data_fields
1731 1736

  
1732 1737
    @classmethod
wcs/workflows.py
267 267
        self.workflow = workflow
268 268
        if workflow.backoffice_fields_formdef and workflow.backoffice_fields_formdef.fields:
269 269
            self.fields = self.workflow.backoffice_fields_formdef.fields
270
            self.max_field_id = max([int(x.id[len(self.field_prefix):]) for x in self.fields])
271 270
        else:
272 271
            self.fields = []
273
            self.max_field_id = 0
274 272

  
275 273
    def get_new_field_id(self):
276
        self.max_field_id += 1
277
        return '%s%s' % (self.field_prefix, self.max_field_id)
274
        return '%s%s' % (self.field_prefix, str(uuid.uuid4()))
278 275

  
279 276
    def store(self):
280 277
        self.workflow.backoffice_fields_formdef = self
281
-