admin: display list of source status (#5739)

This commit is contained in:
Frédéric Péters 2014-10-30 10:30:59 +01:00
parent c60cf90548
commit 7e774f9f05
4 changed files with 40 additions and 26 deletions

View File

@ -115,14 +115,7 @@ def graphviz(workflow, url_prefix='', select=None, svg=True,
for status in workflow.possible_status:
i = status.id
for item in status.items:
next_status_ids = []
for status_key in item.__dict__:
if status_key == 'status' or \
status_key.startswith('status_') or \
status_key.endswith('_status'):
next_id = getattr(item, status_key, None)
if next_id:
next_status_ids.append(next_id)
next_status_ids = [x.id for x in item.get_target_status()]
if not next_status_ids:
next_status_ids = [status.id]
for next_id in next_status_ids:
@ -355,6 +348,23 @@ class WorkflowStatusPage(Directory):
r += htmltext('</ul>')
r += htmltext('</div>') # bo-block
source_status = []
for status in self.workflow.possible_status:
if status is self.status:
continue
for item in status.items:
if self.status in item.get_target_status():
source_status.append(status)
break
if source_status:
r += htmltext('<div class="bo-block">')
r += htmltext('<h3>%s</h3>') % _('Jumps')
r += htmltext('<p>%s ') % _('This status is reachable from the following status:')
r += htmltext(', ').join([htmltext('<a href="../%s/">%s</a>') % (x.id, x.name) for x in source_status])
r += htmltext('.</p>')
r += htmltext('</div>')
r += htmltext('<p><a href="../../">%s</a></p>') % _('Back to workflow main page')
r += htmltext('<div class="bo-block">')

View File

@ -122,7 +122,7 @@ class JumpWorkflowStatusItem(WorkflowStatusJumpItem):
def render_as_line(self):
if not self.status:
return _('Change Status Automatically (not completed)')
wf_status = self.get_status()
wf_status = self.get_target_status()
if not wf_status:
return _('Change Status Automatically (broken)')
reasons = []
@ -135,10 +135,10 @@ class JumpWorkflowStatusItem(WorkflowStatusJumpItem):
if reasons:
return _('Change Status Automatically (to %(name)s) (%(reasons)s)') % {
'name': wf_status.name,
'name': wf_status[0].name,
'reasons': ', '.join(reasons)}
else:
return _('Change Status Automatically (to %s)') % wf_status.name
return _('Change Status Automatically (to %s)') % wf_status[0].name
def get_parameters(self):
return ('status', 'condition', 'trigger', 'by', 'timeout')
@ -186,9 +186,9 @@ class JumpWorkflowStatusItem(WorkflowStatusJumpItem):
return
if self.must_jump(formdata):
wf_status = self.get_status()
wf_status = self.get_target_status()
if wf_status:
formdata.status = 'wf-%s' % wf_status.id
formdata.status = 'wf-%s' % wf_status[0].id
def must_jump(self, formdata):
must_jump = True
@ -243,7 +243,7 @@ def workflows_with_timeout():
wfs_status[id] = {}
if not wfs_status[id].has_key(status_str):
wfs_status[id][status_str] = []
if not item.get_status():
if not item.get_target_status():
# this will catch status being a removed status
continue
wfs_status[id][status_str].append(item)

View File

@ -34,9 +34,9 @@ class TimeoutWorkflowStatusItem(WorkflowStatusJumpItem):
is_available = classmethod(is_available)
def render_as_line(self):
if self.status and self.get_status() and self.timeout:
if self.status and self.get_target_status() and self.timeout:
return _('Change Status on Timeout to "%(status)s" after %(time)s') % \
{'status': self.get_status().name, 'time': seconds2humanduration(self.timeout)}
{'status': self.get_target_status()[0].name, 'time': seconds2humanduration(self.timeout)}
else:
return _('Change Status on Timeout (not completed)')

View File

@ -769,6 +769,10 @@ class WorkflowStatusItem:
def get_substitution_variables(self, formdata):
return {}
def get_target_status(self):
"""Returns a list of status this item can lead to."""
return []
def export_to_xml(self, charset, include_id=False):
item = ET.Element('item')
item.attrib['type'] = self.key
@ -938,18 +942,18 @@ class WorkflowStatusJumpItem(WorkflowStatusItem):
status = None
endpoint = False
def get_status(self):
def get_target_status(self):
if not self.status:
return None
return []
try:
return [x for x in self.parent.parent.possible_status if x.id == self.status][0]
return [x for x in self.parent.parent.possible_status if x.id == self.status]
except IndexError:
get_publisher().get_app_logger().error(
'reference to invalid status in workflow %s, status %s, item %s' % (
self.parent.parent.name,
self.parent.name,
self.description))
return None
return []
def add_parameters_widgets(self, form, parameters, prefix='', formdef=None):
if 'status' in parameters:
@ -1126,9 +1130,9 @@ class ChoiceWorkflowStatusItem(WorkflowStatusJumpItem):
def submit_form(self, form, formdata, user, evo):
if form.get_submit() == 'button%s' % self.id:
wf_status = self.get_status()
wf_status = self.get_target_status()
if wf_status:
evo.status = 'wf-%s' % wf_status.id
evo.status = 'wf-%s' % wf_status[0].id
form.clear_errors()
return True # get out of processing loop
@ -1155,8 +1159,8 @@ class JumpOnSubmitWorkflowStatusItem(WorkflowStatusJumpItem):
def render_as_line(self):
if self.status:
if self.get_status():
return _('Change Status on Submit (to %s)') % self.get_status().name
if self.get_target_status():
return _('Change Status on Submit (to %s)') % self.get_target_status()[0].name
else:
return _('Change Status on Submit (broken)')
else:
@ -1164,9 +1168,9 @@ class JumpOnSubmitWorkflowStatusItem(WorkflowStatusJumpItem):
def submit_form(self, form, formdata, user, evo):
if form.is_submitted() and not form.has_errors():
wf_status = self.get_status()
wf_status = self.get_target_status()
if wf_status:
evo.status = 'wf-%s' % wf_status.id
evo.status = 'wf-%s' % wf_status[0].id
def get_parameters(self):
return ('status',)