workflows: include link to external workflow action in inspect (#69003) #899

Merged
fpeters merged 1 commits from wip/69003-trace-external-workflow into main 2024-01-12 14:53:18 +01:00
3 changed files with 32 additions and 14 deletions

View File

@ -140,6 +140,7 @@ def test_call_external_workflow_with_evolution_linked_object(pub):
def test_call_external_workflow_with_data_sourced_object(pub, admin_user):
FormDef.wipe()
CardDef.wipe()
Workflow.wipe()
carddef_wf = Workflow(name='Carddef Workflow')
carddef_wf.add_status('status')
@ -213,8 +214,17 @@ def test_call_external_workflow_with_data_sourced_object(pub, admin_user):
assert [x for x in data.get_workflow_traces() if x.event][-1].event == 'global-external-workflow'
resp = login(get_app(pub), username='admin', password='admin').get(data.get_backoffice_url() + 'inspect')
# check tracing link is correct:
assert '/global-actions/ac1/items/1/' in resp.text
# check event line is a link to global action
assert resp.pyquery('#inspect-timeline .event a').text() == 'Trigger by external workflow'
assert (
resp.pyquery('#inspect-timeline .event a').attr.href
== 'http://example.net/backoffice/workflows/1/global-actions/ac1/'
)
# check action tracing link are correct
assert [x.attrib['href'] for x in resp.pyquery('#inspect-timeline a.tracing-link')] == [
'http://example.net/backoffice/workflows/1/status/1/',
'http://example.net/backoffice/workflows/1/global-actions/ac1/items/1/',
]
perform_items([update_action], formdata)
data = carddef.data_class().select()[0]

View File

@ -312,7 +312,9 @@ class ExternalWorkflowGlobalAction(WorkflowStatusItem):
get_publisher().substitutions.feed(caller_source)
target_data.record_workflow_event(
'global-external-workflow', global_action_id=trigger.parent.id
'global-external-workflow',
external_workflow_id=trigger.get_workflow().id,
global_action_id=trigger.parent.id,
)
perform_items(
trigger.parent.items,

View File

@ -109,14 +109,18 @@ class WorkflowTrace(sql.WorkflowTrace):
def get_external_url(self, global_event):
try:
return '%sitems/%s/' % (
self.get_base_url(
self.external_workflow,
self.event_args.get('external_status_id'),
global_event,
),
self.event_args.get('external_item_id'),
)
if self.event_args.get('external_status_id'):
return '%sitems/%s/' % (
self.get_base_url(
self.external_workflow,
self.event_args.get('external_status_id'),
global_event,
),
self.event_args.get('external_item_id'),
)
elif self.event_args.get('global_action_id'):
return self.get_base_url(self.external_workflow, global_event=global_event)
except KeyError:
return '#missing-%s' % self.event_args.get('external_item_id')
@ -129,7 +133,7 @@ class WorkflowTrace(sql.WorkflowTrace):
return self.formdata.get_backoffice_url()
def get_base_url(self, workflow, status_id, global_event):
def get_base_url(self, workflow, status_id=None, global_event=None):
if global_event:
if not global_event.event_args:
raise KeyError()
@ -166,8 +170,10 @@ class WorkflowTrace(sql.WorkflowTrace):
if (
self.event_args
and self.event_args.get('external_workflow_id')
and self.event_args.get('external_status_id')
and self.event_args.get('external_item_id')
and (
(self.event_args.get('external_status_id') and self.event_args.get('external_item_id'))
or self.event_args.get('global_action_id')
)
):
return '<li><span class="event"><a href="%s">%s</a></span></li>' % (
self.get_external_url(global_event),