forms: don't set form_status_changed on evolutions in same status (#34888)

This commit is contained in:
Frédéric Péters 2019-07-16 09:53:56 +02:00
parent b9db059a47
commit f8da77c8f9
3 changed files with 69 additions and 3 deletions

View File

@ -4516,6 +4516,8 @@ def test_form_worklow_multiple_identical_status(pub):
assert len(formdata.evolution) == 1
assert formdata.status == 'wf-st1'
assert formdata.evolution[0].last_jump_datetime is not None
assert formdef.data_class().get(formdata.id).get_static_substitution_variables()['form_status_changed'] is False
assert formdef.data_class().get(formdata.id).get_substitution_variables()['form_status_changed'] is False
# add a comment to last evolution, forcing create a new one
formdata.evolution[-1].comment = 'new-evolution-1'
@ -4524,6 +4526,8 @@ def test_form_worklow_multiple_identical_status(pub):
formdata = formdef.data_class().get(formdata.id)
assert len(formdata.evolution) == 2
assert formdata.status == 'wf-st1'
assert formdef.data_class().get(formdata.id).get_static_substitution_variables()['form_status_changed'] is False
assert formdef.data_class().get(formdata.id).get_substitution_variables()['form_status_changed'] is False
# again
formdata.evolution[-1].comment = 'new-evolution-2'
@ -4547,6 +4551,48 @@ def test_form_worklow_multiple_identical_status(pub):
assert resp.body.count('new-evolution-1') == 1
assert resp.body.count('new-evolution-2') == 1
def test_form_worklow_comments_on_same_status(pub):
pub.session_manager.session_class.wipe()
user = create_user(pub)
role = Role(name='xxx')
role.store()
user.roles = [role.id]
user.store()
formdef = create_formdef()
formdef.fields = []
formdef.workflow_roles = {'_receiver': role.id}
formdef.store()
workflow = Workflow.get_default_workflow()
formdef.workflow_id = workflow.id
formdef.store()
formdef.data_class().wipe()
formdata = formdef.data_class()()
formdata.just_created()
formdata.perform_workflow()
formdata.store()
assert formdef.data_class().get(formdata.id).status == 'wf-new'
app = get_app(pub)
assert formdef.data_class().get(formdata.id).get_static_substitution_variables()['form_status_changed'] is True
assert formdef.data_class().get(formdata.id).get_substitution_variables()['form_status_changed'] is True
login(app, username='foo', password='foo')
resp = app.get(formdata.get_url()).follow()
resp.form['comment'] = 'TEST COMMENT'
resp = resp.form.submit('button_commentable')
assert formdef.data_class().get(formdata.id).get_static_substitution_variables()['form_status_changed'] is False
assert formdef.data_class().get(formdata.id).get_substitution_variables()['form_status_changed'] is False
resp = app.get(formdata.get_url()).follow()
resp = resp.form.submit('button_accept')
assert formdef.data_class().get(formdata.id).get_static_substitution_variables()['form_status_changed'] is True
assert formdef.data_class().get(formdata.id).get_substitution_variables()['form_status_changed'] is True
def test_display_message(pub):
user = create_user(pub)

View File

@ -766,13 +766,22 @@ class FormData(StorableObject):
d['form_comment'] = ''
d['form_previous_status'] = ''
d['form_status_changed'] = False
if self.evolution:
first_evolution_in_current_status = None
for evolution in reversed(self.evolution):
if evolution.status and evolution.status != self.status:
d['form_previous_status'] = self.get_status_label(evolution.status)
break
if d['form_status'] != d['form_previous_status']:
d['form_status_changed'] = True
if evolution.status:
first_evolution_in_current_status = evolution
if (d['form_status'] != d['form_previous_status'] and
self.evolution[-1].status and
first_evolution_in_current_status is self.evolution[-1] and
not self.evolution[-1].last_jump_datetime):
# mark status has changed if the previous status was different
# and we are not on a change done on the same status.
d['form_status_changed'] = True
d['form_evolution'] = self.formdef.get_detailed_evolution(self)

View File

@ -396,7 +396,18 @@ class LazyFormData(LazyFormDef):
@property
def status_changed(self):
return self.status != self.previous_status
first_evolution_in_current_status = None
for evolution in reversed(self._formdata.evolution or []):
if evolution.status and evolution.status != self._formdata.status:
break
if evolution.status:
first_evolution_in_current_status = evolution
return bool(self.status != self.previous_status and
self._formdata.evolution and
self._formdata.evolution[-1].status and
first_evolution_in_current_status is self._formdata.evolution[-1] and
not self._formdata.evolution[-1].last_jump_datetime)
@property
def evolution(self):