0001-wcs-custom-field-for-card-cell-57134.patch
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 |
- |