Add workflow state delete view and transition list, create and edit views

This commit is contained in:
Roberto Rosario
2012-03-18 23:58:40 -04:00
parent 663a5d5b3b
commit ffc71ea8b3
4 changed files with 179 additions and 9 deletions

View File

@@ -20,21 +20,38 @@ setup_workflow_delete_link = Link(text=_(u'delete'), view='setup_workflow_delete
setup_workflow_states_list_link = Link(text=_(u'states'), view='setup_workflow_states_list', args='workflow.pk', sprite='transmit_go', permissions=[PERMISSION_WORKFLOW_SETUP_EDIT]) setup_workflow_states_list_link = Link(text=_(u'states'), view='setup_workflow_states_list', args='workflow.pk', sprite='transmit_go', permissions=[PERMISSION_WORKFLOW_SETUP_EDIT])
setup_workflow_states_add_link = Link(text=_(u'add state'), view='setup_workflow_state_add', args='workflow.pk', sprite='transmit_add', permissions=[PERMISSION_WORKFLOW_SETUP_EDIT]) setup_workflow_states_add_link = Link(text=_(u'add state'), view='setup_workflow_state_add', args='workflow.pk', sprite='transmit_add', permissions=[PERMISSION_WORKFLOW_SETUP_EDIT])
setup_workflow_states_edit_link = Link(text=_(u'edit state'), view='setup_workflow_state_edit', args='workflow_state.pk', sprite='transmit_edit', permissions=[PERMISSION_WORKFLOW_SETUP_EDIT]) setup_workflow_states_edit_link = Link(text=_(u'edit state'), view='setup_workflow_state_edit', args='workflow_state.pk', sprite='transmit_edit', permissions=[PERMISSION_WORKFLOW_SETUP_EDIT])
setup_workflow_states_remove_link = Link(text=_(u'remove state'), view='setup_workflow_state_remove', args='workflow_state.pk', sprite='transmit_delete', permissions=[PERMISSION_WORKFLOW_SETUP_EDIT])
setup_state_list_link = Link(text=_(u'state list'), view='setup_state_list', sprite='transmit', permissions=[PERMISSION_STATE_SETUP_VIEW]) setup_state_list_link = Link(text=_(u'state list'), view='setup_state_list', sprite='transmit', permissions=[PERMISSION_STATE_SETUP_VIEW])
setup_state_create_link = Link(text=_(u'create new state'), view='setup_state_create', sprite='transmit_add', permissions=[PERMISSION_STATE_SETUP_CREATE]) setup_state_create_link = Link(text=_(u'create new state'), view='setup_state_create', sprite='transmit_add', permissions=[PERMISSION_STATE_SETUP_CREATE])
setup_state_edit_link = Link(text=_(u'edit'), view='setup_state_edit', args='object.pk', sprite='transmit_edit', permissions=[PERMISSION_STATE_SETUP_EDIT]) setup_state_edit_link = Link(text=_(u'edit'), view='setup_state_edit', args='object.pk', sprite='transmit_edit', permissions=[PERMISSION_STATE_SETUP_EDIT])
setup_state_delete_link = Link(text=_(u'delete'), view='setup_state_delete', args='object.pk', sprite='transmit_delete', permissions=[PERMISSION_STATE_SETUP_DELETE]) setup_state_delete_link = Link(text=_(u'delete'), view='setup_state_delete', args='object.pk', sprite='transmit_delete', permissions=[PERMISSION_STATE_SETUP_DELETE])
setup_transition_list_link = Link(text=_(u'transition list'), view='setup_transition_list', sprite='chart_line', permissions=[PERMISSION_WORKFLOW_SETUP_VIEW])
setup_transition_create_link = Link(text=_(u'create new transition'), view='setup_transition_create', sprite='chart_line_add', permissions=[PERMISSION_WORKFLOW_SETUP_CREATE])
setup_transition_edit_link = Link(text=_(u'edit'), view='setup_transition_edit', args='transition.pk', sprite='chart_line', permissions=[PERMISSION_WORKFLOW_SETUP_EDIT])
setup_transition_delete_link = Link(text=_(u'delete'), view='setup_transition_delete', args='transition.pk', sprite='chart_line_delete', permissions=[PERMISSION_WORKFLOW_SETUP_DELETE])
bind_links(
[
Workflow, State, Transition,
'setup_workflow_list', 'setup_workflow_create',
'setup_state_list', 'setup_state_create',
'setup_transition_list', 'setup_transition_create',
], [
setup_workflow_list_link, setup_state_list_link, setup_transition_list_link
], menu_name=u'form_header')
bind_links([Workflow], [setup_workflow_states_list_link, setup_workflow_edit_link, setup_workflow_delete_link]) bind_links([Workflow], [setup_workflow_states_list_link, setup_workflow_edit_link, setup_workflow_delete_link])
bind_links([Workflow, State, 'setup_workflow_list', 'setup_workflow_create', 'setup_state_list'], [setup_workflow_list_link], menu_name=u'form_header')
bind_links([Workflow, 'setup_workflow_list', 'setup_workflow_create'], [setup_workflow_create_link], menu_name=u'secondary_menu') bind_links([Workflow, 'setup_workflow_list', 'setup_workflow_create'], [setup_workflow_create_link], menu_name=u'secondary_menu')
bind_links(['setup_workflow_states_list', 'setup_workflow_states_add'], [setup_workflow_states_add_link], menu_name=u'sidebar') bind_links([WorkflowState, 'setup_workflow_states_list', 'setup_workflow_states_add'], [setup_workflow_states_add_link], menu_name=u'sidebar')
bind_links([State], [setup_state_edit_link, setup_state_delete_link]) bind_links([State], [setup_state_edit_link, setup_state_delete_link])
bind_links([State, Workflow, 'setup_state_list', 'setup_workflow_list', 'setup_workflow_create'], [setup_state_list_link], menu_name=u'form_header')
bind_links([State, 'setup_state_list', 'setup_state_create'], [setup_state_create_link], menu_name=u'secondary_menu') bind_links([State, 'setup_state_list', 'setup_state_create'], [setup_state_create_link], menu_name=u'secondary_menu')
bind_links([WorkflowState], [setup_workflow_states_edit_link]) bind_links([Transition], [setup_transition_edit_link, setup_transition_delete_link])
bind_links([Transition, 'setup_transition_list', 'setup_transition_create'], [setup_transition_create_link], menu_name=u'secondary_menu')
bind_links([WorkflowState], [setup_workflow_states_edit_link, setup_workflow_states_remove_link])
register_setup(Link(text=_(u'workflows'), view='setup_workflow_list', icon='chart_organisation.png', permissions=[PERMISSION_WORKFLOW_SETUP_VIEW])) register_setup(Link(text=_(u'workflows'), view='setup_workflow_list', icon='chart_organisation.png', permissions=[PERMISSION_WORKFLOW_SETUP_VIEW]))

View File

@@ -17,5 +17,16 @@ class StateSetupForm(forms.ModelForm):
class WorkflowStateSetupForm(forms.ModelForm): class WorkflowStateSetupForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
workflow = kwargs.pop('workflow')
super(WorkflowStateSetupForm, self).__init__(*args, **kwargs)
self.fields['workflow'].initial = workflow
self.fields['workflow'].widget = forms.widgets.HiddenInput()
class Meta: class Meta:
model = WorkflowState model = WorkflowState
class TransitionSetupForm(forms.ModelForm):
class Meta:
model = Transition

View File

@@ -8,9 +8,16 @@ urlpatterns = patterns('workflows.views',
url(r'^setup/workflow/(?P<workflow_pk>\d+)/state/list/$', 'setup_workflow_states_list', (), 'setup_workflow_states_list'), url(r'^setup/workflow/(?P<workflow_pk>\d+)/state/list/$', 'setup_workflow_states_list', (), 'setup_workflow_states_list'),
url(r'^setup/workflow/(?P<workflow_pk>\d+)/state/create/$', 'setup_workflow_state_add', (), 'setup_workflow_state_add'), url(r'^setup/workflow/(?P<workflow_pk>\d+)/state/create/$', 'setup_workflow_state_add', (), 'setup_workflow_state_add'),
url(r'^setup/workflow/state/(?P<workflow_state_pk>\d+)/edit/$', 'setup_workflow_state_edit', (), 'setup_workflow_state_edit'), url(r'^setup/workflow/state/(?P<workflow_state_pk>\d+)/edit/$', 'setup_workflow_state_edit', (), 'setup_workflow_state_edit'),
url(r'^setup/workflow/state/(?P<workflow_state_pk>\d+)/remove/$', 'setup_workflow_state_remove', (), 'setup_workflow_state_remove'),
url(r'^setup/state/list/$', 'setup_state_list', (), 'setup_state_list'), url(r'^setup/state/list/$', 'setup_state_list', (), 'setup_state_list'),
url(r'^setup/state/create/$', 'setup_state_create', (), 'setup_state_create'), url(r'^setup/state/create/$', 'setup_state_create', (), 'setup_state_create'),
url(r'^setup/state/(?P<state_pk>\d+)/edit/$', 'setup_state_edit', (), 'setup_state_edit'), url(r'^setup/state/(?P<state_pk>\d+)/edit/$', 'setup_state_edit', (), 'setup_state_edit'),
url(r'^setup/state/(?P<state_pk>\d+)/delete/$', 'setup_state_delete', (), 'setup_state_delete'), url(r'^setup/state/(?P<state_pk>\d+)/delete/$', 'setup_state_delete', (), 'setup_state_delete'),
url(r'^setup/transition/list/$', 'setup_transition_list', (), 'setup_transition_list'),
url(r'^setup/transition/create/$', 'setup_transition_create', (), 'setup_transition_create'),
url(r'^setup/transition/(?P<transition_pk>\d+)/edit/$', 'setup_transition_edit', (), 'setup_transition_edit'),
#url(r'^setup/transition/(?P<transition_pk>\d+)/delete/$', 'setup_transition_delete', (), 'setup_transition_delete'),
) )

View File

@@ -19,7 +19,8 @@ from common.utils import encapsulate
#from acls.models import AccessEntry #from acls.models import AccessEntry
from .models import Workflow, State, Transition, WorkflowState from .models import Workflow, State, Transition, WorkflowState
from .forms import WorkflowSetupForm, StateSetupForm, WorkflowStateSetupForm from .forms import (WorkflowSetupForm, StateSetupForm,
WorkflowStateSetupForm, TransitionSetupForm)
from .permissions import (PERMISSION_WORKFLOW_SETUP_VIEW, from .permissions import (PERMISSION_WORKFLOW_SETUP_VIEW,
PERMISSION_WORKFLOW_SETUP_CREATE, PERMISSION_WORKFLOW_SETUP_EDIT, PERMISSION_WORKFLOW_SETUP_CREATE, PERMISSION_WORKFLOW_SETUP_EDIT,
PERMISSION_WORKFLOW_SETUP_DELETE, PERMISSION_STATE_SETUP_VIEW, PERMISSION_WORKFLOW_SETUP_DELETE, PERMISSION_STATE_SETUP_VIEW,
@@ -170,13 +171,13 @@ def setup_workflow_state_add(request, workflow_pk):
workflow = get_object_or_404(Workflow, pk=workflow_pk) workflow = get_object_or_404(Workflow, pk=workflow_pk)
if request.method == 'POST': if request.method == 'POST':
form = WorkflowStateSetupForm(request.POST) form = WorkflowStateSetupForm(workflow=workflow, data=request.POST)
if form.is_valid(): if form.is_valid():
state = form.save() state = form.save()
messages.success(request, _(u'worflow state created succesfully.')) messages.success(request, _(u'worflow state created succesfully.'))
return HttpResponseRedirect(redirect_url) return HttpResponseRedirect(redirect_url)
else: else:
form = WorkflowStateSetupForm() form = WorkflowStateSetupForm(workflow=workflow)
return render_to_response('generic_form.html', { return render_to_response('generic_form.html', {
'title': _(u'add worflow state'), 'title': _(u'add worflow state'),
@@ -194,13 +195,13 @@ def setup_workflow_state_edit(request, workflow_state_pk):
redirect_url = reverse('setup_workflow_states_list', args=[workflow_state.workflow.pk]) redirect_url = reverse('setup_workflow_states_list', args=[workflow_state.workflow.pk])
if request.method == 'POST': if request.method == 'POST':
form = WorkflowStateSetupForm(instance=workflow_state, data=request.POST) form = WorkflowStateSetupForm(workflow=workflow_state.workflow, instance=workflow_state, data=request.POST)
if form.is_valid(): if form.is_valid():
state = form.save() state = form.save()
messages.success(request, _(u'worflow state edited succesfully.')) messages.success(request, _(u'worflow state edited succesfully.'))
return HttpResponseRedirect(redirect_url) return HttpResponseRedirect(redirect_url)
else: else:
form = WorkflowStateSetupForm(instance=workflow_state) form = WorkflowStateSetupForm(workflow=workflow_state.workflow, instance=workflow_state)
return render_to_response('generic_form.html', { return render_to_response('generic_form.html', {
'title': _(u'edit worflow state'), 'title': _(u'edit worflow state'),
@@ -213,6 +214,78 @@ def setup_workflow_state_edit(request, workflow_state_pk):
], ],
}, context_instance=RequestContext(request)) }, context_instance=RequestContext(request))
def setup_workflow_state_remove(request, workflow_state_pk=None, workflow_state_pk_list=None):
post_action_redirect = None
if workflow_state_pk:
workflow_states = [get_object_or_404(WorkflowState, pk=workflow_state_pk)]
post_action_redirect = reverse('setup_workflow_states_list', args=[workflow_states[0].workflow.pk])
elif workflow_state_pk_list:
workflow_states = [get_object_or_404(WorkflowState, pk=workflow_state_pk) for workflow_state_pk in workflow_state_pk_list.split(',')]
else:
messages.error(request, _(u'Must provide at least one workflow state.'))
return HttpResponseRedirect(request.META.get('HTTP_REFERER', '/'))
try:
Permission.objects.check_permissions(request.user, [PERMISSION_STATE_SETUP_DELETE])
except PermissionDenied:
workflow_states = AccessEntry.objects.filter_objects_by_access(PERMISSION_STATE_SETUP_DELETE, request.user, workflow_states)
previous = request.POST.get('previous', request.GET.get('previous', request.META.get('HTTP_REFERER', '/')))
next = request.POST.get('next', request.GET.get('next', post_action_redirect if post_action_redirect else request.META.get('HTTP_REFERER', '/')))
if request.method == 'POST':
for workflow_state in workflow_states:
try:
workflow_state.delete()
messages.success(request, _(u'Workflow states "%s" removed successfully.') % workflow_state)
except Exception, e:
messages.error(request, _(u'Error removing workflow state "%(workflow_state)s": %(error)s') % {
'workflow_state': workflow_state, 'error': e
})
return HttpResponseRedirect(next)
context = {
'object_name': _(u'workflow state'),
'delete_view': True,
'previous': previous,
'next': next,
'form_icon': u'transmit_delete.png',
'workflow': workflow_states[0].workflow,
'navigation_object_list': [
{'object': 'workflow', 'name': _(u'workflow')},
{'object': 'workflow_state', 'name': _(u'workflow state')}
],
}
if len(workflow_states) == 1:
context['title'] = _(u'Are you sure you wish to remove the workflow state: %s?') % ', '.join([unicode(d) for d in workflow_states])
context['workflow_state'] = workflow_states[0]
elif len(states) > 1:
context['title'] = _(u'Are you sure you wish to remove the workflow states: %s?') % ', '.join([unicode(d) for d in workflow_states])
return render_to_response('generic_confirm.html', context,
context_instance=RequestContext(request))
def setup_workflow_transition_list(request, state_workflow_pk):
Permission.objects.check_permissions(request.user, [PERMISSION_WORKFLOW_SETUP_EDIT])
workflow = get_object_or_404(Workflow, pk=workflow_pk)
context = {
'object_list': workflow.workflowstate_set.all(),
'title': _(u'states for workflow: %s') % workflow,
'hide_link': True,
'workflow': workflow,
'navigation_object_list': [
{'object': 'workflow', 'name': _(u'workflow')},
],
'list_object_variable_name': 'workflow_state',
}
return render_to_response('generic_list.html', context,
context_instance=RequestContext(request))
# States # States
def setup_state_list(request): def setup_state_list(request):
Permission.objects.check_permissions(request.user, [PERMISSION_STATE_SETUP_VIEW]) Permission.objects.check_permissions(request.user, [PERMISSION_STATE_SETUP_VIEW])
@@ -323,3 +396,65 @@ def setup_state_delete(request, state_pk=None, state_pk_list=None):
return render_to_response('generic_confirm.html', context, return render_to_response('generic_confirm.html', context,
context_instance=RequestContext(request)) context_instance=RequestContext(request))
# Transitions
def setup_transition_list(request):
Permission.objects.check_permissions(request.user, [PERMISSION_WORKFLOW_SETUP_VIEW])
context = {
'object_list': Transition.objects.all(),
'title': _(u'transitions'),
'hide_link': True,
#'extra_columns': [
# {'name': _(u'Initial state'), 'attribute': encapsulate(lambda transition: transition.initial_state or _(u'None'))},
#],
'list_object_variable_name': 'transition',
}
return render_to_response('generic_list.html', context,
context_instance=RequestContext(request))
def setup_transition_create(request):
Permission.objects.check_permissions(request.user, [PERMISSION_WORKFLOW_SETUP_CREATE])
redirect_url = reverse('setup_transition_list')
if request.method == 'POST':
form = TransitionSetupForm(request.POST)
if form.is_valid():
transition = form.save()
messages.success(request, _(u'Transition created succesfully.'))
return HttpResponseRedirect(redirect_url)
else:
form = TransitionSetupForm()
return render_to_response('generic_form.html', {
'title': _(u'create transition'),
'form': form,
},
context_instance=RequestContext(request))
def setup_transition_edit(request, transition_pk):
Permission.objects.check_permissions(request.user, [PERMISSION_WORKFLOW_SETUP_EDIT])
transition = get_object_or_404(Transition, pk=transition_pk)
if request.method == 'POST':
form = TransitionSetupForm(instance=transition, data=request.POST)
if form.is_valid():
form.save()
messages.success(request, _(u'Transition "%s" updated successfully.') % transition)
return HttpResponseRedirect(reverse('setup_transition_list'))
else:
form = TransitionSetupForm(instance=transition)
return render_to_response('generic_form.html', {
'title': _(u'edit transition: %s') % transition,
'form': form,
'transition': transition,
'navigation_object_list': [
{'object': 'transition', 'name': _(u'transition')},
],
},
context_instance=RequestContext(request))