Projet

Général

Profil

0001-backoffice-allow-adding-custom-user-column-to-manage.patch

Frédéric Péters, 31 juillet 2020 15:14

Télécharger (8,32 ko)

Voir les différences:

Subject: [PATCH] backoffice: allow adding custom user column to management
 tables (#40031)

 tests/test_backoffice_pages.py | 40 ++++++++++++++++++++++++++++++++++
 wcs/backoffice/management.py   | 37 ++++++++++++++++++++++++++-----
 wcs/sql.py                     | 26 +++++++++++++---------
 wcs/users.py                   |  5 +++++
 4 files changed, 93 insertions(+), 15 deletions(-)
tests/test_backoffice_pages.py
647 647
    assert 'download?f=4&thumbnail=1' not in resp.text
648 648

  
649 649

  
650
def test_backoffice_user_columns(pub):
651
    create_superuser(pub)
652
    create_environment(pub)
653

  
654
    from wcs.admin.settings import UserFieldsFormDef
655
    user_formdef = UserFieldsFormDef(pub)
656
    user_formdef.fields.append(fields.StringField(id='_first_name', label='name', type='string'))
657
    user_formdef.fields.append(fields.StringField(id='3', label='test', type='string'))
658
    user_formdef.store()
659
    pub.cfg['users']['field_name'] = ['3', '4']
660
    pub.write_cfg()
661

  
662
    user1 = pub.user_class(name='userA')
663
    user1.form_data = {'_first_name': 'toto', '3': 'nono'}
664
    user1.set_attributes_from_formdata(user1.form_data)
665
    user1.store()
666
    user2 = pub.user_class(name='userB')
667
    user2.form_data = {'_first_name': 'tutu', '3': 'nunu'}
668
    user2.set_attributes_from_formdata(user2.form_data)
669
    user2.store()
670

  
671
    formdef = FormDef.get_by_urlname('form-title')
672
    for i, formdata in enumerate(formdef.data_class().select()):
673
        formdata.user_id = user1.id if bool(i % 2) else user2.id
674
        formdata.store()
675

  
676
    app = login(get_app(pub))
677
    resp = app.get('/backoffice/management/form-title/')
678
    assert resp.text.count('</th>') == 8  # six columns
679

  
680
    if not pub.is_using_postgresql():
681
        # no support for relation columns unless using SQL
682
        assert 'user-label$3' not in resp.forms['listing-settings'].fields
683
        return
684
    resp.forms['listing-settings']['user-label$3'].checked = True
685
    resp = resp.forms['listing-settings'].submit()
686
    assert resp.text.count('</th>') == 9
687
    assert '<td>nono</td' in resp
688

  
689

  
650 690
def test_backoffice_card_field_columns(pub):
651 691
    user = create_superuser(pub)
652 692
    create_environment(pub)
wcs/backoffice/management.py
1427 1427
                attrs = ''
1428 1428
                if isinstance(field, RelatedField):
1429 1429
                    classnames = 'related-field'
1430
                    if field.parent_field.id in seen_parents:
1430
                    if field.parent_field_id in seen_parents:
1431 1431
                        classnames += ' collapsed'
1432
                    attrs = 'data-relation-attr="%s"' % field.parent_field.id
1432
                    attrs = 'data-relation-attr="%s"' % field.parent_field_id
1433 1433
                elif getattr(field, 'has_relations', False):
1434 1434
                    classnames = 'has-relations-field'
1435 1435
                    attrs = 'data-field-id="%s"' % field.id
......
1537 1537
            yield FakeField('submission_agent', 'submission_agent', _('Submission By'))
1538 1538
        yield FakeField('time', 'time', _('Created'))
1539 1539
        yield FakeField('last_update_time', 'last_update_time', _('Last Modified'))
1540

  
1541
        # user fields
1540 1542
        yield FakeField('user-label', 'user-label', _('User Label'))
1543
        if get_publisher().is_using_postgresql():
1544
            for field in get_publisher().user_class.get_fields():
1545
                if not hasattr(field, 'get_view_value'):
1546
                    continue
1547
                field.has_relations = True
1548
                yield UserRelatedField(field)
1549

  
1541 1550
        for field in self.formdef.get_all_fields():
1542 1551
            yield field
1543 1552
            if not get_publisher().is_using_postgresql():
......
3160 3169
    def get_csv_value(self, element, **kwargs):
3161 3170
        return [element]
3162 3171

  
3172
    @property
3173
    def has_relations(self):
3174
        return bool(self.id == 'user-label')
3175

  
3163 3176

  
3164 3177
class RelatedField:
3165 3178
    is_related_field = True
......
3169 3182

  
3170 3183
    def __init__(self, carddef, field, parent_field):
3171 3184
        self.carddef = carddef
3172
        self.carddef_field = field
3185
        self.related_field = field
3173 3186
        self.parent_field = parent_field
3187
        self.parent_field_id = parent_field.id
3174 3188

  
3175 3189
    @property
3176 3190
    def id(self):
3177
        return '%s$%s' % (self.parent_field.id, self.carddef_field.id)
3191
        return '%s$%s' % (self.parent_field_id, self.related_field.id)
3178 3192

  
3179 3193
    @property
3180 3194
    def label(self):
3181
        return '%s - %s' % (self.parent_field.label, self.carddef_field.label)
3195
        return '%s - %s' % (self.parent_field.label, self.related_field.label)
3182 3196

  
3183 3197
    def get_view_value(self, value, **kwargs):
3184 3198
        if value is None:
......
3199 3213
        return [self.get_view_value(value)]
3200 3214

  
3201 3215

  
3216
class UserRelatedField(RelatedField):
3217
    # it is named 'user-label' and not 'user' for compatibility with existing
3218
    # listings, as the 'classic' user column is named 'user-label'.
3219
    parent_field_id = 'user-label'
3220

  
3221
    def __init__(self, field):
3222
        self.related_field = field
3223

  
3224
    @property
3225
    def label(self):
3226
        return _('%s of User') % self.related_field.label
3227

  
3228

  
3202 3229
def do_graphs_section(period_start=None, period_end=None, criterias=None):
3203 3230
    from wcs import sql
3204 3231
    r = TemplateIO(html=True)
wcs/sql.py
1156 1156
            for field in fields:
1157 1157
                if not getattr(field, 'is_related_field', False):
1158 1158
                    continue
1159
                carddef_dataclass = field.carddef.data_class()
1160
                carddef_table_alias = 't%s' % id(field.carddef)
1161
                carddef_table_decl = 'LEFT JOIN %s AS %s ON (CAST(%s.%s AS INTEGER) = %s.id)' % (
1162
                        carddef_dataclass._table_name,
1163
                        carddef_table_alias,
1164
                        cls._table_name,
1165
                        get_field_id(field.parent_field),
1166
                        carddef_table_alias)
1159
                if field.parent_field_id == 'user-label':
1160
                    # relation to user table
1161
                    carddef_table_alias = 'users'
1162
                    carddef_table_decl = 'LEFT JOIN users ON (CAST(%s.user_id AS INTEGER) = users.id)' % cls._table_name
1163
                else:
1164
                    carddef_dataclass = field.carddef.data_class()
1165
                    carddef_table_alias = 't%s' % id(field.carddef)
1166
                    carddef_table_decl = 'LEFT JOIN %s AS %s ON (CAST(%s.%s AS INTEGER) = %s.id)' % (
1167
                            carddef_dataclass._table_name,
1168
                            carddef_table_alias,
1169
                            cls._table_name,
1170
                            get_field_id(field.parent_field),
1171
                            carddef_table_alias)
1172

  
1167 1173
                if carddef_table_decl not in tables:
1168 1174
                    tables.append(carddef_table_decl)
1169 1175

  
1170
                column_field_id = get_field_id(field.carddef_field)
1171
                if field.carddef_field.store_display_value:
1176
                column_field_id = get_field_id(field.related_field)
1177
                if field.related_field.store_display_value:
1172 1178
                    column_field_id += '_display'
1173 1179
                columns.append('%s.%s' % (carddef_table_alias, column_field_id))
1174 1180
                extra_fields.append(field.id)
wcs/users.py
80 80
        from .admin.settings import UserFieldsFormDef
81 81
        return UserFieldsFormDef()
82 82

  
83
    @classmethod
84
    def get_fields(cls):
85
        formdef = cls.get_formdef()
86
        return formdef.fields or []
87

  
83 88
    @property
84 89
    def ascii_name(self):
85 90
        return simplify(self.get_display_name(), space=' ')
86
-