tracking code: don't break on anonymous access after evolutions done as user

This commit is contained in:
Frédéric Péters 2015-02-24 17:46:12 +01:00
parent 01a4b964aa
commit 7d2bfa77e0
2 changed files with 79 additions and 1 deletions

View File

@ -309,6 +309,84 @@ def test_form_tracking_code():
resp = resp.forms[0].submit()
assert formdef.data_class().get(formdata_id).evolution[-1].comment == 'hello world'
def test_form_tracking_code_as_user():
user = create_user()
formdef = create_formdef()
formdef.data_class().wipe()
formdef.fields = [fields.StringField(id='0', label='string')]
formdef.enable_tracking_codes = True
formdef.store()
resp = login(get_app(pub), username='foo', password='foo').get('/test/')
assert '<h3>Tracking code</h3>' in resp.body
resp.forms[0]['f0'] = 'foobar'
resp = resp.forms[0].submit('submit')
tracking_code = None
for a_tag in resp.html.findAll('a'):
if 'code/' in a_tag['href']:
tracking_code = a_tag.text
break
assert tracking_code is not None
assert formdef.data_class().count() == 1
assert formdef.data_class().select()[0].is_draft()
assert formdef.data_class().select()[0].tracking_code == tracking_code
assert formdef.data_class().select()[0].data['0'] == 'foobar'
# check we can load the formdata as a draft
resp = login(get_app(pub), username='foo', password='foo').get('/')
resp.forms[0]['code'] = tracking_code
resp = resp.forms[0].submit()
assert resp.location == 'http://example.net/code/%s/load' % tracking_code
resp = resp.follow()
assert resp.location == 'http://example.net/test/1'
resp = resp.follow()
assert resp.location.startswith('http://example.net/test/?mt=')
resp = resp.follow()
resp = resp.forms[0].submit('previous')
assert resp.forms[0]['f0'].value == 'foobar'
# check submitted form keeps the tracking code
resp.forms[0]['f0'] = 'barfoo'
resp = resp.forms[0].submit('submit') # -> confirmation page
resp = resp.forms[0].submit('submit') # -> done
resp = resp.follow()
assert 'barfoo' in resp.body
assert formdef.data_class().count() == 1 # check the draft one has been removed
assert formdef.data_class().select()[0].tracking_code == tracking_code
assert formdef.data_class().select()[0].user_id == user.id
assert formdef.data_class().select()[0].status == 'wf-new'
assert formdef.data_class().select()[0].data['0'] == 'barfoo'
formdata_id = formdef.data_class().select()[0].id
# check we can still go back to it
resp = login(get_app(pub), username='foo', password='foo').get('/')
resp.forms[0]['code'] = tracking_code
resp = resp.forms[0].submit()
assert resp.location == 'http://example.net/code/%s/load' % tracking_code
resp = resp.follow()
assert resp.location == 'http://example.net/test/%s' % formdata_id
resp = resp.follow()
resp = resp.follow()
assert 'form_comment' in resp.body # makes sure user is treated as submitter
resp.forms[0]['comment'] = 'hello world'
resp = resp.forms[0].submit()
assert formdef.data_class().get(formdata_id).evolution[-1].comment == 'hello world'
# and check we can also get back to it as anonymous
app = get_app(pub)
resp = app.get('/')
resp.forms[0]['code'] = tracking_code
resp = resp.forms[0].submit()
assert resp.location == 'http://example.net/code/%s/load' % tracking_code
resp = resp.follow()
assert resp.location == 'http://example.net/test/%s' % formdata_id
resp = resp.follow()
resp = resp.follow()
assert 'form_comment' in resp.body # makes sure user is treated as submitter
def test_form_tracking_code_email():
formdef = create_formdef()
formdef.data_class().wipe()

View File

@ -236,7 +236,7 @@ class FormStatusPage(Directory):
evo_author = None
if evo.who == '_submitter':
evo_author = _('Original Submitter')
if self.filled.is_submitter(get_request().user):
if get_request().user and self.filled.is_submitter(get_request().user):
evo_author = get_request().user.display_name
elif self.filled.user_id:
try: