From 0337ab5d92158ec225a9e5b316a3cb6ee5b8f447 Mon Sep 17 00:00:00 2001 From: Roberto Rosario Date: Sat, 26 Aug 2017 22:03:19 -0400 Subject: [PATCH] Implement field order for the action dynamic forms. Perform action class validation by importing the class and not relying on an instance of action model, which might not exisit when still creating the action. Signed-off-by: Roberto Rosario --- mayan/apps/document_states/classes.py | 7 ++++++- mayan/apps/document_states/forms.py | 25 ++++++++++++++++--------- 2 files changed, 22 insertions(+), 10 deletions(-) diff --git a/mayan/apps/document_states/classes.py b/mayan/apps/document_states/classes.py index 7e6df5d4aa..8e8912b56d 100644 --- a/mayan/apps/document_states/classes.py +++ b/mayan/apps/document_states/classes.py @@ -76,7 +76,12 @@ class WorkflowAction(six.with_metaclass(WorkflowActionMetaclass, WorkflowActionB self.form_data = form_data def get_form_schema(self, request=None): - return { + result = { 'fields': self.fields or (), 'widgets': getattr(self, 'widgets', {}) } + + if hasattr(self, 'field_order'): + result['field_order'] = self.field_order + + return result diff --git a/mayan/apps/document_states/forms.py b/mayan/apps/document_states/forms.py index d2d16436de..b71cd3e718 100644 --- a/mayan/apps/document_states/forms.py +++ b/mayan/apps/document_states/forms.py @@ -6,6 +6,7 @@ from django import forms from django.db.models import Model from django.db.models.query import QuerySet from django.forms.formsets import formset_factory +from django.utils.module_loading import import_string from django.utils.translation import ugettext_lazy as _ from common.forms import DynamicModelForm @@ -44,6 +45,7 @@ class WorkflowStateActionDynamicForm(DynamicModelForm): def __init__(self, *args, **kwargs): self.request = kwargs.pop('request') + self.action_path = kwargs.pop('action_path') result = super( WorkflowStateActionDynamicForm, self ).__init__(*args, **kwargs) @@ -60,23 +62,28 @@ class WorkflowStateActionDynamicForm(DynamicModelForm): # 'action_data'. action_data = {} - for field in self.schema['fields']: - action_data[field['name']] = data.pop( - field['name'], field.get('default', None) + for field_name, field_data in self.schema['fields'].items(): + action_data[field_name] = data.pop( + field_name, field_data.get('default', None) ) - if isinstance(action_data[field['name']], QuerySet): + if isinstance(action_data[field_name], QuerySet): # Flatten the queryset to a list of ids - action_data[field['name']] = list( - action_data[field['name']].values_list('id', flat=True) + action_data[field_name] = list( + action_data[field_name].values_list('id', flat=True) ) - elif isinstance(action_data[field['name']], Model): + elif isinstance(action_data[field_name], Model): # Store only the ID of a model instance - action_data[field['name']] = action_data[field['name']].pk + action_data[field_name] = action_data[field_name].pk data['action_data'] = action_data - data = self.instance.get_class().clean( + #data = self.instance.get_class().clean( + # form_data=data, request=self.request + #) + + data = import_string(self.action_path).clean( form_data=data, request=self.request ) + self.action_path data['action_data'] = json.dumps(action_data) return data