Instead of inserting the path of the apps into the Python app, the apps are now referenced by their full import path. This app name claves with external or native Python libraries. Example: Mayan statistics app vs. Python new statistics library. Every app reference is now prepended with 'mayan.apps'. Existing config.yml files need to be updated manually. Signed-off-by: Roberto Rosario <roberto.rosario.gonzalez@gmail.com>
88 lines
2.3 KiB
Python
88 lines
2.3 KiB
Python
from __future__ import unicode_literals
|
|
|
|
from importlib import import_module
|
|
import logging
|
|
|
|
from django.apps import apps
|
|
from django.utils import six
|
|
from django.utils.encoding import force_text
|
|
|
|
from mayan.apps.common.classes import PropertyHelper
|
|
|
|
__all__ = ('WorkflowAction',)
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
class DocumentStateHelper(PropertyHelper):
|
|
@staticmethod
|
|
@property
|
|
def constructor(*args, **kwargs):
|
|
return DocumentStateHelper(*args, **kwargs)
|
|
|
|
def get_result(self, name):
|
|
return self.instance.workflows.get(workflow__internal_name=name)
|
|
|
|
|
|
class WorkflowActionMetaclass(type):
|
|
_registry = {}
|
|
|
|
def __new__(mcs, name, bases, attrs):
|
|
new_class = super(WorkflowActionMetaclass, mcs).__new__(
|
|
mcs, name, bases, attrs
|
|
)
|
|
|
|
if not new_class.__module__ == __name__:
|
|
mcs._registry[
|
|
'{}.{}'.format(new_class.__module__, name)
|
|
] = new_class
|
|
|
|
return new_class
|
|
|
|
|
|
class WorkflowActionBase(object):
|
|
fields = ()
|
|
|
|
|
|
class WorkflowAction(six.with_metaclass(WorkflowActionMetaclass, WorkflowActionBase)):
|
|
@classmethod
|
|
def clean(cls, request, form_data=None):
|
|
return form_data
|
|
|
|
@classmethod
|
|
def get(cls, name):
|
|
return cls._registry[name]
|
|
|
|
@classmethod
|
|
def get_all(cls):
|
|
return sorted(cls._registry.values(), key=lambda x: x.label)
|
|
|
|
@classmethod
|
|
def id(cls):
|
|
return '{}.{}'.format(cls.__module__, cls.__name__)
|
|
|
|
@staticmethod
|
|
def initialize():
|
|
for app in apps.get_app_configs():
|
|
try:
|
|
import_module('{}.workflow_actions'.format(app.name))
|
|
except ImportError as exception:
|
|
if force_text(exception) not in ('No module named workflow_actions', 'No module named \'{}.workflow_actions\''.format(app.name)):
|
|
logger.error(
|
|
'Error importing %s workflow_actions.py file; %s',
|
|
app.name, exception
|
|
)
|
|
|
|
def __init__(self, form_data=None):
|
|
self.form_data = form_data
|
|
|
|
def get_form_schema(self, request=None):
|
|
result = {
|
|
'fields': self.fields or (),
|
|
'widgets': getattr(self, 'widgets', {})
|
|
}
|
|
|
|
if hasattr(self, 'field_order'):
|
|
result['field_order'] = self.field_order
|
|
|
|
return result
|