settings: add option to have backoffice submission hidden or a redirect (#33549) #1200

Merged
fpeters merged 1 commits from wip/33549-submission-menu-entry-settings into main 2024-03-01 16:56:45 +01:00
5 changed files with 106 additions and 17 deletions

View File

@ -1084,17 +1084,31 @@ def test_i18n(pub):
def test_submission_channels(pub):
create_superuser(pub)
app = login(get_app(pub))
resp = app.get('/backoffice/settings/submission-channels')
resp = app.get('/backoffice/settings/backoffice-submission')
resp.form['include-in-global-listing'].checked = True
resp = resp.form.submit('submit')
pub.reload_cfg()
assert pub.cfg['submission-channels']['include-in-global-listing'] is True
resp = app.get('/backoffice/settings/submission-channels')
resp = app.get('/backoffice/settings/backoffice-submission')
assert resp.form['include-in-global-listing'].checked
def test_backoffice_submission(pub):
create_superuser(pub)
app = login(get_app(pub))
resp = app.get('/backoffice/settings/backoffice-submission')
resp.form['redirect'] = 'https://example.net'
resp = resp.form.submit('submit')
pub.reload_cfg()
assert pub.cfg['backoffice-submission']['redirect'] == 'https://example.net'
resp = app.get('/backoffice/settings/backoffice-submission')
assert resp.form['redirect'].value == 'https://example.net'
def test_hobo_locked_settings(pub):
create_superuser(pub)
app = login(get_app(pub))

View File

@ -161,6 +161,52 @@ def test_backoffice_submission(pub):
assert resp.location == 'http://www.example.org/'
def test_backoffice_submission_menu_entry(pub):
user = create_user(pub)
FormDef.wipe()
formdef = FormDef()
formdef.name = 'form title'
formdef.fields = []
formdef.workflow_roles = {'_receiver': 1}
formdef.backoffice_submission_roles = user.roles[:]
formdef.store()
app = login(get_app(pub))
resp = app.get('/backoffice/management/forms')
assert resp.pyquery('#sidepage-menu .icon-submission')
pub.cfg['backoffice-submission'] = {}
pub.cfg['backoffice-submission']['sidebar_menu_entry'] = 'visible'
pub.write_cfg()
resp = app.get('/backoffice/submission/', status=200)
assert resp.pyquery('#sidepage-menu .icon-submission')
pub.cfg['backoffice-submission']['sidebar_menu_entry'] = 'redirect'
pub.cfg['backoffice-submission']['redirect'] = 'https://example.net/'
pub.write_cfg()
resp = app.get('/backoffice/management/forms')
assert resp.pyquery('#sidepage-menu .icon-submission')
resp = app.get('/backoffice/submission/', status=302)
assert resp.location == 'https://example.net/'
pub.cfg['backoffice-submission']['sidebar_menu_entry'] = 'hidden'
pub.write_cfg()
resp = app.get('/backoffice/management/forms')
assert not resp.pyquery('#sidepage-menu .icon-submission')
resp = app.get('/backoffice/submission/', status=302)
assert resp.location == 'https://example.net/'
pub.cfg['backoffice-submission'][
'redirect'
] = '{% if session_user_email == "admin@localhost" %}https://example.net/{% endif %}'
pub.write_cfg()
app.get('/backoffice/submission/', status=302) # redirection
user.email = 'admin2@localhost'
user.store()
app.get('/backoffice/submission/', status=200) # native screen
def test_backoffice_submission_with_tracking_code(pub):
user = create_user(pub)

View File

@ -487,7 +487,7 @@ class SettingsDirectory(AccessControlled, Directory):
('data-sources', 'data_sources'),
'wscalls',
('api-access', 'api_access'),
('submission-channels', 'submission_channels'),
('backoffice-submission', 'backoffice_submission'),
]
emails = EmailsDirectory()
@ -636,10 +636,10 @@ class SettingsDirectory(AccessControlled, Directory):
_('Geolocation'),
_('Configure geolocation and geocoding'),
)
if enabled('submission-channels'):
r += htmltext('<dt><a href="submission-channels">%s</a></dt> <dd>%s</dd>') % (
_('Submission channels'),
_('Configure submission channels related options'),
if enabled('backoffice-submission'):
r += htmltext('<dt><a href="backoffice-submission">%s</a></dt> <dd>%s</dd>') % (
_('Backoffice Submission'),
_('Configure backoffice submission related options'),
)
if enabled('users'):
r += htmltext('<dt><a href="users/">%s</a></dt> <dd>%s</dd>') % (_('Users'), _('Configure users'))
@ -1272,9 +1272,29 @@ $('#form_default-zoom-level').on('change', function() {
)
return redirect('.')
def submission_channels(self):
def backoffice_submission(self):
form = Form(enctype='multipart/form-data')
submission_channels_cfg = get_cfg('submission-channels', {})
backoffice_submission_cfg = get_cfg('backoffice-submission', {})
form.add(
RadiobuttonsWidget,
'sidebar_menu_entry',
title=_('Sidebar menu entry'),
value=backoffice_submission_cfg.get('sidebar_menu_entry', 'visible'),
options=[
('visible', _('Visible'), 'visible'),
('hidden', _('Hidden'), 'hidden'),
],
extra_css_class='widget-inline-radio',
)
form.add(
StringWidget,
'redirect',
title=_('URL for backoffice submission'),
hint=_('Leave empty to use native screen.'),
value=backoffice_submission_cfg.get('redirect', ''),
size=80,
)
form.add(
CheckboxWidget,
'include-in-global-listing',
@ -1288,18 +1308,15 @@ $('#form_default-zoom-level').on('change', function() {
return redirect('.')
if not form.is_submitted() or form.has_errors():
get_response().breadcrumb.append(('submission-channels', _('Submission channels')))
get_response().set_title(_('Submission channels'))
get_response().breadcrumb.append(('backoffice-submission', _('Backoffice Submission')))
get_response().set_title(_('Backoffice submission settings'))
r = TemplateIO(html=True)
r += htmltext('<h2>%s</h2>') % _('Submission channels')
r += htmltext('<h2>%s</h2>') % _('Backoffice submission settings')
r += form.render()
return r.getvalue()
else:
cfg_submit(
form,
'submission-channels',
('include-in-global-listing',),
)
cfg_submit(form, 'submission-channels', ('include-in-global-listing',))
cfg_submit(form, 'backoffice-submission', ('sidebar_menu_entry', 'redirect'))
return redirect('.')

View File

@ -31,7 +31,7 @@ from wcs.forms.common import FormStatusPage
from wcs.forms.root import FormPage as PublicFormFillPage
from wcs.sql_criterias import Contains, Equal, StrictNotEqual
from ..qommon import _, errors, misc, template
from ..qommon import _, errors, get_cfg, misc, template
from ..qommon.form import Form, HtmlWidget
@ -438,6 +438,8 @@ class SubmissionDirectory(Directory):
def is_accessible(self, user, traversal=False):
if not user.can_go_in_backoffice():
return False
if traversal is False and get_cfg('backoffice-submission', {}).get('sidebar_menu_entry') == 'hidden':
return False
# check user has at least one role set for backoffice submission
for role_id in user.roles or []:
ids = FormDef.get_ids_with_indexed_value('backoffice_submission_roles', role_id)
@ -494,6 +496,15 @@ class SubmissionDirectory(Directory):
return cats
def _q_index(self):
redirect_url = get_cfg('backoffice-submission', {}).get('redirect')
if redirect_url:
redirect_url = misc.get_variadic_url(
redirect_url, get_publisher().substitutions.get_context_variables(mode='lazy')
)
if redirect_url:
return redirect(redirect_url)
get_response().breadcrumb.append(('submission/', _('Submission')))
get_response().set_title(_('Submission'))
list_forms = self.get_submittable_formdefs(prefetch=False)

View File

@ -315,6 +315,7 @@ class WcsPublisher(QommonPublisher):
('misc', ('default-position', 'default-zoom-level')),
('sms', '*'),
('submission-channels', '*'),
('backoffice-submission', '*'),
('texts', '*'),
('users', ('*_template',)),
):