Files
mayan-edms/mayan/apps/document_states/apps.py
Roberto Rosario 64e1c6bb67 Add widget support to SourceColumn
Allow passing a widget class to SourceColumn. This makes
using lambdas to render model column unnecesary and are
mostly removed too.

Signed-off-by: Roberto Rosario <Roberto.Rosario@mayan-edms.com>
2018-12-22 05:35:31 -04:00

337 lines
12 KiB
Python

from __future__ import unicode_literals
from django.apps import apps
from django.db.models.signals import post_save
from django.utils.translation import ugettext_lazy as _
from kombu import Exchange, Queue
from mayan.apps.acls import ModelPermission
from mayan.apps.acls.links import link_acl_list
from mayan.apps.common import (
MayanAppConfig, menu_facet, menu_list_facet, menu_main, menu_object,
menu_secondary, menu_setup, menu_sidebar, menu_tools
)
from mayan.apps.common.classes import ModelAttribute
from mayan.apps.common.links import link_object_error_list
from mayan.apps.common.permissions_runtime import permission_error_log_view
from mayan.apps.common.widgets import TwoStateWidget
from mayan.apps.navigation import SourceColumn
from mayan.celery import app
from .classes import WorkflowAction
from .handlers import (
handler_index_document, handler_launch_workflow,
handler_trigger_transition,
)
from .methods import method_get_workflow
from .links import (
link_document_workflow_instance_list, link_setup_workflow_create,
link_setup_workflow_delete, link_setup_workflow_document_types,
link_setup_workflow_edit, link_setup_workflow_list,
link_setup_workflow_state_action_delete,
link_setup_workflow_state_action_edit,
link_setup_workflow_state_action_list,
link_setup_workflow_state_action_selection,
link_setup_workflow_state_create, link_setup_workflow_state_delete,
link_setup_workflow_state_edit, link_setup_workflow_states,
link_setup_workflow_transition_create,
link_setup_workflow_transition_delete, link_setup_workflow_transition_edit,
link_setup_workflow_transitions, link_tool_launch_all_workflows,
link_workflow_document_list, link_workflow_instance_detail,
link_workflow_instance_transition,
link_workflow_instance_transition_events, link_workflow_list,
link_workflow_preview, link_workflow_state_document_list,
link_workflow_state_list
)
from .permissions import (
permission_workflow_delete, permission_workflow_edit,
permission_workflow_transition, permission_workflow_view
)
from .queues import * # NOQA
from .widgets import widget_transition_events
class DocumentStatesApp(MayanAppConfig):
app_namespace = 'document_states'
app_url = 'workflows'
has_rest_api = True
has_tests = True
name = 'mayan.apps.document_states'
verbose_name = _('Workflows')
def ready(self):
super(DocumentStatesApp, self).ready()
Action = apps.get_model(
app_label='actstream', model_name='Action'
)
Document = apps.get_model(
app_label='documents', model_name='Document'
)
ErrorLogEntry = apps.get_model(
app_label='common', model_name='ErrorLogEntry'
)
Workflow = self.get_model('Workflow')
WorkflowInstance = self.get_model('WorkflowInstance')
WorkflowInstanceLogEntry = self.get_model('WorkflowInstanceLogEntry')
WorkflowRuntimeProxy = self.get_model('WorkflowRuntimeProxy')
WorkflowState = self.get_model('WorkflowState')
WorkflowStateAction = self.get_model('WorkflowStateAction')
WorkflowStateRuntimeProxy = self.get_model('WorkflowStateRuntimeProxy')
WorkflowTransition = self.get_model('WorkflowTransition')
WorkflowTransitionTriggerEvent = self.get_model(
'WorkflowTransitionTriggerEvent'
)
Document.add_to_class(
name='get_workflow', value=method_get_workflow
)
ErrorLogEntry.objects.register(model=WorkflowStateAction)
WorkflowAction.initialize()
ModelAttribute(model=Document, name='get_workflow')
ModelPermission.register(
model=Document, permissions=(permission_workflow_view,)
)
ModelPermission.register(
model=Workflow, permissions=(
permission_error_log_view, permission_workflow_delete,
permission_workflow_edit, permission_workflow_transition,
permission_workflow_view,
)
)
ModelPermission.register_inheritance(
model=WorkflowInstance, related='workflow',
)
ModelPermission.register_inheritance(
model=WorkflowInstanceLogEntry,
related='workflow_instance__workflow',
)
ModelPermission.register(
model=WorkflowTransition,
permissions=(permission_workflow_transition,)
)
ModelPermission.register_inheritance(
model=WorkflowState, related='workflow',
)
ModelPermission.register_inheritance(
model=WorkflowStateAction, related='state__workflow',
)
ModelPermission.register_inheritance(
model=WorkflowTransition, related='workflow',
)
ModelPermission.register_inheritance(
model=WorkflowTransitionTriggerEvent,
related='transition__workflow',
)
SourceColumn(
attribute='label', is_identifier=True, source=Workflow
)
SourceColumn(attribute='internal_name', source=Workflow)
SourceColumn(attribute='get_initial_state', source=Workflow)
SourceColumn(
attribute='workflow', is_identifier=True,
source=WorkflowInstance
)
SourceColumn(attribute='get_current_state', source=WorkflowInstance)
SourceColumn(
attribute='get_last_transition_user', source=WorkflowInstance
)
SourceColumn(
attribute='get_last_transition', source=WorkflowInstance
)
SourceColumn(
attribute='get_last_transition_datetime', kwargs={
'formatted': True
}, source=WorkflowInstance
)
SourceColumn(
attribute='get_current_completion', source=WorkflowInstance
)
SourceColumn(
attribute='get_rendered_datetime', source=WorkflowInstanceLogEntry
)
SourceColumn(attribute='user', source=WorkflowInstanceLogEntry)
SourceColumn(attribute='transition', source=WorkflowInstanceLogEntry)
SourceColumn(attribute='comment', source=WorkflowInstanceLogEntry)
SourceColumn(
attribute='label', is_identifier=True, source=WorkflowState
)
SourceColumn(
attribute='initial', source=WorkflowState, widget=TwoStateWidget
)
SourceColumn(attribute='completion', source=WorkflowState)
SourceColumn(
attribute='label', is_identifier=True, source=WorkflowStateAction
)
SourceColumn(
attribute='enabled', source=WorkflowStateAction,
widget=TwoStateWidget
)
SourceColumn(
attribute='get_when_display', label=_('When?'),
source=WorkflowStateAction
)
SourceColumn(attribute='get_class_label', source=WorkflowStateAction)
SourceColumn(
attribute='label', is_identifier=True, source=WorkflowTransition
)
SourceColumn(attribute='origin_state', source=WorkflowTransition)
SourceColumn(attribute='destination_state', source=WorkflowTransition)
SourceColumn(
func=lambda context: widget_transition_events(
transition=context['object']
), label=_('Triggers'), source=WorkflowTransition
)
app.conf.task_queues.extend(
(
Queue(
'document_states', Exchange('document_states'),
routing_key='document_states'
),
)
)
app.conf.task_queues.extend(
(
Queue(
'document_states_fast', Exchange('document_states_fast'),
routing_key='document_states_fast'
),
)
)
app.conf.task_routes.update(
{
'mayan.apps.document_states.tasks.task_generate_document_state_image': {
'queue': 'document_states'
},
'mayan.apps.document_states.tasks.task_launch_all_workflows': {
'queue': 'document_states_fast'
},
}
)
menu_facet.bind_links(
links=(link_document_workflow_instance_list,), sources=(Document,)
)
menu_list_facet.bind_links(
links=(
link_setup_workflow_document_types,
link_setup_workflow_states, link_setup_workflow_transitions,
link_workflow_preview, link_acl_list
), sources=(Workflow,)
)
menu_main.bind_links(links=(link_workflow_list,), position=10)
menu_object.bind_links(
links=(
link_setup_workflow_edit,
link_setup_workflow_delete
), sources=(Workflow,)
)
menu_object.bind_links(
links=(
link_setup_workflow_state_edit,
link_setup_workflow_state_action_list,
link_setup_workflow_state_delete
), sources=(WorkflowState,)
)
menu_object.bind_links(
links=(
link_setup_workflow_transition_edit,
link_workflow_instance_transition_events, link_acl_list,
link_setup_workflow_transition_delete
), sources=(WorkflowTransition,)
)
menu_object.bind_links(
links=(
link_workflow_instance_detail,
link_workflow_instance_transition
), sources=(WorkflowInstance,)
)
menu_object.bind_links(
links=(
link_workflow_document_list, link_workflow_state_list,
), sources=(WorkflowRuntimeProxy,)
)
menu_object.bind_links(
links=(
link_workflow_state_document_list,
), sources=(WorkflowStateRuntimeProxy,)
)
menu_object.bind_links(
links=(
link_setup_workflow_state_action_edit,
link_object_error_list,
link_setup_workflow_state_action_delete,
), sources=(WorkflowStateAction,)
)
menu_secondary.bind_links(
links=(link_setup_workflow_list, link_setup_workflow_create),
sources=(
Workflow, 'document_states:setup_workflow_create',
'document_states:setup_workflow_list'
)
)
menu_secondary.bind_links(
links=(link_workflow_list,),
sources=(
WorkflowRuntimeProxy,
)
)
menu_secondary.bind_links(
links=(link_setup_workflow_state_action_selection,),
sources=(
WorkflowState,
)
)
menu_setup.bind_links(links=(link_setup_workflow_list,))
menu_sidebar.bind_links(
links=(
link_setup_workflow_transition_create,
), sources=(
WorkflowTransition,
'document_states:setup_workflow_transition_list',
)
)
menu_sidebar.bind_links(
links=(
link_setup_workflow_state_create,
), sources=(
WorkflowState,
'document_states:setup_workflow_state_list',
)
)
menu_tools.bind_links(links=(link_tool_launch_all_workflows,))
post_save.connect(
dispatch_uid='workflows_handler_launch_workflow',
receiver=handler_launch_workflow, sender=Document
)
# Index updating
post_save.connect(
dispatch_uid='workflows_handler_index_document_save',
receiver=handler_index_document, sender=WorkflowInstanceLogEntry
)
post_save.connect(
dispatch_uid='workflows_handler_handler_trigger_transition',
receiver=handler_trigger_transition, sender=Action
)