Files
mayan-edms/mayan/apps/document_states/apps.py
Roberto Rosario abfc8b0c09 Navigation: Add list facet menu
Add the new list facet navigation menu. Used to provide facets
to the list subtemplate. The list facet allows separating the object
action links from the object navigation links. The list facet
links are displayed before the list object links on the list
subtemplate. In the object views, the list facet menu behaves
exactly the same as the form facet menu.

Signed-off-by: Roberto Rosario <roberto.rosario.gonzalez@gmail.com>
2018-11-29 04:17:53 -04:00

380 lines
13 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 acls import ModelPermission
from acls.links import link_acl_list
from common import (
MayanAppConfig, menu_facet, menu_list_facet, menu_main, menu_object,
menu_secondary, menu_setup, menu_sidebar, menu_tools
)
from common.classes import ModelAttribute
from common.links import link_object_error_list
from common.permissions_runtime import permission_error_log_view
from common.widgets import TwoStateWidget
from mayan.celery import app
from navigation import SourceColumn
from .classes import DocumentStateHelper, WorkflowAction
from .handlers import (
handler_index_document, handler_trigger_transition, launch_workflow
)
from .links import (
link_document_workflow_instance_list, link_setup_workflow_document_types,
link_setup_workflow_create, link_setup_workflow_delete,
link_setup_workflow_edit, link_setup_workflow_list,
link_setup_workflow_states, 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_transitions,
link_setup_workflow_transition_create,
link_setup_workflow_transition_delete, link_setup_workflow_transition_edit,
link_tool_launch_all_workflows, link_workflow_instance_detail,
link_workflow_instance_transition, link_workflow_document_list,
link_workflow_list, link_workflow_preview,
link_workflow_state_document_list, link_workflow_state_list,
link_workflow_instance_transition_events
)
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_url = 'states'
has_rest_api = True
has_tests = True
name = 'document_states'
verbose_name = _('Document states')
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(
'workflow', DocumentStateHelper.constructor
)
ErrorLogEntry.objects.register(model=WorkflowStateAction)
WorkflowAction.initialize()
ModelAttribute(
model=Document,
name='workflow.< workflow internal name >.get_current_state()',
label=_('Current state of a workflow'), description=_(
'Return the current state of the selected workflow'
)
)
ModelAttribute(
model=Document,
name='workflow.< workflow internal name >.get_current_state().completion',
label=_('Current state of a workflow'), description=_(
'Return the completion value of the current state of the '
'selected 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(
source=Workflow, label=_('Label'), attribute='label'
)
SourceColumn(
source=Workflow, label=_('Internal name'),
attribute='internal_name'
)
SourceColumn(
source=Workflow, label=_('Initial state'),
func=lambda context: context['object'].get_initial_state() or _('None')
)
SourceColumn(
source=WorkflowInstance, label=_('Current state'),
attribute='get_current_state'
)
SourceColumn(
source=WorkflowInstance, label=_('User'),
func=lambda context: getattr(
context['object'].get_last_log_entry(), 'user', _('None')
)
)
SourceColumn(
source=WorkflowInstance, label=_('Last transition'),
attribute='get_last_transition'
)
SourceColumn(
source=WorkflowInstance, label=_('Date and time'),
func=lambda context: getattr(
context['object'].get_last_log_entry(), 'datetime', _('None')
)
)
SourceColumn(
source=WorkflowInstance, label=_('Completion'),
func=lambda context: getattr(
context['object'].get_current_state(), 'completion', _('None')
)
)
SourceColumn(
source=WorkflowInstanceLogEntry, label=_('Date and time'),
attribute='datetime'
)
SourceColumn(
source=WorkflowInstanceLogEntry, label=_('User'), attribute='user'
)
SourceColumn(
source=WorkflowInstanceLogEntry, label=_('Transition'),
attribute='transition'
)
SourceColumn(
source=WorkflowInstanceLogEntry, label=_('Comment'),
attribute='comment'
)
SourceColumn(
source=WorkflowState, label=_('Is initial state?'),
func=lambda context: TwoStateWidget(
state=context['object'].initial
).render()
)
SourceColumn(
source=WorkflowState, label=_('Completion'), attribute='completion'
)
SourceColumn(
source=WorkflowStateAction, label=_('Label'), attribute='label'
)
SourceColumn(
source=WorkflowStateAction, label=_('Enabled?'),
func=lambda context: TwoStateWidget(
state=context['object'].enabled
).render()
)
SourceColumn(
source=WorkflowStateAction, label=_('When?'),
attribute='get_when_display'
)
SourceColumn(
source=WorkflowStateAction, label=_('Action type'),
attribute='get_class_label'
)
SourceColumn(
source=WorkflowTransition, label=_('Origin state'),
attribute='origin_state'
)
SourceColumn(
source=WorkflowTransition, label=_('Destination state'),
attribute='destination_state'
)
SourceColumn(
source=WorkflowTransition, label=_('Triggers'),
func=lambda context: widget_transition_events(
transition=context['object']
)
)
app.conf.CELERY_QUEUES.extend(
(
Queue(
'document_states', Exchange('document_states'),
routing_key='document_states'
),
)
)
app.conf.CELERY_QUEUES.extend(
(
Queue(
'document_states_fast', Exchange('document_states_fast'),
routing_key='document_states_fast'
),
)
)
app.conf.CELERY_ROUTES.update(
{
'document_states.tasks.task_generate_document_state_image': {
'queue': 'document_states'
},
'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(
launch_workflow, dispatch_uid='launch_workflow', sender=Document
)
# Index updating
post_save.connect(
handler_index_document,
dispatch_uid='handler_index_document_save',
sender=WorkflowInstanceLogEntry
)
post_save.connect(
handler_trigger_transition,
dispatch_uid='document_states_handler_trigger_transition',
sender=Action
)