backoffice: inform submission agent if user already has limited form (#45711)
This commit is contained in:
parent
3901a53467
commit
4a7ea75faa
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
||||
|
|
|
@ -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).'''
|
||||
|
|
|
@ -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 %}
|
||||
|
||||
|
|
Loading…
Reference in New Issue