backoffice: add sidebar content options for cards (#87727)

This commit is contained in:
Frédéric Péters 2024-03-24 15:47:49 +01:00
parent e0857ce653
commit 6321637a14
6 changed files with 102 additions and 14 deletions

View File

@ -1118,3 +1118,49 @@ def test_cards_last_test_result(pub):
resp = resp.click('Last tests run')
assert 'Result #%s' % test_result.id in resp.text
def test_cards_management_options(pub):
create_superuser(pub)
CardDef.wipe()
carddef = CardDef()
carddef.name = 'foo'
carddef.fields = [
fields.StringField(id='1', label='Test', varname='test'),
]
carddef.store()
app = login(get_app(pub))
resp = app.get('/backoffice/cards/1/')
# Misc management
assert_option_display(resp, 'Management', 'Default')
resp = resp.click('Management', href='options/management')
assert resp.forms[0]['management_sidebar_items$elementgeneral'].checked is True
assert resp.forms[0]['management_sidebar_items$elementdownload-files'].checked is False
resp.forms[0]['management_sidebar_items$elementdownload-files'].checked = True
resp = resp.forms[0].submit().follow()
assert_option_display(resp, 'Management', 'Custom')
assert 'general' in CardDef.get(1).management_sidebar_items
assert 'download-files' in CardDef.get(1).management_sidebar_items
resp = resp.click('Management', href='options/management')
resp.forms[0]['management_sidebar_items$elementgeneral'].checked = False
resp = resp.forms[0].submit().follow()
assert 'general' not in CardDef.get(1).management_sidebar_items
resp = resp.click('Management', href='options/management')
resp.forms[0]['management_sidebar_items$elementgeneral'].checked = True
resp.forms[0]['management_sidebar_items$elementdownload-files'].checked = False
assert 'management_sidebar_items$elementuser' not in resp.forms[0].fields
resp = resp.forms[0].submit().follow()
assert CardDef.get(1).management_sidebar_items == {'__default__'}
carddef.user_support = 'optional'
carddef.store()
resp = resp.click('Management', href='options/management')
assert resp.forms[0]['management_sidebar_items$elementuser'].checked is True
resp = resp.forms[0].submit().follow()
assert CardDef.get(1).management_sidebar_items == {'__default__'}

View File

@ -527,7 +527,7 @@ class OptionsDirectory(Directory):
new_value = widget.parse()
if attr == 'management_sidebar_items':
new_value = set(new_value)
if new_value == self.formdef.__class__.management_sidebar_items:
if new_value == self.formdef.get_default_management_sidebar_items():
new_value = {'__default__'}
if attr == 'digest_template':
if self.formdef.default_digest_template != new_value:
@ -805,7 +805,8 @@ class FormDefPage(Directory, TempfileDirectoryMixin):
_('Custom')
if (
self.formdef.skip_from_360_view
or self.formdef.management_sidebar_items != {'__default__'}
or self.formdef.management_sidebar_items
not in ({'__default__'}, self.formdef.get_default_management_sidebar_items())
)
else _('Default'),
),

View File

@ -31,7 +31,7 @@ from wcs.categories import CardDefCategory
from wcs.sql_criterias import Null, StrictNotEqual
from ..qommon import _, pgettext_lazy
from ..qommon.form import ComputedExpressionWidget, StringWidget
from ..qommon.form import CheckboxesWidget, ComputedExpressionWidget, Form, StringWidget
class CardDefUI(FormDefUI):
@ -71,6 +71,18 @@ class CardDefOptionsDirectory(OptionsDirectory):
)
return form
def management(self):
form = Form(enctype='multipart/form-data')
form.add(
CheckboxesWidget,
'management_sidebar_items',
title=_('Sidebar elements'),
options=[(x[0], x[1], x[0]) for x in self.formdef.get_management_sidebar_available_items()],
value=self.formdef.get_management_sidebar_items(),
inline=False,
)
return self.handle(form, pgettext_lazy('cards', 'Management'))
class CardFieldDefPage(FormFieldDefPage):
section = 'cards'
@ -140,6 +152,14 @@ class CardDefPage(FormDefPage):
options['user_support'] = self.add_option_line(
'options/user_support', _('User support'), user_support_status
)
options['management'] = self.add_option_line(
'options/management',
pgettext_lazy('cards', 'Management'),
_('Custom')
if self.formdef.management_sidebar_items
not in ({'__default__'}, self.formdef.get_default_management_sidebar_items())
else _('Default'),
)
return options
def get_sorted_usage_in_formdefs(self):

View File

@ -311,6 +311,24 @@ class CardDef(FormDef):
return True
return False
def get_default_management_sidebar_items(self):
management_sidebar_items = {
'general',
'submission-context',
'user',
'geolocation',
'custom-template',
}
if not self.user_support:
management_sidebar_items.remove('user')
return management_sidebar_items
def get_management_sidebar_available_items(self):
excluded_parts = ['pending-forms']
if not self.user_support:
excluded_parts.append('user')
return [x for x in super().get_management_sidebar_available_items() if x[0] not in excluded_parts]
def get_cards_graph(category=None, show_orphans=False):
out = io.StringIO()

View File

@ -176,14 +176,7 @@ class FormDef(StorableObject):
expiration_date = None
has_captcha = False
skip_from_360_view = False
management_sidebar_items = {
'general',
'submission-context',
'user',
'geolocation',
'custom-template',
'pending-forms',
}
management_sidebar_items = {'__default__'}
include_download_all_button = False
appearance_keywords = None
digest_templates = None
@ -242,7 +235,6 @@ class FormDef(StorableObject):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.fields = []
self.management_sidebar_items = {'__default__'}
def __eq__(self, other):
return bool(
@ -280,7 +272,7 @@ class FormDef(StorableObject):
break
if self.include_download_all_button: # 2023-12-30
self.management_sidebar_items = self.__class__.management_sidebar_items.copy()
self.management_sidebar_items = self.get_default_management_sidebar_items()
self.management_sidebar_items.add('download-files')
self.include_download_all_button = False
changed = True
@ -305,6 +297,16 @@ class FormDef(StorableObject):
sql.clean_global_views(conn, cur)
cur.close()
def get_default_management_sidebar_items(self):
return {
'general',
'submission-context',
'user',
'geolocation',
'custom-template',
'pending-forms',
}
def get_management_sidebar_available_items(self):
return [
('general', _('General Information')),
@ -325,7 +327,7 @@ class FormDef(StorableObject):
def get_management_sidebar_items(self):
if self.management_sidebar_items == {'__default__'}:
return self.__class__.management_sidebar_items
return self.get_default_management_sidebar_items()
return self.management_sidebar_items or []
@property

View File

@ -41,6 +41,7 @@
<ul class="biglist optionslist">
{{ options.templates|safe }}
{{ options.user_support|safe }}
{{ options.management|safe }}
</ul>
</div>
</div>