Projet

Général

Profil

0003-wcs-adapt-card-display-with-new-schema-58800.patch

Lauréline Guérin, 10 janvier 2022 14:10

Télécharger (10,6 ko)

Voir les différences:

Subject: [PATCH 3/3] wcs: adapt card display with new schema (#58800)

 combo/apps/wcs/models.py                     |   3 +
 combo/apps/wcs/templates/combo/wcs/card.html |  31 ++--
 tests/test_wcs.py                            | 152 +++++++++++++++++--
 3 files changed, 158 insertions(+), 28 deletions(-)
combo/apps/wcs/models.py
1013 1013
    def get_cell_extra_context(self, context):
1014 1014
        extra_context = super().get_cell_extra_context(context)
1015 1015
        extra_context['schema'] = self.cached_json
1016
        extra_context['fields_by_varnames'] = {
1017
            i['varname']: i for i in (self.cached_json.get('fields') or []) if i.get('varname')
1018
        }
1016 1019
        # default value used if card is not found
1017 1020
        if self.title_type in ['auto', 'manual']:
1018 1021
            extra_context['title'] = self.cached_title
combo/apps/wcs/templates/combo/wcs/card.html
12 12
<div class="cell--body">
13 13
{% spaceless %}
14 14
{% if cell.custom_schema %}
15
  <div class="{{ cell.custom_schema.grid_class }}">
16
    {% for item in cell.custom_schema.cells %}
15
  {% with cell.get_custom_schema as custom_schema %}
16
  <div class="{{ custom_schema.grid_class }}">
17
    {% for item in custom_schema.cells %}
17 18
      <div class="{{ item.cell_size|default:"" }}">
18 19
        {% if item.varname == "@custom@" and item.template %}
19 20
          {% with card.custom_fields|get:item.template|force_escape as value %}
......
21 22
          <h3>{{ value }}</h3>
22 23
          {% elif item.display_mode == "label" %}
23 24
            <p class="label">{{ value }}</p>
24
          {% elif item.display_mode == "value" %}
25
          {% elif item.display_mode == "text" %}
25 26
            <div class="value">{{ value }}</div>
26 27
          {% endif %}
27 28
          {% endwith %}
28 29
        {% else %}
29
        {% for field in schema.fields %}
30
          {% if field.varname == item.varname %}
30
          {% with fields_by_varnames|get:item.varname as field %}
31 31
          {% with card.fields|get:item.varname as value %}
32 32
            {% if item.display_mode == "title" %}
33
              {% if item.field_content == "label" %}
34
              <h3>{{ field.label }}</h3>
35
              {% elif item.field_content == "value" %}
33 36
              <h3>{% include "combo/wcs/card-field-value.html" with mode="inline" %}</h3>
34
            {% endif %}
35
            {% if item.display_mode == "label" or item.display_mode == "label-and-value" %}
36
              <p class="label">{{ field.label }}</p>
37
            {% endif %}
38
            {% if item.display_mode == "value" or item.display_mode == "label-and-value" %}
39
              {% include "combo/wcs/card-field-value.html" %}
37
              {% endif %}
38
            {% elif item.display_mode == "text" %}
39
              {% if item.field_content == "label" or item.field_content == "label-and-value" %}
40
                <p class="label">{{ field.label }}</p>
41
              {% endif %}
42
              {% if item.field_content == "value" or item.field_content == "label-and-value" %}
43
                {% include "combo/wcs/card-field-value.html" %}
44
              {% endif %}
40 45
            {% endif %}
41 46
          {% endwith %}
42
          {% endif %}
43
        {% endfor%}
47
          {% endwith %}
44 48
        {% endif %}
45 49
      </div>
46 50
    {% endfor%}
47 51
  </div>
52
  {% endwith %}
48 53

  
49 54
{% else %}
50 55
{% for field in schema.fields %}
tests/test_wcs.py
2071 2071

  
2072 2072

  
2073 2073
@mock.patch('combo.apps.wcs.utils.requests.send', side_effect=mocked_requests_send)
2074
def test_card_cell_render_custom_schema(mock_send, context, app):
2074
def test_card_cell_render_custom_schema_card_field(mock_send, context):
2075 2075
    page = Page.objects.create(title='xxx', template_name='standard')
2076
    cell = WcsCardInfosCell(page=page, placeholder='content', order=0)
2077
    cell.carddef_reference = 'default:card_model_1'
2078
    cell.custom_schema = {
2079
        'cells': [
2080
            {'varname': 'fielda', 'display_mode': 'title'},
2081
        ]
2082
    }
2083
    cell.save()
2076
    cell = WcsCardInfosCell.objects.create(
2077
        page=page,
2078
        placeholder='content',
2079
        order=0,
2080
        carddef_reference='default:card_model_1',
2081
        custom_schema={'cells': [{'varname': 'fielda', 'field_content': 'value', 'display_mode': 'title'}]},
2082
    )
2084 2083

  
2085 2084
    context['card_model_1_id'] = 11
2086 2085
    request = RequestFactory().get('/')
......
2091 2090
    result = cell.render(context)
2092 2091
    assert PyQuery(result).find('h3').text() == 'a'
2093 2092

  
2094
    # custom field
2095
    cell.custom_schema = {
2096
        'cells': [
2097
            {'varname': '@custom@', 'template': '<b>Foo</b> bar baz', 'display_mode': 'title'},
2098
        ]
2093
    cell.custom_schema['cells'][0] = {'varname': 'fielda', 'field_content': 'label', 'display_mode': 'title'}
2094
    cell.save()
2095
    result = cell.render(context)
2096
    assert PyQuery(result).find('h3').text() == 'Field A'
2097

  
2098
    cell.custom_schema['cells'][0] = {'varname': 'fielda', 'field_content': 'label', 'display_mode': 'text'}
2099
    cell.save()
2100
    result = cell.render(context)
2101
    assert PyQuery(result).find('p.label').text() == 'Field A'
2102

  
2103
    cell.custom_schema['cells'][0] = {'varname': 'fielda', 'field_content': 'value', 'display_mode': 'text'}
2104
    cell.save()
2105
    result = cell.render(context)
2106
    assert PyQuery(result).find('span.value').text() == 'a'
2107

  
2108
    cell.custom_schema['cells'][0] = {
2109
        'varname': 'fielda',
2110
        'field_content': 'label-and-value',
2111
        'display_mode': 'text',
2112
    }
2113
    cell.save()
2114
    result = cell.render(context)
2115
    assert PyQuery(result).find('p.label').text() == 'Field A'
2116
    assert PyQuery(result).find('span.value').text() == 'a'
2117

  
2118
    cell.custom_schema['cells'][0] = {
2119
        'varname': 'fieldb',
2120
        'field_content': 'label-and-value',
2121
        'display_mode': 'text',
2122
    }
2123
    cell.save()
2124
    result = cell.render(context)
2125
    assert PyQuery(result).find('p.label').text() == 'Field B'
2126
    assert PyQuery(result).find('span.value').text() == 'yes'
2127

  
2128
    cell.custom_schema['cells'][0] = {
2129
        'varname': 'fieldc',
2130
        'field_content': 'label-and-value',
2131
        'display_mode': 'text',
2132
    }
2133
    cell.save()
2134
    result = cell.render(context)
2135
    assert PyQuery(result).find('p.label').text() == 'Field C'
2136
    assert PyQuery(result).find('span.value').text() == 'Sept. 28, 2020'
2137

  
2138
    cell.custom_schema['cells'][0] = {
2139
        'varname': 'related',
2140
        'field_content': 'label-and-value',
2141
        'display_mode': 'text',
2099 2142
    }
2100 2143
    cell.save()
2144
    result = cell.render(context)
2145
    assert PyQuery(result).find('p.label').text() == 'Related'
2146
    assert PyQuery(result).find('span.value').text() == 'Foo Bar'
2147

  
2148
    cell.custom_schema['cells'][0] = {
2149
        'varname': 'fieldd',
2150
        'field_content': 'label-and-value',
2151
        'display_mode': 'text',
2152
    }
2153
    cell.save()
2154
    result = cell.render(context)
2155
    assert PyQuery(result).find('p.label').text() == 'Field D'
2156
    assert PyQuery(result).find('span.value').text() == 'file.pdf'
2157

  
2158
    cell.custom_schema['cells'][0] = {
2159
        'varname': 'fielde',
2160
        'field_content': 'label-and-value',
2161
        'display_mode': 'text',
2162
    }
2163
    cell.save()
2164
    result = cell.render(context)
2165
    assert PyQuery(result).find('p.label').text() == 'Field E'
2166
    assert PyQuery(result).find('div.value p:first-child').text().strip() == 'lorem<strong>ipsum'
2167
    assert PyQuery(result).find('div.value p:last-child').text().strip() == 'hello world'
2168

  
2169
    cell.custom_schema['cells'][0] = {
2170
        'varname': 'fieldf',
2171
        'field_content': 'label-and-value',
2172
        'display_mode': 'text',
2173
    }
2174
    cell.save()
2175
    result = cell.render(context)
2176
    assert PyQuery(result).find('p.label').text() == 'Field F'
2177
    assert PyQuery(result).find('div.value pre').text() == 'lorem<strong>ipsum hello world'
2178

  
2179
    cell.custom_schema['cells'][0] = {
2180
        'varname': 'fieldg',
2181
        'field_content': 'label-and-value',
2182
        'display_mode': 'text',
2183
    }
2184
    cell.save()
2185
    result = cell.render(context)
2186
    assert PyQuery(result).find('p.label').text() == 'Field G'
2187
    assert PyQuery(result).find('span.value a').text() == 'test@localhost'
2188
    assert PyQuery(result).find('span.value a').attr['href'] == 'mailto:test@localhost'
2189

  
2190
    cell.custom_schema['cells'][0] = {
2191
        'varname': 'fieldh',
2192
        'field_content': 'label-and-value',
2193
        'display_mode': 'text',
2194
    }
2195
    cell.save()
2196
    result = cell.render(context)
2197
    assert PyQuery(result).find('p.label').text() == 'Field H'
2198
    assert PyQuery(result).find('span.value a').text() == 'https://www.example.net/'
2199
    assert PyQuery(result).find('span.value a').attr['href'] == 'https://www.example.net/'
2200

  
2201

  
2202
@mock.patch('combo.apps.wcs.utils.requests.send', side_effect=mocked_requests_send)
2203
def test_card_cell_render_custom_schema_custom_entry(mock_send, context, app):
2204
    page = Page.objects.create(title='xxx', template_name='standard')
2205
    cell = WcsCardInfosCell.objects.create(
2206
        page=page,
2207
        placeholder='content',
2208
        order=0,
2209
        carddef_reference='default:card_model_1',
2210
        custom_schema={
2211
            'cells': [
2212
                {'varname': '@custom@', 'template': '<b>Foo</b> bar baz', 'display_mode': 'title'},
2213
            ]
2214
        },
2215
    )
2216

  
2217
    context['card_model_1_id'] = 11
2218
    request = RequestFactory().get('/')
2219
    cell.modify_global_context(context, request)
2220
    cell.repeat_index = 0
2221
    context['synchronous'] = True  # to get fresh content
2222

  
2101 2223
    result = cell.render(context)
2102 2224
    assert '&lt;b&gt;Foo&lt;/b&gt;' in result
2103 2225
    assert PyQuery(result).find('h3').text() == '<b>Foo</b> bar baz'
......
2117 2239
            {
2118 2240
                'varname': '@custom@',
2119 2241
                'template': '{{ card.fields.related|split:" "|join:"," }}',
2120
                'display_mode': 'value',
2242
                'display_mode': 'text',
2121 2243
            },
2122 2244
        ]
2123 2245
    }
2124
-