backoffice: inform submission agent if user already has limited form (#45711)

This commit is contained in:
Frédéric Péters 2020-08-03 21:15:37 +02:00
parent 3901a53467
commit 4a7ea75faa
4 changed files with 52 additions and 0 deletions

View File

@ -3460,6 +3460,20 @@ def test_backoffice_submission_only_one_check(pub, local_user):
resp = resp.form.submit('submit') # -> submit
assert formdef.data_class().count() == 2
# initiate a submission associated to a user
resp = app.get('/backoffice/submission/form-title/?NameID=%s' % local_user.name_identifiers[0])
resp = resp.follow().follow()
assert 'This form is limited to one per user' not in resp
resp.form['f1'] = 'test'
resp = resp.form.submit('submit') # -> validation
resp = resp.form.submit('submit') # -> submit
assert formdef.data_class().count() == 3
# initiate a second one
resp = app.get('/backoffice/submission/form-title/?NameID=%s' % local_user.name_identifiers[0])
resp = resp.follow().follow()
assert 'This form is limited to one per user' in resp
def test_backoffice_wscall_failure_display(http_requests, pub):
user = create_user(pub)

View File

@ -25,6 +25,7 @@ from quixote.html import TemplateIO, htmltext
from ..qommon import _
from ..qommon.backoffice.menu import html_top
from ..qommon.form import *
from ..qommon.storage import Equal, NotEqual
from ..qommon import errors, misc
from wcs.formdata import FormData
@ -149,6 +150,21 @@ class FormFillPage(PublicFormFillPage):
def check_unique_submission(self):
return None
def modify_filling_context(self, context, page, data):
if not self.formdef.only_allow_one:
return
try:
formdata = self.formdef.data_class().get(data['draft_formdata_id'])
except KeyError: # it may not exist
return
data_class = self.formdef.data_class()
if get_publisher().is_using_postgresql():
has = bool(data_class.count([NotEqual('status', 'draft'), Equal('user_id', formdata.user_id)]))
else:
has = any(x for x in data_class.get_with_indexed_value('user_id', formdata.user_id) if not x.is_draft())
context['user_has_already_one_such_form'] = has
def get_sidebar(self, data):
r = TemplateIO(html=True)

View File

@ -262,6 +262,12 @@ class FormPage(Directory, FormTemplateMixin):
session = get_session()
return session.has_user()
def get_current_page_no(self, current_page):
for i, page in enumerate(self.pages):
if page is current_page:
return i + 1
return 0
def step(self, step_no, current_page):
get_logger().info('form %s - step %s' % (self.formdef.name, step_no))
@ -466,6 +472,7 @@ class FormPage(Directory, FormTemplateMixin):
context = {
'view': self,
'page_no': lambda: self.get_current_page_no(page),
'form': form,
'formdef': LazyFormDef(self.formdef),
'form_side': lambda: self.form_side(0, page, data=data, magictoken=magictoken),
@ -473,11 +480,15 @@ class FormPage(Directory, FormTemplateMixin):
}
if self.has_draft_support() and data:
context['tracking_code_box'] = lambda: self.tracking_code_box(data, magictoken)
self.modify_filling_context(context, page, data)
return template.QommonTemplateResponse(
templates=list(self.get_formdef_template_variants(self.filling_templates)),
context=context)
def modify_filling_context(self, context, page, data):
pass
def form_side(self, step_no, page, data=None, magictoken=None):
'''Create the elements that typically appear aside the main form
(tracking code and steps).'''

View File

@ -37,6 +37,17 @@
{% endwith %}
{% endif %}
{% endblock %}
{% block backoffice-only-one-info %}
{% if not view.edit_mode and page_no == 1 and publisher.get_request.is_in_backoffice and user_has_already_one_such_form %}
<div class="warningnotice">
{% blocktrans %}
This form is limited to one per user and the associated user has already one.
{% endblocktrans %}
</div>
{% endif %}
{% endblock %}
{{ form.render|safe }}
{% endblock %}