backoffice: add timestamps and links to global timeout events (#10811) #1009

Merged
fpeters merged 1 commits from wip/10811-inspect-global-timeout-link into main 2024-01-12 15:15:30 +01:00
4 changed files with 48 additions and 25 deletions

View File

@ -4,6 +4,7 @@ import re
import time
import pytest
from pyquery import PyQuery
from wcs import fields
from wcs.admin.settings import UserFieldsFormDef
@ -818,12 +819,12 @@ def test_inspect_page_actions_traces(pub):
resp = app.get(formdata.get_url(backoffice=True), status=200)
resp = resp.click('Data Inspector')
assert '>Actions Tracing</' in resp
assert [x.text for x in resp.pyquery('#inspect-timeline .event')] == [
assert [PyQuery(x).text() for x in resp.pyquery('#inspect-timeline .event')] == [
'Created (frontoffice submission)',
'Continuation',
None, # Created form
None, # Created card
None, # Edited card
'Created form - target form #1-1',
'Created card - target card #1-1',
'Edited card - target card #1-1',
'Global action timeout',
]
assert [x.text for x in resp.pyquery('#inspect-timeline strong')] == ['Just Submitted', 'New']
@ -842,11 +843,16 @@ def test_inspect_page_actions_traces(pub):
'http://example.net/backoffice/management/target-form/1/', # Created form
'http://example.net/backoffice/data/target-card/1/', # Created card
'http://example.net/backoffice/data/target-card/1/', # Edited card
'http://example.net/backoffice/workflows/2/global-actions/1/#trigger-%s' % trigger.id,
]
# check all links are valid
for link in event_links:
app.get(link)
assert [x.text for x in resp.pyquery('#inspect-timeline .event a') if x.text] == [
'Created form - target form #1-1',
'Created card - target card #1-1',
'Edited card - target card #1-1',
'Global action timeout',
]
assert [x.text for x in resp.pyquery('#inspect-timeline .event-error')] == ['Nothing edited']
action_links = [x.attrib['href'] for x in resp.pyquery('#inspect-timeline a.tracing-link')]
@ -883,6 +889,7 @@ def test_inspect_page_actions_traces(pub):
'Created form - target form #1-1',
'Created card - deleted',
'Edited card - deleted',
'Global action timeout',
]
# and there's no crash when part of the workflow changes

View File

@ -4043,7 +4043,7 @@ class FormBackOfficeStatusPage(FormStatusPage):
for trace in self.workflow_traces:
if trace.event:
global_event = trace if trace.is_global_event() else None
r += htmltext(trace.print_event(global_event=global_event))
r += trace.print_event(formdata=self.filled, global_event=global_event)
if trace.action_item_key:
r += htmltext(

View File

@ -1848,16 +1848,16 @@ ul.form-inspector li {
}
}
span.event-datetime {
padding: 0 1ex 0 0;
visibility: hidden;
}
span.event-datetime,
span.datetime,
span.status,
span.event,
span.event-error {
padding: 0 1ex;
}
span.event-datetime {
padding-right: 0;
}
span.event, span.event-error {
font-style: italic;

View File

@ -14,6 +14,8 @@
# You should have received a copy of the GNU General Public License
# along with this program; if not, see <http://www.gnu.org/licenses/>.
from quixote.html import TemplateIO, htmltext
from wcs import sql
from wcs.qommon import _
@ -162,37 +164,51 @@ class WorkflowTrace(sql.WorkflowTrace):
real_action = None
return real_action
def print_event(self, global_event):
def print_event(self, formdata, global_event):
event_item = TemplateIO(html=True)
event_item += htmltext(
'<li><span class="event-datetime">%s</span>' % self.timestamp.strftime('%Y-%m-%d %H:%M:%S')
)
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')
):
return '<li><span class="event"><a href="%s">%s</a></span></li>' % (
event_item += htmltext('<span class="event"><a href="%s">%s</a></span>') % (
self.get_external_url(global_event),
self.get_event_label(),
)
if (
elif (
self.event_args
and self.event_args.get('external_formdef_id')
and self.event_args.get('external_formdata_id')
):
return (
'<li><span class="event-datetime">%s</span><span class="event"><a href="%s">%s - %s</a></span></li>'
% (
self.timestamp.strftime('%Y-%m-%d %H:%M:%S.%f')[:-3],
self.get_external_formdata_url(global_event),
self.get_event_label(),
self.formdata.get_display_name() if self.formdata else _('deleted'),
)
event_item += htmltext('<span class="event"><a href="%s">%s - %s</a></span>') % (
self.get_external_formdata_url(global_event),
self.get_event_label(),
self.formdata.get_display_name() if self.formdata else _('deleted'),
)
if self.event == 'workflow-edited-carddata':
return '<li><span class="event-datetime">%s</span><span class="event-error">%s</span></li>' % (
self.timestamp.strftime('%Y-%m-%d %H:%M:%S.%f')[:-3],
_('Nothing edited'),
elif (
self.event_args and self.event_args.get('global_action_id') and self.event_args.get('trigger_id')
):
event_item += htmltext('<span class="event"><a href="%s#trigger-%s">%s</a></span>') % (
self.get_base_url(formdata.formdef.workflow, None, global_event=global_event),
self.event_args.get('trigger_id'),
self.get_event_label(),
)
return '<li><span class="event">%s</span></li>' % self.get_event_label()
elif self.event == 'workflow-edited-carddata':
# it would usually have external_formdef_id/external_formdata_id and be handled
# earlier; this matches the case when no targetted card could be found.
event_item += htmltext('<span class="event-error">%s</span>') % _('Nothing edited')
elif self.event == 'continuation':
# do not include timestamps for continuation lines
event_item = TemplateIO(html=True)
event_item += htmltext('<li><span class="event">%s</span>') % _('Continuation')
else:
event_item += htmltext('<span class="event">%s</span>') % self.get_event_label()
event_item += htmltext('</li>')
return event_item.getvalue()
def print_action(self, action_classes, filled, global_event):
action_label = action_classes.get(self.action_item_key, self.action_item_key)