backoffice: add option to expand history pane by default (#87727) #1307

Merged
fpeters merged 2 commits from wip/87727-card-management-options into main 2024-03-29 08:46:41 +01:00
10 changed files with 153 additions and 18 deletions

View File

@ -1118,3 +1118,61 @@ 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

Ajout d'une boite de dialogue "management" (pour les formulaires c'est traduit en "Traitement", pour les modèles de fiches je serais pour traduire en "Gestion"), dedans on retrouve d'abord la configuration du contenu de la barre latérale. (1er commit).

Ajout d'une boite de dialogue "management" (pour les formulaires c'est traduit en "Traitement", pour les modèles de fiches je serais pour traduire en "Gestion"), dedans on retrouve d'abord la configuration du contenu de la barre latérale. (1er commit).
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__'}
assert_option_display(resp, 'Management', 'Default')
resp = resp.click('Management', href='options/management')
assert resp.form['history_pane_default_mode'].value == 'collapsed'

Puis un commit pour la nouvelle option pour voir la section d'historique dépliée.

Puis un commit pour la nouvelle option pour voir la section d'historique dépliée.
resp = resp.form.submit().follow()
assert_option_display(resp, 'Templates', 'Default')
resp = resp.click('Management', href='options/management')
resp.form['history_pane_default_mode'].value = 'expanded'
resp = resp.form.submit().follow()
assert_option_display(resp, 'Templates', 'Custom')
resp = resp.click('Management', href='options/management')
assert resp.form['history_pane_default_mode'].value == 'expanded'

View File

@ -2184,6 +2184,7 @@ def test_backoffice_download_as_zip(pub):
app = login(get_app(pub))
resp = app.get('/backoffice/management/form-title/%s/' % number31.id)
assert 'Download all files as .zip' not in resp
formdef.management_sidebar_items = formdef.get_default_management_sidebar_items()
formdef.management_sidebar_items.add('download-files')
formdef.store()
resp = app.get('/backoffice/management/form-title/%s/' % number31.id)

View File

@ -2130,3 +2130,28 @@ def test_carddata_edit_items_display(pub):
assert resp.status_int == 302
resp = resp.follow()
assert not resp.pyquery('#sect-dataview').text()
def test_carddata_history_pane_default_mode(pub):
CardDef.wipe()
user = create_user(pub)
carddef = CardDef()
carddef.name = 'foo'
carddef.fields = []
carddef.workflow_roles = {'_editor': user.roles[0]}
carddef.store()
carddef.data_class().wipe()
carddata = carddef.data_class()()
carddata.just_created()
carddata.store()
app = login(get_app(pub))
resp = app.get(carddata.get_backoffice_url())
assert resp.pyquery('#evolution-log.folded')
carddef.history_pane_default_mode = 'expanded'
carddef.store()
resp = app.get(carddata.get_backoffice_url())
assert resp.pyquery('#evolution-log:not(.folded)')

View File

@ -516,6 +516,7 @@ class OptionsDirectory(Directory):
'drafts_max_per_user',
'user_support',
'management_sidebar_items',
'history_pane_default_mode',
]
for attr in attrs:
widget = form.get_widget(attr)
@ -527,7 +528,7 @@ class OptionsDirectory(Directory):
new_value = widget.parse()
if attr == 'management_sidebar_items':
new_value = set(new_value or [])
if new_value == self.formdef.__class__.management_sidebar_items:
if new_value == self.formdef.get_default_management_sidebar_items():

La valeur par défaut pour les éléments de barre latérale était portée au niveau de la classe mais pour les modèles de fiche il y a une valeur par défaut selon que la fiche puisse être liée à un usager ou pas, donc je déplace ça dans une fonction.

La valeur par défaut pour les éléments de barre latérale était portée au niveau de la classe mais pour les modèles de fiche il y a une valeur par défaut selon que la fiche puisse être liée à un usager ou pas, donc je déplace ça dans une fonction.
new_value = {'__default__'}
if attr == 'digest_template':
if self.formdef.default_digest_template != new_value:
@ -805,7 +806,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())

Normalement tout était bien ramené à 'default' si ça correspondait mais au cas où, ça compare ici également avec la réelle valeur par défaut.

Normalement tout était bien ramené à '__default__' si ça correspondait mais au cas où, ça compare ici également avec la réelle valeur par défaut.
)
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, RadiobuttonsWidget, StringWidget
class CardDefUI(FormDefUI):
@ -71,6 +71,26 @@ 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,
)
form.add(
RadiobuttonsWidget,
'history_pane_default_mode',
title=_('History pane default mode'),
options=[('collapsed', _('Collapsed'), 'collapsed'), ('expanded', _('Expanded'), 'expanded')],
value=self.formdef.history_pane_default_mode,
extra_css_class='widget-inline-radio',
)
return self.handle(form, pgettext_lazy('cards', 'Management'))
class CardFieldDefPage(FormFieldDefPage):
section = 'cards'
@ -140,6 +160,15 @@ 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.history_pane_default_mode != 'collapsed'
or 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

@ -441,9 +441,6 @@ class CardBackOfficeStatusPage(FormBackOfficeStatusPage):
def should_fold_summary(self, mine, request_user):
return False
def should_fold_history(self):
return True
class ImportFromCsvAfterJob(AfterJob):
def __init__(self, carddef, data_lines, update_existing_cards, submission_agent_id):

View File

@ -49,6 +49,7 @@ class CardDef(FormDef):
item_name_plural = pgettext_lazy('item', 'cards')
confirmation = False
history_pane_default_mode = 'collapsed'
# users are not allowed to access carddata where they're submitter.
user_allowed_to_access_own_data = False
@ -311,6 +312,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']

Pour les fiches jamais la partie "autres demandes de l'usager".

Pour les fiches jamais la partie "autres demandes de l'usager".
if not self.user_support:
excluded_parts.append('user')

Et la partie "usager associé" n'est pas proposées si une fiche ne peut pas être liée à un usager.

Et la partie "usager associé" n'est pas proposées si une fiche ne peut pas être liée à un usager.
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
@ -195,6 +188,7 @@ class FormDef(StorableObject):
user_support = None
geolocations = None
history_pane_default_mode = 'expanded'
# store reverse relations
reverse_relations = None
@ -242,7 +236,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 +273,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 +298,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 +328,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

@ -541,7 +541,7 @@ class FormStatusPage(Directory, FormTemplateMixin):
return False
def should_fold_history(self):
return False
return bool(self.formdef.history_pane_default_mode == 'collapsed')
def receipt(self, always_include_user=False, form_url='', mine=True):
request_user = user = get_request().user

View File

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