backoffice: add option to expand history pane by default (#87727) #1307
|
@ -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
|
||||
|
||||
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'
|
||||
fpeters
commented
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'
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)')
|
||||
|
|
|
@ -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():
|
||||
fpeters
commented
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())
|
||||
fpeters
commented
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'),
|
||||
),
|
||||
|
|
|
@ -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):
|
||||
|
|
|
@ -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):
|
||||
|
|
|
@ -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']
|
||||
fpeters
commented
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')
|
||||
fpeters
commented
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()
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -41,6 +41,7 @@
|
|||
<ul class="biglist optionslist">
|
||||
{{ options.templates|safe }}
|
||||
{{ options.user_support|safe }}
|
||||
{{ options.management|safe }}
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
|
Loading…
Reference in New Issue
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).