Projet

Général

Profil

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

Lauréline Guérin, 06 janvier 2022 16:46

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
2073 2073

  
2074 2074

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

  
2087 2086
    context['card_model_1_id'] = 11
2088 2087
    request = RequestFactory().get('/')
......
2093 2092
    result = cell.render(context)
2094 2093
    assert PyQuery(result).find('h3').text() == 'a'
2095 2094

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

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

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

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

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

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

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

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

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

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

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

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

  
2203

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

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

  
2103 2225
    result = cell.render(context)
2104 2226
    assert '&lt;b&gt;Foo&lt;/b&gt;' in result
2105 2227
    assert PyQuery(result).find('h3').text() == '<b>Foo</b> bar baz'
......
2119 2241
            {
2120 2242
                'varname': '@custom@',
2121 2243
                'template': '{{ card.fields.related|split:" "|join:"," }}',
2122
                'display_mode': 'value',
2244
                'display_mode': 'text',
2123 2245
            },
2124 2246
        ]
2125 2247
    }
2126
-