73 lines
2.6 KiB
Python
73 lines
2.6 KiB
Python
from __future__ import absolute_import, unicode_literals
|
|
|
|
from django import forms
|
|
from django.core.exceptions import PermissionDenied
|
|
from django.utils.translation import ugettext_lazy as _
|
|
|
|
from acls.models import AccessControlList
|
|
from permissions import Permission
|
|
|
|
from .models import Workflow, WorkflowState, WorkflowTransition
|
|
from .permissions import permission_workflow_transition
|
|
|
|
|
|
class WorkflowForm(forms.ModelForm):
|
|
class Meta:
|
|
fields = ('label',)
|
|
model = Workflow
|
|
|
|
|
|
class WorkflowStateForm(forms.ModelForm):
|
|
class Meta:
|
|
fields = ('initial', 'label', 'completion')
|
|
model = WorkflowState
|
|
|
|
|
|
class WorkflowTransitionForm(forms.ModelForm):
|
|
def __init__(self, *args, **kwargs):
|
|
workflow = kwargs.pop('workflow')
|
|
super(WorkflowTransitionForm, self).__init__(*args, **kwargs)
|
|
self.fields['origin_state'].queryset = self.fields['origin_state'].queryset.filter(workflow=workflow)
|
|
self.fields['destination_state'].queryset = self.fields['destination_state'].queryset.filter(workflow=workflow)
|
|
|
|
class Meta:
|
|
fields = ('label', 'origin_state', 'destination_state')
|
|
model = WorkflowTransition
|
|
|
|
|
|
class WorkflowInstanceTransitionForm(forms.Form):
|
|
def __init__(self, *args, **kwargs):
|
|
user = kwargs.pop('user')
|
|
workflow_instance = kwargs.pop('workflow_instance')
|
|
super(WorkflowInstanceTransitionForm, self).__init__(*args, **kwargs)
|
|
queryset = workflow_instance.get_transition_choices().all()
|
|
|
|
try:
|
|
Permission.check_permissions(
|
|
requester=user, permissions=(permission_workflow_transition,)
|
|
)
|
|
except PermissionDenied:
|
|
try:
|
|
# Check for ACL access to the workflow, if true, allow all
|
|
# transition options.
|
|
AccessControlList.objects.check_access(
|
|
permissions=permission_workflow_transition, user=user,
|
|
obj=workflow_instance.workflow
|
|
)
|
|
except PermissionDenied:
|
|
# If not ACL access to the workflow, filter transition options
|
|
# by each transition ACL access
|
|
queryset = AccessControlList.objects.filter_by_access(
|
|
permission=permission_workflow_transition, user=user,
|
|
queryset=queryset
|
|
)
|
|
|
|
self.fields['transition'].queryset = queryset
|
|
|
|
transition = forms.ModelChoiceField(
|
|
label=_('Transition'), queryset=WorkflowTransition.objects.none()
|
|
)
|
|
comment = forms.CharField(
|
|
label=_('Comment'), required=False, widget=forms.widgets.Textarea()
|
|
)
|