forms: ignore hidden evolution parts when joining statuses in history (#38621)

This commit is contained in:
Frédéric Péters 2019-12-18 14:26:39 +01:00
parent 2b6df5d5f8
commit e8926cd070
5 changed files with 63 additions and 5 deletions

View File

@ -41,6 +41,7 @@ from wcs.wf.jump import JumpWorkflowStatusItem
from wcs.wf.redirect_to_url import RedirectToUrlWorkflowStatusItem
from wcs.wf.register_comment import RegisterCommenterWorkflowStatusItem
from wcs.wf.resubmit import ResubmitWorkflowStatusItem
from wcs.wf.wscall import JournalWsCallErrorPart
from wcs.workflows import (
ChoiceWorkflowStatusItem,
CommentableWorkflowStatusItem,
@ -5135,6 +5136,59 @@ def test_form_page_profile_verified_prefill(pub):
assert formdatas[0].data['0'] == 'foo@localhost'
def test_form_worklow_multiple_identical_status_with_wserror(pub):
user = create_user(pub)
formdef = create_formdef()
formdef.fields = []
formdef.store()
workflow = Workflow(name='test')
st1 = workflow.add_status('Status1', 'st1')
jump = JumpWorkflowStatusItem()
jump.trigger = 'XXX'
jump.status = 'st1'
st1.items.append(jump)
jump.parent = st1
workflow.store()
formdef.workflow_id = workflow.id
formdef.store()
formdef.data_class().wipe()
formdata = formdef.data_class()()
formdata.just_created()
formdata.store()
assert formdef.data_class().get(formdata.id).status == 'wf-st1'
app = get_app(pub)
login(app, username='foo', password='foo')
pub.role_class.wipe()
role = pub.role_class(name='xxx')
role.allows_backoffice_access = False
role.store()
jump.by = [role.id]
workflow.store()
user.roles = [role.id]
user.store()
for _i in range(3):
resp = app.post(formdata.get_url() + 'jump/trigger/XXX', status=302)
formdata = formdef.data_class().get(formdata.id)
formdata.evolution[-1].add_part(JournalWsCallErrorPart('bla', 'bla', {}))
formdata.store()
resp = app.get(formdata.get_url())
assert resp.text.count('<li class="msg') == 1
role.allows_backoffice_access = True
role.store()
resp = app.get(formdata.get_url(backoffice=True))
assert resp.text.count('<li class="msg') == 3
def test_form_page_verified_prefill_error_page(pub):
user = create_user(pub)
user.verified_fields = ['email']

View File

@ -1978,10 +1978,10 @@ def test_webservice_call(http_requests, pub):
item.action_on_4xx = ':stop'
with pytest.raises(AbortActionException):
item.perform(formdata)
rendered = formdata.evolution[-1].parts[-1].view()
assert not rendered # empty if not in backoffice
assert formdata.evolution[-1].parts[-1].is_hidden() # not displayed in front
req = HTTPRequest(None, {'SERVER_NAME': 'example.net', 'SCRIPT_NAME': '/backoffice/'})
pub._set_request(req)
assert not formdata.evolution[-1].parts[-1].is_hidden()
rendered = formdata.evolution[-1].parts[-1].view()
assert 'Error during webservice call' in str(rendered)
assert 'Error Code: 1' in str(rendered)

View File

@ -151,6 +151,8 @@ class Evolution:
for p in self.parts:
if not p.view:
continue
if p.is_hidden and p.is_hidden():
continue
if hasattr(p, 'to') and not self.formdata.is_for_current_user(p.to):
continue
text = p.view()
@ -648,7 +650,7 @@ class FormData(StorableObject):
self.status == status
and self.evolution[-1].status == status
and not self.evolution[-1].comment
and not self.evolution[-1].display_parts()
and not self.evolution[-1].parts
):
# if status do not change and last evolution is empty,
# just update last jump time on last evolution, do not add one

View File

@ -62,9 +62,10 @@ class JournalWsCallErrorPart(EvolutionPart):
if data:
self.data = data[:10000] # beware of huge responses
def is_hidden(self):
return not (get_request() and get_request().get_path().startswith('/backoffice/'))
def view(self):
if not (get_request() and get_request().get_path().startswith('/backoffice/')):
return ''
r = TemplateIO(html=True)
r += htmltext('<div class="ws-error">')
r += htmltext('<h4 class="foldable folded">')

View File

@ -186,6 +186,7 @@ class AttachmentsSubstitutionProxy:
class EvolutionPart:
to = None
is_hidden = None
view = None
def render_for_fts(self):