wcs: add display_mode option for card cell (#68063)

This commit is contained in:
Lauréline Guérin 2022-08-11 11:22:37 +02:00
parent 25da1b91b7
commit c832299962
No known key found for this signature in database
GPG Key ID: 1FAB9B9B4F93D473
5 changed files with 149 additions and 46 deletions

View File

@ -77,7 +77,6 @@ class WcsCardInfoCellForm(forms.ModelForm):
with_user = forms.BooleanField(
label=_('Restrict to cards accessible to the user'), required=False, initial=True
)
customize_display = forms.BooleanField(label=_('Customize display'), required=False)
related_card_path = forms.ChoiceField(label=_('Card Identifier'), required=False)
class Meta:
@ -86,35 +85,19 @@ class WcsCardInfoCellForm(forms.ModelForm):
'carddef_reference',
'related_card_path',
'card_ids',
'limit',
'only_for_user',
'custom_schema',
)
widgets = {
'card_ids': forms.TextInput(attrs={'class': 'text-wide'}),
'custom_schema': forms.HiddenInput(),
}
def __init__(self, *args, **kwargs):
instance = kwargs['instance']
initial = kwargs.pop('initial', {})
initial['with_user'] = not instance.without_user
if kwargs.get('data'):
kwargs['data'] = kwargs['data'].copy() # QueryDict -> dict
# make sure there's a value for custom_schema as postgres.forms.jsonb
# would crash on None.
custom_schema_name = '%s-custom_schema' % kwargs.get('prefix')
if custom_schema_name not in kwargs['data']:
kwargs['data'][custom_schema_name] = '{}'
super().__init__(initial=initial, *args, **kwargs)
card_models = get_wcs_options('/api/cards/@list', include_custom_views=True)
self.fields['carddef_reference'].widget = forms.Select(choices=card_models)
if self.instance.custom_schema:
self.initial['customize_display'] = True
self.initial['custom_schema'] = self.instance.get_custom_schema()
if not self.instance.cached_json:
del self.fields['customize_display']
del self.fields['custom_schema']
self.fields['related_card_path'].choices = []
with_sub_slug = any(p.sub_slug for p in self.instance.page.get_parents_and_self())
@ -132,8 +115,6 @@ class WcsCardInfoCellForm(forms.ModelForm):
def save(self, *args, **kwargs):
super().save(*args, **kwargs)
if not self.cleaned_data.get('customize_display'):
self.instance.custom_schema = {}
if self.instance.related_card_path:
self.instance.card_ids = ''
if self.instance.related_card_path == '--':
@ -151,6 +132,48 @@ class WcsCardInfoCellForm(forms.ModelForm):
return cleaned_data
class WcsCardInfoCellDisplayForm(forms.ModelForm):
customize_display = forms.BooleanField(label=_('Customize display'), required=False)
class Meta:
model = WcsCardInfosCell
fields = (
'limit',
'display_mode',
'custom_schema',
)
widgets = {
'custom_schema': forms.HiddenInput(),
}
def __init__(self, *args, **kwargs):
if kwargs.get('data'):
kwargs['data'] = kwargs['data'].copy() # QueryDict -> dict
# make sure there's a value for custom_schema as postgres.forms.jsonb
# would crash on None.
custom_schema_name = '%s-custom_schema' % kwargs.get('prefix')
if custom_schema_name not in kwargs['data']:
kwargs['data'][custom_schema_name] = '{}'
super().__init__(*args, **kwargs)
if callable(self.fields['custom_schema'].initial):
self.fields['custom_schema'].initial = {}
if self.instance.custom_schema:
self.initial['customize_display'] = True
self.initial['custom_schema'] = self.instance.get_custom_schema()
if not self.instance.cached_json:
del self.fields['customize_display']
del self.fields['custom_schema']
def save(self, *args, **kwargs):
super().save(*args, **kwargs)
if not self.cleaned_data.get('customize_display'):
self.instance.custom_schema = {}
if self.cleaned_data.get('display_mode') == 'table':
self.instance.custom_schema = {}
self.instance.save()
return self.instance
class WcsCategoryCellForm(forms.ModelForm):
class Meta:
model = WcsCategoryCell

View File

@ -0,0 +1,21 @@
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('wcs', '0049_card_pagination'),
]
operations = [
migrations.AddField(
model_name='wcscardinfoscell',
name='display_mode',
field=models.CharField(
choices=[('card', 'Card'), ('table', 'Table')],
default='card',
max_length=10,
verbose_name='Display mode',
),
),
]

View File

@ -951,6 +951,15 @@ class WcsCardInfosCell(CardMixin, CellBase):
_('Number of cards per page (default 10)'), null=True, blank=True
)
custom_schema = JSONField(blank=True, default=dict)
display_mode = models.CharField(
_('Display mode'),
max_length=10,
default='card',
choices=[
('card', _('Card')),
('table', _('Table')),
],
)
title_type = models.CharField(
_('Title'),
@ -971,7 +980,6 @@ class WcsCardInfosCell(CardMixin, CellBase):
is_enabled = classmethod(is_wcs_enabled)
default_template_name = 'combo/wcs/card.html'
manager_form_template = 'combo/wcs/manager/card-infos-cell-form.html'
manager_appearance_template = 'combo/wcs/manager/card-infos-cell-form-appearance.html'
class Meta:
@ -1512,6 +1520,20 @@ class WcsCardInfosCell(CardMixin, CellBase):
def get_appearance_fields(self):
return ['title_type', 'custom_title']
def get_manager_tabs(self):
from .forms import WcsCardInfoCellDisplayForm
tabs = super().get_manager_tabs()
tabs.append(
{
'slug': 'display',
'name': _('Display'),
'template': 'combo/wcs/manager/card-infos-cell-form-display.html',
'form': WcsCardInfoCellDisplayForm,
},
)
return tabs
def get_custom_schema(self):
custom_schema = self.custom_schema or {}

View File

@ -1,8 +1,22 @@
{% extends "combo/cell_form.html" %}
{% load i18n %}
{% block cell-form %}
{{ block.super }}
{{ display_form.as_p }}
<script>
{# display/hide custom_schema fields #}
$('#id_cwcs_wcscardinfoscell-{{ cell.pk }}-display_mode').on('change', function() {
if ($(this).val() == 'card') {
$('#id_cwcs_wcscardinfoscell-{{ cell.pk }}-customize_display').parent().show();
if ($('#id_cwcs_wcscardinfoscell-{{ cell.pk }}-customize_display').val()) {
$('.wcs-cards-cell--grid', $('#id_cwcs_wcscardinfoscell-{{ cell.pk }}-customize_display').parents('.cell')).show();
}
} else {
$('#id_cwcs_wcscardinfoscell-{{ cell.pk }}-customize_display').parent().hide();
$('.wcs-cards-cell--grid', $('#id_cwcs_wcscardinfoscell-{{ cell.pk }}-customize_display').parents('.cell')).hide();
}
});
$('#id_cwcs_wcscardinfoscell-{{ cell.pk }}-display_mode').change();
</script>
{% if card_schema %}
{{ card_schema|json_script:card_schema_id }}
@ -166,4 +180,3 @@
</script>
{% endif %}
{% endblock %}

View File

@ -21,6 +21,7 @@ from requests.models import Response
from combo.apps.search.engines import engines
from combo.apps.search.models import SearchCell
from combo.apps.search.utils import index_site, search_site
from combo.apps.wcs.forms import WcsCardInfoCellDisplayForm
from combo.apps.wcs.models import (
BackofficeSubmissionCell,
CategoriesCell,
@ -2052,39 +2053,41 @@ def test_card_cell_setup(mock_send, app, admin_user):
('other:card_d', 'test2 : Card D'),
('other:card_e', 'test2 : Card E'),
]
assert 'customize_display' not in form.fields
assert 'custom_schema' not in form.fields
form_display = WcsCardInfoCellDisplayForm(instance=cell)
assert 'customize_display' not in form_display.fields
assert 'custom_schema' not in form_display.fields
cell.save()
assert 'customize_display' not in form.fields
assert 'custom_schema' not in form.fields
assert 'customize_display' not in form_display.fields
assert 'custom_schema' not in form_display.fields
cell.carddef_reference = 'default:card_model_1'
cell.save()
form = form_class(instance=cell)
assert 'customize_display' in form.fields
assert 'custom_schema' in form.fields
assert 'customize_display' not in form.initial
assert form.initial['custom_schema'] == {}
form_display = WcsCardInfoCellDisplayForm(instance=cell)
assert 'customize_display' in form_display.fields
assert 'custom_schema' in form_display.fields
assert 'customize_display' not in form_display.initial
assert form_display.initial['custom_schema'] == {}
cell.carddef_reference = 'default:card_model_1:foo'
cell.save()
form = form_class(instance=cell)
assert 'customize_display' in form.fields
assert 'custom_schema' in form.fields
assert 'customize_display' not in form.initial
assert form.initial['custom_schema'] == {}
form_display = WcsCardInfoCellDisplayForm(instance=cell)
assert 'customize_display' in form_display.fields
assert 'custom_schema' in form_display.fields
assert 'customize_display' not in form_display.initial
assert form_display.initial['custom_schema'] == {}
cell.carddef_reference = 'default:card_model_1'
cell.save()
cell.custom_schema = {'cells': [{'varname': 'foo', 'display_mode': 'value'}]}
cell.save()
form = form_class(instance=cell)
assert 'customize_display' in form.fields
assert 'custom_schema' in form.fields
assert form.initial['customize_display'] is True
assert form.initial['custom_schema'] == {
form_display = WcsCardInfoCellDisplayForm(instance=cell)
assert 'customize_display' in form_display.fields
assert 'custom_schema' in form_display.fields
assert form_display.initial['customize_display'] is True
assert form_display.initial['custom_schema'] == {
'cells': [
{'varname': 'foo', 'field_content': 'value', 'display_mode': 'text', 'empty_value': '@empty@'}
]
@ -2104,7 +2107,6 @@ def test_card_cell_setup(mock_send, app, admin_user):
cell.refresh_from_db()
# check getting back to uncustomized display reset the schema
cell.customize_display = True
cell.custom_schema = {
'cells': [
{'varname': 'foo', 'field_content': 'value', 'display_mode': 'text', 'empty_value': '@empty@'}
@ -2119,6 +2121,19 @@ def test_card_cell_setup(mock_send, app, admin_user):
cell.refresh_from_db()
assert cell.custom_schema == {}
cell.custom_schema = {
'cells': [
{'varname': 'foo', 'field_content': 'value', 'display_mode': 'text', 'empty_value': '@empty@'}
]
}
cell.save()
resp = app.get('/manage/pages/%s/' % page.pk)
assert resp.forms[0]['c%s-display_mode' % cell.get_reference()].value == 'card'
resp.forms[0]['c%s-display_mode' % cell.get_reference()].value = 'table'
manager_submit_cell(resp.forms[0])
cell.refresh_from_db()
assert cell.custom_schema == {}
assert cell.related_card_path == ''
assert cell.card_ids == ''
resp = app.get('/manage/pages/%s/' % page.pk)
@ -2578,18 +2593,27 @@ def test_manager_card_cell(mock_send, app, admin_user):
]
def test_manager_card_cell_tabs(app, admin_user):
@mock.patch('requests.Session.send', side_effect=mocked_requests_send)
def test_manager_card_cell_tabs(mock_send, app, admin_user):
page = Page.objects.create(title='xxx', slug='test_cards', template_name='standard', sub_slug='foobar')
cell = WcsCardInfosCell.objects.create(page=page, placeholder='content', order=0)
app = login(app)
resp = app.get('/manage/pages/%s/' % page.pk)
assert not resp.pyquery('[data-tab-slug="general"] select[name$="title_type"]')
assert not resp.pyquery('[data-tab-slug="general"] input[name$="custom_title"]')
assert not resp.pyquery('[data-tab-slug="general"] input[name$="limit"]')
assert not resp.pyquery('#tab-%s-general.pk-tabs--button-marker' % cell.get_reference())
assert resp.pyquery('[data-tab-slug="appearance"] select[name$="title_type"]')
assert resp.pyquery('[data-tab-slug="appearance"] input[name$="custom_title"]')
assert not resp.pyquery('[data-tab-slug="appearance"] input[name$="customize_display"]')
assert resp.pyquery('[data-tab-slug="display"] input[name$="limit"]')
cell.carddef_reference = 'default:card_model_1'
cell.save()
resp = app.get('/manage/pages/%s/' % page.pk)
assert resp.pyquery('#tab-%s-general.pk-tabs--button-marker' % cell.get_reference())
assert resp.pyquery('[data-tab-slug="display"] input[name$="customize_display"]')
@mock.patch('requests.Session.send', side_effect=mocked_requests_send)