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 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
|