Projet

Général

Profil

0002-sql-get-display-structured-columns-for-related-field.patch

Frédéric Péters, 18 décembre 2022 11:30

Télécharger (6,35 ko)

Voir les différences:

Subject: [PATCH 2/5] sql: get display/structured columns for related fields
 (#72312)

 tests/backoffice_pages/test_columns.py |  2 +-
 wcs/backoffice/management.py           | 24 +++++++++++++++++++-----
 wcs/formdata.py                        |  5 +++--
 wcs/sql.py                             | 18 +++++++++++++++---
 4 files changed, 38 insertions(+), 11 deletions(-)
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
-