Projet

Général

Profil

0001-wcs-custom-field-for-card-cell-57134.patch

Lauréline Guérin, 26 octobre 2021 10:20

Télécharger (11 ko)

Voir les différences:

Subject: [PATCH] wcs: custom field for card cell (#57134)

 combo/apps/wcs/models.py                      | 17 +++++-
 combo/apps/wcs/templates/combo/wcs/card.html  | 12 +++++
 .../wcs/manager/card-infos-cell-form.html     |  6 +++
 combo/manager/static/js/combo.manager.js      | 36 +++++++++++--
 tests/test_wcs.py                             | 54 ++++++++++++++++++-
 5 files changed, 119 insertions(+), 6 deletions(-)
combo/apps/wcs/models.py
1016 1016

  
1017 1017
        if response.status_code == 200:
1018 1018
            extra_context['card'] = response.json()
1019
            context = Context(extra_context)
1019 1020
            if self.title_type == 'manual':
1020 1021
                try:
1021
                    extra_context['title'] = Template(self.custom_title).render(Context(extra_context))
1022
                    extra_context['title'] = Template(self.custom_title).render(context)
1022 1023
                except (VariableDoesNotExist, TemplateSyntaxError):
1023 1024
                    extra_context['title'] = ''
1024 1025
            # auto title or custom_title gives an empty title, use default value + card text
1025 1026
            if self.title_type == 'auto' or self.title_type == 'manual' and not extra_context['title']:
1026 1027
                extra_context['title'] = '%s - %s' % (self.cached_title, extra_context['card'].get('text'))
1027 1028

  
1029
            extra_context['card']['custom_fields'] = {}
1030
            if self.custom_schema:
1031
                for item in self.custom_schema.get('cells') or []:
1032
                    if item.get('varname') != '@custom@':
1033
                        continue
1034
                    if not item.get('template'):
1035
                        continue
1036
                    try:
1037
                        extra_context['card']['custom_fields'][item['template']] = Template(
1038
                            item['template']
1039
                        ).render(context)
1040
                    except (VariableDoesNotExist, TemplateSyntaxError):
1041
                        pass
1042

  
1028 1043
        return extra_context
1029 1044

  
1030 1045
    def get_default_form_class(self):
combo/apps/wcs/templates/combo/wcs/card.html
14 14
  <div class="{{ cell.custom_schema.grid_class }}">
15 15
    {% for item in cell.custom_schema.cells %}
16 16
      <div class="{{ item.cell_size|default:"" }}">
17
        {% if item.varname == "@custom@" and item.template %}
18
          {% with card.custom_fields|get:item.template as value %}
19
          {% if item.display_mode == "title" %}
20
          <h3>{{ value }}</h3>
21
          {% elif item.display_mode == "label" %}
22
            <p class="label">{{ value }}</p>
23
          {% elif item.display_mode == "value" %}
24
            <div class="value">{{ value }}</div>
25
          {% endif %}
26
          {% endwith %}
27
        {% else %}
17 28
        {% for field in schema.fields %}
18 29
          {% if field.varname == item.varname %}
19 30
          {% with card.fields|get:item.varname as value %}
......
29 40
          {% endwith %}
30 41
          {% endif %}
31 42
        {% endfor%}
43
        {% endif %}
32 44
      </div>
33 45
    {% endfor%}
34 46
  </div>
combo/apps/wcs/templates/combo/wcs/manager/card-infos-cell-form.html
44 44
        <select name="card_field_varname"></select>
45 45
      </label>
46 46
    </p>
47
    <p>
48
      <label>
49
        {% trans "Value template" %}
50
        <input name="card_field_template" />
51
      </label>
52
    </p>
47 53
    <p>
48 54
      <label>
49 55
        {% trans "Display" %}
combo/manager/static/js/combo.manager.js
472 472
  //  Grid cell methods
473 473
  grid_cell__init_form: function() {
474 474
    this.grid_cell_form.varname = this.grid_cell_form[0];
475
    this.grid_cell_form.display_mode = this.grid_cell_form[1];
476
    this.grid_cell_form.size = this.grid_cell_form[2];
475
    this.grid_cell_form.template = this.grid_cell_form[1];
476
    this.grid_cell_form.display_mode = this.grid_cell_form[2];
477
    this.grid_cell_form.size = this.grid_cell_form[3];
477 478
    const varname_select = this.grid_cell_form.varname;
478 479
    this.cardSchema.fields.forEach(function(el, id) {
479 480
      if (el.varname) {
......
483 484
          .appendTo(varname_select);
484 485
      }
485 486
    })
487
    // add a field 'Custom', so the user can define a template
488
    $('<option />')
489
      .attr('value', '@custom@')
490
      .text(gettext('Custom'))
491
      .appendTo(varname_select);
492

  
493
    // hide or show template, change mode options, depending on selected field
494
    const _label_and_value_option = this.grid_cell_form.display_mode[0];
495
    $(document).on('change', 'select[name="card_field_varname"]', function() {
496
      if ($(this).val() == '@custom@') {
497
        $('input[name="card_field_template"]').parent().show();
498
        $('select[name="display_mode"] option[value="label-and-value"]').remove();
499
      } else {
500
        $('input[name="card_field_template"]').parent().hide();
501
        $(_label_and_value_option).prependTo($('select[name="display_mode"]'));
502
      }
503
    });
486 504
  },
487 505
  grid_cell__form_dialog: function(button_label, callback){
488 506
    const _self = this;
489 507
    $(this.grid_cell_form).dialog({
490 508
      modal: true,
491 509
      width: 'auto',
510
      open: function( event, ui ) {
511
        $('select[name="card_field_varname"]').change();
512
      },
492 513
      buttons: [
493 514
        {
494 515
          text: gettext('Cancel'),
......
532 553
    // set cell text
533 554
    let schema_field = _self.field_with_varname(schema_cell.varname);
534 555
    let cell_text = "";
535
    if (schema_field) {
536
      cell_text += '<span class="' + schema_cell.display_mode + '">' + schema_field.label + '</span>';
556
    if (schema_field || schema_cell.varname == '@custom@') {
557
      if (schema_cell.varname == '@custom@') {
558
        cell_text += '<span class="' + schema_cell.display_mode + '">' + schema_cell.template + ' (' + gettext('Custom') + ')</span>';
559
      } else {
560
        cell_text += '<span class="' + schema_cell.display_mode + '">' + schema_field.label + '</span>';
561
      }
537 562
      cell_text += '<span class="cell-meta">';
538 563
      let cell_display_mode_label = $(this.grid_cell_form).find('select[name="display_mode"] option[value="' + schema_cell.display_mode + '"]').text();
539 564
      cell_text += '<span class="cell-display-mode-label">' + cell_display_mode_label + '</span>';
540 565
      let cell_size_label = $(this.grid_cell_form).find('select[name="cell_size"] option[value="' + schema_cell.cell_size + '"]').text();
541 566
      cell_text += '<span class="cell-size-label">' + gettext('Size:') + ' ' + cell_size_label + '</span>';
542 567
      cell_text += '</span>';
568
    } else if (schema_cell.varname == '@custom@') {
543 569
    } else {
544 570
      cell_text += '<span class="warning">' + gettext('Deleted field:') + ' ' + schema_cell.varname + '</span>';
545 571
    }
......
564 590
  grid_cell__edit: function(grid_cell) {
565 591
    const _self = this;
566 592
    this.grid_cell_form.varname.value = grid_cell.dataset.varname;
593
    this.grid_cell_form.template.value = grid_cell.dataset.template;
567 594
    this.grid_cell_form.size.value = grid_cell.dataset.cell_size;
568 595
    this.grid_cell_form.display_mode.value = grid_cell.dataset.display_mode;
569 596
    const cell_id = $(grid_cell).index();
......
576 603
  },
577 604
  grid_cell__set_schema: function(form_datas, schema_cell) {
578 605
    schema_cell.varname = form_datas.card_field_varname;
606
    schema_cell.template = form_datas.card_field_template;
579 607
    schema_cell.cell_size = form_datas.cell_size;
580 608
    schema_cell.display_mode = form_datas.display_mode;
581 609
    return schema_cell
tests/test_wcs.py
1876 1876
    page = Page.objects.create(title='xxx', template_name='standard')
1877 1877
    cell = WcsCardInfosCell(page=page, placeholder='content', order=0)
1878 1878
    cell.carddef_reference = 'default:card_model_1'
1879
    cell.custom_title = 'Foo bar {{ card.fields.title }}'
1880 1879
    cell.save()
1881 1880

  
1882 1881
    context['card_model_1_id'] = 11
......
1901 1900
    )
1902 1901

  
1903 1902

  
1903
@mock.patch('combo.apps.wcs.utils.requests.send', side_effect=mocked_requests_send)
1904
def test_card_cell_render_custom_schema(mock_send, context):
1905
    page = Page.objects.create(title='xxx', template_name='standard')
1906
    cell = WcsCardInfosCell(page=page, placeholder='content', order=0)
1907
    cell.carddef_reference = 'default:card_model_1'
1908
    cell.custom_schema = {
1909
        'cells': [
1910
            {'varname': 'fielda', 'display_mode': 'title'},
1911
        ]
1912
    }
1913
    cell.save()
1914

  
1915
    context['card_model_1_id'] = 11
1916
    context['synchronous'] = True  # to get fresh content
1917

  
1918
    result = cell.render(context)
1919
    assert PyQuery(result).find('h3').text() == 'a'
1920

  
1921
    # custom field
1922
    cell.custom_schema = {
1923
        'cells': [
1924
            {'varname': '@custom@', 'template': 'Foo bar baz', 'display_mode': 'title'},
1925
        ]
1926
    }
1927
    cell.save()
1928
    result = cell.render(context)
1929
    assert PyQuery(result).find('h3').text() == 'Foo bar baz'
1930

  
1931
    # test context
1932
    cell.custom_schema['cells'][0][
1933
        'template'
1934
    ] = '{{ card.fields.fielda }} - {{ card.fields.related }} ({{ card.fields.related_structured.id }})'
1935
    cell.save()
1936
    result = cell.render(context)
1937
    assert PyQuery(result).find('h3').text() == 'a - Foo Bar (42)'
1938

  
1939
    # test display_mode & filters in template
1940
    cell.custom_schema = {
1941
        'cells': [
1942
            {'varname': '@custom@', 'template': 'Foo bar baz', 'display_mode': 'label'},
1943
            {
1944
                'varname': '@custom@',
1945
                'template': '{{ card.fields.related|split:" "|join:"," }}',
1946
                'display_mode': 'value',
1947
            },
1948
        ]
1949
    }
1950
    cell.save()
1951
    result = cell.render(context)
1952
    assert PyQuery(result).find('p.label').text() == 'Foo bar baz'
1953
    assert PyQuery(result).find('div.value').text() == 'Foo,Bar'
1954

  
1955

  
1904 1956
@mock.patch('combo.apps.wcs.utils.requests.send', side_effect=mocked_requests_send)
1905 1957
def test_card_cell_render_identifier(mock_send, context, nocache):
1906 1958
    page = Page.objects.create(title='xxx', template_name='standard')
1907
-