diff --git a/apps/workflows/__init__.py b/apps/workflows/__init__.py index dd31e1196e..898fdeed25 100644 --- a/apps/workflows/__init__.py +++ b/apps/workflows/__init__.py @@ -5,15 +5,21 @@ from django.utils.translation import ugettext_lazy as _ from navigation.api import register_links, register_multi_item_links from project_setup.api import register_setup -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_DELETE) +from .models import Workflow setup_workflow_link = {'text': _(u'workflows'), 'view': 'setup_workflow_list', 'icon': 'chart_organisation.png', 'permissions': [PERMISSION_WORKFLOW_SETUP_VIEW]} setup_workflow_list_link = {'text': _(u'workflow list'), 'view': 'setup_workflow_list', 'famfam': 'chart_organisation', 'permissions': [PERMISSION_WORKFLOW_SETUP_VIEW]} +setup_workflow_create_link = {'text': _(u'create new'), 'view': 'setup_workflow_create', 'famfam': 'chart_organisation_add', 'permissions': [PERMISSION_WORKFLOW_SETUP_CREATE]} +setup_workflow_edit_link = {'text': _(u'edit'), 'view': 'setup_workflow_edit', 'args': 'object.pk', 'famfam': 'chart_organisation', 'permissions': [PERMISSION_WORKFLOW_SETUP_EDIT]} +setup_workflow_delete_link = {'text': _(u'delete'), 'view': 'setup_workflow_delete', 'args': 'object.pk', 'famfam': 'chart_organisation_delete', 'permissions': [PERMISSION_WORKFLOW_SETUP_DELETE]} -#register_links(User, [user_edit, user_set_password, user_delete]) -register_links(['setup_workflow_list'], [setup_workflow_link], menu_name=u'secondary_menu') +register_links(Workflow, [setup_workflow_edit_link, setup_workflow_delete_link]) +register_links([Workflow, 'setup_workflow_list', 'setup_workflow_create'], [setup_workflow_list_link], menu_name=u'form_header') +register_links([Workflow, 'setup_workflow_list', 'setup_workflow_create'], [setup_workflow_create_link], menu_name=u'secondary_menu') #register_multi_item_links(['user_list'], [user_multiple_set_password, user_multiple_delete]) - register_setup(setup_workflow_link) diff --git a/apps/workflows/forms.py b/apps/workflows/forms.py new file mode 100644 index 0000000000..800affbb35 --- /dev/null +++ b/apps/workflows/forms.py @@ -0,0 +1,11 @@ +from __future__ import absolute_import + +from django import forms +from django.utils.translation import ugettext_lazy as _ + +from .models import Workflow + + +class WorkflowSetupForm(forms.ModelForm): + class Meta: + model = Workflow diff --git a/apps/workflows/permissions.py b/apps/workflows/permissions.py index ef1939942c..89003b2e84 100644 --- a/apps/workflows/permissions.py +++ b/apps/workflows/permissions.py @@ -6,4 +6,7 @@ from permissions.models import PermissionNamespace, Permission user_management_namespace = PermissionNamespace('workflows', _(u'Workflows')) -PERMISSION_WORKFLOW_SETUP_VIEW = Permission.objects.register(user_management_namespace, 'workflow_setup_view', _(u'View existing workflows templates')) +PERMISSION_WORKFLOW_SETUP_VIEW = Permission.objects.register(user_management_namespace, 'workflow_setup_view', _(u'View existing workflow templates')) +PERMISSION_WORKFLOW_SETUP_CREATE = Permission.objects.register(user_management_namespace, 'workflow_setup_create', _(u'Create new workflow templates')) +PERMISSION_WORKFLOW_SETUP_EDIT = Permission.objects.register(user_management_namespace, 'workflow_setup_edit', _(u'Edit existing workflow templates')) +PERMISSION_WORKFLOW_SETUP_DELETE = Permission.objects.register(user_management_namespace, 'workflow_setup_delete', _(u'Delete existing workflow templates')) diff --git a/apps/workflows/urls.py b/apps/workflows/urls.py index bcad909101..ee434eeca9 100644 --- a/apps/workflows/urls.py +++ b/apps/workflows/urls.py @@ -1,5 +1,8 @@ from django.conf.urls.defaults import patterns, url urlpatterns = patterns('workflows.views', - url(r'^setup/list/$', 'setup_workflow_list', (), 'setup_workflow_list'), + url(r'^setup/workflow/list/$', 'setup_workflow_list', (), 'setup_workflow_list'), + url(r'^setup/workflow/create/$', 'setup_workflow_create', (), 'setup_workflow_create'), + url(r'^setup/workflow/(?P\d+)/edit/$', 'setup_workflow_edit', (), 'setup_workflow_edit'), + url(r'^setup/workflow/(?P\d+)/delete/$', 'setup_workflow_delete', (), 'setup_workflow_delete'), ) diff --git a/apps/workflows/views.py b/apps/workflows/views.py index ae8d56dbb6..cb4d373874 100644 --- a/apps/workflows/views.py +++ b/apps/workflows/views.py @@ -13,26 +13,16 @@ from django.utils.safestring import mark_safe from django.conf import settings from django.core.exceptions import PermissionDenied -#from documents.permissions import (PERMISSION_DOCUMENT_CREATE, -# PERMISSION_DOCUMENT_NEW_VERSION) -#from documents.models import DocumentType, Document -#from documents.conf.settings import THUMBNAIL_SIZE -#from metadata.api import decode_metadata_from_url, metadata_repr_as_list from permissions.models import Permission -#from common.utils import encapsulate +from common.utils import encapsulate #from common.widgets import two_state_template -#import sendfile #from acls.models import AccessEntry from .models import Workflow -#from .literals import (SOURCE_CHOICE_WEB_FORM, SOURCE_CHOICE_STAGING, -# SOURCE_CHOICE_WATCH, SOURCE_CHOICE_POP3_EMAIL, SOURCE_CHOICE_IMAP_EMAIL) -#from .literals import (SOURCE_UNCOMPRESS_CHOICE_Y, -# SOURCE_UNCOMPRESS_CHOICE_ASK) -#from .staging import create_staging_file_class -#from .forms import (StagingDocumentForm, WebFormForm, -# WatchFolderSetupForm) -from .permissions import PERMISSION_WORKFLOW_SETUP_VIEW +from .forms import WorkflowSetupForm +from .permissions import (PERMISSION_WORKFLOW_SETUP_VIEW, + PERMISSION_WORKFLOW_SETUP_CREATE, PERMISSION_WORKFLOW_SETUP_EDIT, + PERMISSION_WORKFLOW_SETUP_DELETE) logger = logging.getLogger(__name__) @@ -45,13 +35,107 @@ def setup_workflow_list(request): context = { 'object_list': Workflow.objects.all(), 'title': _(u'workflows'), - #'hide_link': True, + 'hide_link': True, #'list_object_variable_name': 'source', #'source_type': source_type, - #'extra_columns': [ - # {'name': _(u'Enabled'), 'attribute': encapsulate(lambda source: two_state_template(source.enabled))}, - #], + 'extra_columns': [ + {'name': _(u'Initial state'), 'attribute': encapsulate(lambda workflow: workflow.initial_state or _(u'None'))}, + ], } return render_to_response('generic_list.html', context, context_instance=RequestContext(request)) + + +def setup_workflow_create(request): + Permission.objects.check_permissions(request.user, [PERMISSION_WORKFLOW_SETUP_CREATE]) + redirect_url = reverse('setup_workflow_list') + #previous = request.POST.get('previous', request.GET.get('previous', request.META.get('HTTP_REFERER', redirect_url))) + + if request.method == 'POST': + form = WorkflowSetupForm(request.POST) + if form.is_valid(): + workflow = form.save() + messages.success(request, _(u'Workflow created succesfully.')) + return HttpResponseRedirect(redirect_url) + else: + form = WorkflowSetupForm() + + return render_to_response('generic_form.html', { + 'title': _(u'create workflow'), + 'form': form, + }, + context_instance=RequestContext(request)) + + +def setup_workflow_edit(request, workflow_pk): + Permission.objects.check_permissions(request.user, [PERMISSION_WORKFLOW_SETUP_EDIT]) + workflow = get_object_or_404(Workflow, pk=workflow_pk) + + if request.method == 'POST': + form = WorkflowSetupForm(instance=workflow, data=request.POST) + if form.is_valid(): + form.save() + messages.success(request, _(u'Workflow "%s" updated successfully.') % workflow) + return HttpResponseRedirect(reverse('setup_workflow_list')) + else: + form = WorkflowSetupForm(instance=workflow) + + return render_to_response('generic_form.html', { + 'title': _(u'edit workflow: %s') % workflow, + 'form': form, + 'object': workflow, + 'object_name': _(u'workflow'), + }, + context_instance=RequestContext(request)) + + +def setup_workflow_delete(request, workflow_pk=None, workflow_pk_list=None): + post_action_redirect = None + + if workflow_pk: + workflows = [get_object_or_404(Workflow, pk=workflow_pk)] + post_action_redirect = reverse('setup_workflow_list') + elif workflow_pk_list: + workflows = [get_object_or_404(Workflow, pk=workflow_pk) for workflow_pk in workflow_pk_list.split(',')] + else: + messages.error(request, _(u'Must provide at least one workflow.')) + return HttpResponseRedirect(request.META.get('HTTP_REFERER', '/')) + + try: + Permission.objects.check_permissions(request.user, [PERMISSION_WORKFLOW_SETUP_DELETE]) + except PermissionDenied: + workflows = AccessEntry.objects.filter_objects_by_access(PERMISSION_WORKFLOW_SETUP_DELETE, request.user, workflows) + + 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 in workflows: + try: + workflow.delete() + messages.success(request, _(u'Workflows "%s" deleted successfully.') % workflow) + except Exception, e: + messages.error(request, _(u'Error deleting workflow "%(workflow)s": %(error)s') % { + 'workflow': workflow, 'error': e + }) + + return HttpResponseRedirect(next) + + context = { + 'object_name': _(u'workflow'), + 'delete_view': True, + 'previous': previous, + 'next': next, + 'form_icon': u'chart_organisation_delete.png', + } + if len(workflows) == 1: + context['object'] = workflows[0] + context['title'] = _(u'Are you sure you wish to delete the workflow: %s?') % ', '.join([unicode(d) for d in workflows]) + context['message'] = _('Will be removed from all documents.') + elif len(workflows) > 1: + context['title'] = _(u'Are you sure you wish to delete the workflows: %s?') % ', '.join([unicode(d) for d in workflows]) + context['message'] = _('Will be removed from all documents.') + + return render_to_response('generic_confirm.html', context, + context_instance=RequestContext(request))