Source code for yawf.forms

# -*- coding: utf-8 -*-

from django import forms
from django.template import loader as template_loader
from django.template import Context

from yawf import get_workflow, get_workflow_by_instance
from yawf.exceptions import WorkflowNotLoadedError, NoAvailableMessagesError
from yawf.messages.allowed import get_allowed_messages


[docs]def get_create_form_html(workflow_type, sender=None): workflow = get_workflow(workflow_type) if workflow is None: raise WorkflowNotLoadedError(workflow_type) form = workflow.create_form_cls() if not workflow.create_form_template: t = template_loader.select_template( ('workflows/%s/create_form.html' % workflow_type, 'workflows/create_form.html')) else: t = template_loader.get_template(workflow.create_form_template) context = Context({'form': form, 'workflow_type': workflow_type}) return t.render(context)
[docs]def get_object_as_html(obj, sender): workflow_type = obj.workflow_type allowed_context = get_allowed_messages(sender, obj) t = template_loader.select_template( ('workflows/%s/object_%s.html' % (workflow_type, obj.state), 'workflows/%s/object.html' % workflow_type, 'workflows/object.html')) dict_context = {'object': obj} dict_context.update(allowed_context) context = Context(dict_context) return t.render(context)
[docs]def get_action_form_html(obj, sender): workflow_type = obj.workflow_type workflow = get_workflow_by_instance(obj) allowed_context = get_allowed_messages(sender, obj) t = template_loader.select_template( ('workflows/%s/form_%s.html' % (workflow_type, obj.state), 'workflows/%s/form.html' % workflow_type, 'workflows/form.html')) allowed_messages = allowed_context['allowed_messages'] if not allowed_messages: raise NoAvailableMessagesError(obj.id, sender) if callable(workflow.formcls_factory): form_cls = workflow.formcls_factory(allowed_messages) form = form_cls(instance=obj) else: # get all form subclasses from message validators, throw away duplicates bases = tuple(set(ms.validator_cls for ms in allowed_messages if issubclass(ms.validator_cls, forms.BaseForm))) if bases: # join them all in one mixin class mixin_form_cls = type('WorkflowObjectMixinForm', bases, {}) # instantiate it and put instance as argument (requires ModelForm subclass to be in bases) if issubclass(mixin_form_cls, forms.ModelForm): form = mixin_form_cls(instance=obj) else: form = mixin_form_cls(initial=obj.__dict__) else: form = forms.Form() dict_context = {'form': form, 'instance': obj} dict_context.update(allowed_context) context = Context(dict_context) return t.render(context)