backoffice: add timestamps and links to global timeout events (#10811) #1009
|
@ -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
|
||||
|
|
|
@ -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(
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue