0001-backoffice-allow-adding-custom-user-column-to-manage.patch
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 |
- |