misc: redo unique check using sql (#77161)
gitea/wcs/pipeline/head This commit looks good Details

This commit is contained in:
Frédéric Péters 2023-04-30 23:45:14 +02:00
parent d7dc42fd48
commit 96b9503832
2 changed files with 45 additions and 18 deletions

View File

@ -10550,3 +10550,41 @@ def test_form_html_titles(pub):
assert resp.pyquery('title').text() == 'test - 2/3 - 2nd page'
resp = resp.forms[0].submit('submit') # -> validation
assert resp.pyquery('title').text() == 'test - 3/3 - Validating'
def test_only_one_check(pub):
create_user(pub)
FormDef.wipe()
formdef = FormDef()
formdef.name = 'form title'
formdef.fields = [fields.StringField(id='1', label='1st field', type='string')]
formdef.only_allow_one = True
formdef.store()
formdef.data_class().wipe()
for i in range(5):
resp = get_app(pub).get('/form-title/')
resp.form['f1'] = 'test'
resp = resp.form.submit('submit') # -> validation
resp = resp.form.submit('submit') # -> submit
assert formdef.data_class().count() == (i + 1)
app = login(get_app(pub), username='foo', password='foo')
resp = app.get('/form-title/')
resp.form['f1'] = 'test2'
resp = resp.form.submit('submit') # -> validation
# draft has been saved
assert len([x for x in formdef.data_class().select() if x.is_draft()]) == 1
# the draft doesn't prevent a new form being completed
resp = app.get('/form-title/')
resp.form['f1'] = 'test2'
resp = resp.form.submit('submit') # -> validation
resp = resp.form.submit('submit') # -> submit
# when there's a form, redirect to it
resp = app.get('/form-title/')
resp = resp.follow()
assert '>test2<' in resp.text

View File

@ -67,20 +67,6 @@ def html_top(title=None, page_title=None):
template.html_top(title=title, default_org=_('Forms'), page_title=page_title)
def get_user_forms(formdef):
"""Return forms data for the current user
formdef - the formdef from which we want form datas
"""
session = get_session()
user = session.get_user()
user_forms = []
if user and not user.anonymous:
user_forms = formdef.data_class().get_with_indexed_value('user_id', user.id)
return list(user_forms)
def tryauth(url):
# tries to log the user in before redirecting to the asked url; this won't
# do anything for local logins but will use a passive SAML request when
@ -992,10 +978,13 @@ class FormPage(FormdefDirectoryBase, FormTemplateMixin):
return None
if not self.formdef.only_allow_one:
return None
for user_form in get_user_forms(self.formdef):
if not user_form.is_draft():
return user_form.id
return None
user = get_session().get_user()
if not user:
return None
user_forms = self.formdef.data_class().select(
[Equal('user_id', str(user.id)), NotEqual('status', 'draft')]
)
return user_forms[0].id if user_forms else None
_pages = None