diff --git a/mayan/apps/document_states/apps.py b/mayan/apps/document_states/apps.py index 368c212a47..b6928fd075 100644 --- a/mayan/apps/document_states/apps.py +++ b/mayan/apps/document_states/apps.py @@ -12,7 +12,8 @@ from common import ( MayanAppConfig, menu_facet, menu_main, menu_object, menu_secondary, menu_setup, menu_sidebar, menu_tools ) -from common.classes import ModelAttribute +from common.classes import ErrorLogNamespace, ModelAttribute +from common.links import link_error_list from common.widgets import two_state_template from mayan.celery import app from navigation import SourceColumn @@ -62,9 +63,8 @@ class DocumentStatesApp(MayanAppConfig): Document = apps.get_model( app_label='documents', model_name='Document' ) - - Document.add_to_class( - 'workflow', DocumentStateHelper.constructor + ErrorLogEntry = apps.get_model( + app_label='common', model_name='ErrorLogEntry' ) Workflow = self.get_model('Workflow') @@ -76,6 +76,12 @@ class DocumentStatesApp(MayanAppConfig): WorkflowStateRuntimeProxy = self.get_model('WorkflowStateRuntimeProxy') WorkflowTransition = self.get_model('WorkflowTransition') + Document.add_to_class( + 'workflow', DocumentStateHelper.constructor + ) + + ErrorLogEntry.objects.register(model=WorkflowStateAction) + WorkflowAction.initialize() ModelAttribute( @@ -258,6 +264,7 @@ class DocumentStatesApp(MayanAppConfig): menu_object.bind_links( links=( link_setup_workflow_state_action_edit, + link_error_list, link_setup_workflow_state_action_delete, ), sources=(WorkflowStateAction,) ) diff --git a/mayan/apps/document_states/models.py b/mayan/apps/document_states/models.py index a79a55c3ba..d37af04b2c 100644 --- a/mayan/apps/document_states/models.py +++ b/mayan/apps/document_states/models.py @@ -454,10 +454,10 @@ class WorkflowInstanceLogEntry(models.Model): result = super(WorkflowInstanceLogEntry, self).save(*args, **kwargs) for action in self.transition.origin_state.exit_actions.all(): - action.execute(context={'entry_log': self}) + action.execute(context={'action': action, 'entry_log': self}) for action in self.transition.destination_state.entry_actions.all(): - action.execute(context={'entry_log': self}) + action.execute(context={'action': action, 'entry_log': self}) return result diff --git a/mayan/apps/document_states/workflow_actions.py b/mayan/apps/document_states/workflow_actions.py index 89985fd6aa..0b69b78fcd 100644 --- a/mayan/apps/document_states/workflow_actions.py +++ b/mayan/apps/document_states/workflow_actions.py @@ -65,20 +65,38 @@ class HTTPPostAction(WorkflowAction): } def execute(self, context): - url = Template(self.url).render( - context=Context(context) - ) + try: + url = Template(self.url).render( + context=Context(context) + ) + except Exception as exception: + context['action'].error_logs.create( + result='URL template error: {}'.format(exception) + ) + return logger.debug('URL template result: %s', url) - result = Template(self.payload or '{}').render( - context=Context(context) - ) + try: + result = Template(self.payload or '{}').render( + context=Context(context) + ) + except Exception as exception: + context['action'].error_logs.create( + result='Payload template error: {}'.format(exception) + ) + return logger.debug('payload template result: %s', result) - payload = json.loads(result) + try: + payload = json.loads(result, strict=False) + except Exception as exception: + context['action'].error_logs.create( + result='Payload JSON error: {}'.format(exception) + ) + return logger.debug('payload json result: %s', payload) - response = requests.post(url=url, data=payload) + requests.post(url=url, data=payload)