0002-sql-get-display-structured-columns-for-related-field.patch
tests/backoffice_pages/test_columns.py | ||
---|---|---|
393 | 393 |
resp_csv = resp.click('Export a Spreadsheet') |
394 | 394 |
resp_csv.form['format'] = 'csv' |
395 | 395 |
resp_csv = resp_csv.form.submit('submit') |
396 |
assert resp_csv.text.splitlines()[1].endswith(',"plop","2020-04-24","Yes","aa"') |
|
396 |
assert resp_csv.text.splitlines()[1].endswith(',"plop","2020-04-24","Yes","A","aa"')
|
|
397 | 397 | |
398 | 398 |
resp_map = resp.click('Plot on a Map') |
399 | 399 |
geojson_url = re.findall(r'data-geojson-url="(.*?)"', resp_map.text)[0] |
wcs/backoffice/management.py | ||
---|---|---|
3911 | 3911 |
class RelatedField: |
3912 | 3912 |
is_related_field = True |
3913 | 3913 |
type = 'related-field' |
3914 |
store_display_value = None |
|
3915 | 3914 |
varname = None |
3915 |
related_field = None |
|
3916 | 3916 | |
3917 | 3917 |
def __init__(self, carddef, field, parent_field): |
3918 | 3918 |
self.carddef = carddef |
3919 | 3919 |
self.related_field = field |
3920 | 3920 |
self.parent_field = parent_field |
3921 | 3921 |
self.parent_field_id = parent_field.id |
3922 |
self.key = self.related_field.key |
|
3922 | 3923 | |
3923 | 3924 |
@property |
3924 | 3925 |
def id(self): |
... | ... | |
3940 | 3941 |
self.related_field.label, |
3941 | 3942 |
) |
3942 | 3943 | |
3944 |
@property |
|
3945 |
def store_display_value(self): |
|
3946 |
return self.related_field.store_display_value |
|
3947 | ||
3948 |
@property |
|
3949 |
def store_structured_value(self): |
|
3950 |
return self.related_field.store_structured_value |
|
3951 | ||
3943 | 3952 |
def get_view_value(self, value, **kwargs): |
3944 | 3953 |
if value is None: |
3945 | 3954 |
return '' |
... | ... | |
3953 | 3962 |
return self.get_view_value(value) |
3954 | 3963 | |
3955 | 3964 |
def get_csv_heading(self): |
3965 |
if self.related_field: |
|
3966 |
return self.related_field.get_csv_heading() |
|
3956 | 3967 |
return [self.label] |
3957 | 3968 | |
3958 | 3969 |
def get_csv_value(self, value, **kwargs): |
3970 |
if self.related_field: |
|
3971 |
return self.related_field.get_csv_value(value, **kwargs) |
|
3959 | 3972 |
return [self.get_view_value(value)] |
3960 | 3973 | |
3961 | 3974 |
def get_column_field_id(self): |
3962 | 3975 |
from wcs.sql import get_field_id |
3963 | 3976 | |
3964 |
column_field_id = get_field_id(self.related_field) |
|
3965 |
if self.related_field.store_display_value: |
|
3966 |
column_field_id += '_display' |
|
3967 |
return column_field_id |
|
3977 |
return get_field_id(self.related_field) |
|
3968 | 3978 | |
3969 | 3979 | |
3970 | 3980 |
class UserRelatedField(RelatedField): |
3971 | 3981 |
# it is named 'user-label' and not 'user' for compatibility with existing |
3972 | 3982 |
# listings, as the 'classic' user column is named 'user-label'. |
3973 | 3983 |
parent_field_id = 'user-label' |
3984 |
store_display_value = None |
|
3985 |
store_structured_value = None |
|
3974 | 3986 | |
3975 | 3987 |
def __init__(self, field): |
3976 | 3988 |
self.related_field = field |
3989 |
self.key = field.key |
|
3977 | 3990 | |
3978 | 3991 |
def __repr__(self): |
3979 | 3992 |
return '<%s (field: %r)>' % ( |
... | ... | |
3990 | 4003 |
# custom user-label column, targetting the "name" (= full name) column |
3991 | 4004 |
# of the users table |
3992 | 4005 |
id = 'user-label' |
4006 |
key = 'user-label' |
|
3993 | 4007 |
type = 'user-label' |
3994 | 4008 |
varname = 'user_label' |
3995 | 4009 |
has_relations = True |
wcs/formdata.py | ||
---|---|---|
878 | 878 |
if field.type == 'anonymised': |
879 | 879 |
return _('Yes') if self.anonymised else _('No') |
880 | 880 | |
881 |
field_value = data.get(field.id) |
|
881 |
field_id = field.id |
|
882 |
field_value = data.get(field_id) |
|
882 | 883 |
if field_value is None: |
883 | 884 |
return '' |
884 | 885 |
if field.type in ['date', 'bool']: |
... | ... | |
888 | 889 |
if max_length is not None: |
889 | 890 |
# if max_length is set the target is a backoffice listing/table, |
890 | 891 |
# return an html value, appropriately shortened. |
891 |
field_value = data.get('%s_display' % field.id, field_value)
|
|
892 |
field_value = data.get('%s_display' % field_id, field_value)
|
|
892 | 893 |
return field.get_view_short_value(field_value, max_length) |
893 | 894 |
else: |
894 | 895 |
# otherwise return the actual "raw" field value |
wcs/sql.py | ||
---|---|---|
2228 | 2228 | |
2229 | 2229 |
column_field_id = field.get_column_field_id() |
2230 | 2230 |
columns.append('%s.%s' % (carddef_table_alias, column_field_id)) |
2231 |
extra_fields.append(field.id) |
|
2231 |
if field.store_display_value: |
|
2232 |
columns.append('%s.%s_display' % (carddef_table_alias, column_field_id)) |
|
2233 |
if field.store_structured_value: |
|
2234 |
columns.append('%s.%s_structured' % (carddef_table_alias, column_field_id)) |
|
2235 |
extra_fields.append(field) |
|
2232 | 2236 | |
2233 | 2237 |
conn, cur = get_connection_and_cursor() |
2234 | 2238 |
if cls._numerical_id: |
... | ... | |
2978 | 2982 |
o.data = cls._row2obdata(row, cls._formdef) |
2979 | 2983 |
if extra_fields: |
2980 | 2984 |
# extra fields are tuck at the end |
2981 |
for i, field_id in enumerate(reversed(extra_fields)): |
|
2982 |
o.data[field_id] = row[-(i + 1)] |
|
2985 |
# count number of columns |
|
2986 |
count = ( |
|
2987 |
len(extra_fields) |
|
2988 |
+ len([x for x in extra_fields if x.store_display_value]) |
|
2989 |
+ len([x for x in extra_fields if x.store_structured_value]) |
|
2990 |
) |
|
2991 |
i = len(row) - count |
|
2992 |
for field in extra_fields: |
|
2993 |
coldata, i = cls._col2obdata(row, i, field) |
|
2994 |
o.data.update(coldata) |
|
2983 | 2995 |
del o._last_update_time |
2984 | 2996 |
return o |
2985 | 2997 | |
2986 |
- |