diff --git a/apps/document_indexing/__init__.py b/apps/document_indexing/__init__.py index 59d6b30895..0adb88c37a 100644 --- a/apps/document_indexing/__init__.py +++ b/apps/document_indexing/__init__.py @@ -8,13 +8,34 @@ from navigation.api import register_top_menu, register_sidebar_template, \ from main.api import register_maintenance_links from documents.permissions import PERMISSION_DOCUMENT_VIEW from documents.models import Document +from project_setup.api import register_setup -#from .models import IndexInstance +from .models import (Index, IndexTemplateNode, IndexInstanceNode) from .permissions import (PERMISSION_DOCUMENT_INDEXING_VIEW, - PERMISSION_DOCUMENT_INDEXING_REBUILD_INDEXES) + PERMISSION_DOCUMENT_INDEXING_REBUILD_INDEXES, + PERMISSION_DOCUMENT_INDEXING_SETUP, + PERMISSION_DOCUMENT_INDEXING_CREATE, + PERMISSION_DOCUMENT_INDEXING_EDIT, + PERMISSION_DOCUMENT_INDEXING_DELETE +) -""" -index_list = {'text': _(u'index list'), 'view': 'index_instance_list', 'famfam': 'folder_page', 'permissions': [PERMISSION_DOCUMENT_INDEXING_VIEW]} + +def is_root_node(context): + return context['node'].parent==None + + +index_setup = {'text': _(u'indexes'), 'view': 'index_setup_list', 'icon': 'tab.png', 'permissions': [PERMISSION_DOCUMENT_INDEXING_SETUP]} +index_setup_list = {'text': _(u'index list'), 'view': 'index_setup_list', 'famfam': 'tab', 'permissions': [PERMISSION_DOCUMENT_INDEXING_SETUP]} +index_setup_create = {'text': _(u'create index'), 'view': 'index_setup_create', 'famfam': 'tab_add', 'permissions': [PERMISSION_DOCUMENT_INDEXING_CREATE]} +index_setup_edit = {'text': _(u'edit'), 'view': 'index_setup_edit', 'args': 'index.pk', 'famfam': 'tab_edit', 'permissions': [PERMISSION_DOCUMENT_INDEXING_EDIT]} +index_setup_delete = {'text': _(u'delete'), 'view': 'index_setup_delete', 'args': 'index.pk', 'famfam': 'tab_delete', 'permissions': [PERMISSION_DOCUMENT_INDEXING_DELETE]} +index_setup_view = {'text': _(u'tree template'), 'view': 'index_setup_view', 'args': 'index.pk', 'famfam': 'textfield', 'permissions': [PERMISSION_DOCUMENT_INDEXING_SETUP]} + +template_node_create = {'text': _(u'new child node'), 'view': 'template_node_create', 'args': 'node.pk', 'famfam': 'textfield_add', 'permissions': [PERMISSION_DOCUMENT_INDEXING_SETUP]} +template_node_edit = {'text': _(u'edit'), 'view': 'template_node_edit', 'args': 'node.pk', 'famfam': 'textfield', 'permissions': [PERMISSION_DOCUMENT_INDEXING_SETUP], 'conditional_disable': is_root_node} +template_node_delete = {'text': _(u'delete'), 'view': 'template_node_delete', 'args': 'node.pk', 'famfam': 'textfield_delete', 'permissions': [PERMISSION_DOCUMENT_INDEXING_SETUP], 'conditional_disable': is_root_node} + +index_list = {'text': _(u'index list'), 'view': 'index_list', 'famfam': 'folder_page', 'permissions': [PERMISSION_DOCUMENT_INDEXING_VIEW]} index_parent = {'text': _(u'go up one level'), 'view': 'index_instance_list', 'args': 'object.parent.pk', 'famfam': 'arrow_up', 'permissions': [PERMISSION_DOCUMENT_INDEXING_VIEW], 'dont_mark_active': True} document_index_list = {'text': _(u'indexes'), 'view': 'document_index_list', 'args': 'object.pk', 'famfam': 'folder_page', 'permissions': [PERMISSION_DOCUMENT_INDEXING_VIEW, PERMISSION_DOCUMENT_VIEW]} @@ -26,7 +47,14 @@ register_maintenance_links([rebuild_index_instances], namespace='document_indexi register_sidebar_template(['index_instance_list'], 'indexing_help.html') -register_links(IndexInstance, [index_parent]) +register_links(IndexInstanceNode, [index_parent]) register_links(Document, [document_index_list], menu_name='form_header') -""" + +register_setup(index_setup) + +register_links([Index, 'index_setup_list', 'index_setup_create', 'template_node_edit', 'template_node_delete'], [index_setup_list, index_setup_create], menu_name='secondary_menu') + +register_links(Index, [index_setup_edit, index_setup_delete, index_setup_view]) + +register_links(IndexTemplateNode, [template_node_create, template_node_edit, template_node_delete]) diff --git a/apps/document_indexing/permissions.py b/apps/document_indexing/permissions.py index 01f1afa652..d752e158b6 100644 --- a/apps/document_indexing/permissions.py +++ b/apps/document_indexing/permissions.py @@ -6,5 +6,10 @@ from permissions.models import PermissionNamespace, Permission document_indexing_namespace = PermissionNamespace('document_indexing', _(u'Indexing')) +PERMISSION_DOCUMENT_INDEXING_SETUP = Permission.objects.register(document_indexing_namespace, 'document_index_setup', _(u'Configure document indexes')) +PERMISSION_DOCUMENT_INDEXING_CREATE = Permission.objects.register(document_indexing_namespace, 'document_index_create', _(u'Create new document indexes')) +PERMISSION_DOCUMENT_INDEXING_EDIT = Permission.objects.register(document_indexing_namespace, 'document_index_edit', _(u'Edit document indexes')) +PERMISSION_DOCUMENT_INDEXING_DELETE = Permission.objects.register(document_indexing_namespace, 'document_index_delete', _(u'Delete document indexes')) + PERMISSION_DOCUMENT_INDEXING_VIEW = Permission.objects.register(document_indexing_namespace, 'document_index_view', _(u'View document indexes')) PERMISSION_DOCUMENT_INDEXING_REBUILD_INDEXES = Permission.objects.register(document_indexing_namespace, 'document_rebuild_indexes', _(u'Rebuild document indexes')) diff --git a/apps/document_indexing/urls.py b/apps/document_indexing/urls.py index d3337e4991..74e7b11aae 100644 --- a/apps/document_indexing/urls.py +++ b/apps/document_indexing/urls.py @@ -1,7 +1,20 @@ from django.conf.urls.defaults import patterns, url urlpatterns = patterns('document_indexing.views', - url(r'^(?P\d+)/list/$', 'index_instance_list', (), 'index_instance_list'), + url(r'^setup/index/list/$', 'index_setup_list', (), 'index_setup_list'), + url(r'^setup/index/create/$', 'index_setup_create', (), 'index_setup_create'), + url(r'^setup/index/(?P\d+)/edit/$', 'index_setup_edit', (), 'index_setup_edit'), + url(r'^setup/index/(?P\d+)/delete/$', 'index_setup_delete', (), 'index_setup_delete'), + url(r'^setup/index/(?P\d+)/view/$', 'index_setup_view', (), 'index_setup_view'), + + url(r'^setup/template/node/(?P\d+)/create/child/$', 'template_node_create', (), 'template_node_create'), + url(r'^setup/template/node/(?P\d+)/edit/$', 'template_node_edit', (), 'template_node_edit'), + url(r'^setup/template/node/(?P\d+)/delete/$', 'template_node_delete', (), 'template_node_delete'), + + url(r'^list/$', 'index_list', (), 'index_list'), + + #Broken + url(r'^(?P\d+)/list/$', 'index_instance_list', (), 'index_instance_list'), url(r'^list/$', 'index_instance_list', (), 'index_instance_list'), url(r'^rebuild/all/$', 'rebuild_index_instances', (), 'rebuild_index_instances'), diff --git a/apps/document_indexing/views.py b/apps/document_indexing/views.py index 98aaee47e1..758e2ad945 100644 --- a/apps/document_indexing/views.py +++ b/apps/document_indexing/views.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- + from __future__ import absolute_import from django.utils.translation import ugettext_lazy as _ @@ -5,7 +7,9 @@ from django.http import HttpResponseRedirect from django.shortcuts import render_to_response, get_object_or_404 from django.template import RequestContext from django.contrib import messages -from django.utils.safestring import mark_safe +#from django.utils.safestring import mark_safe +from django.core.urlresolvers import reverse +from django.utils.html import conditional_escape, mark_safe from permissions.models import Permission from documents.permissions import PERMISSION_DOCUMENT_VIEW @@ -13,26 +17,302 @@ from documents.models import Document from documents.views import document_list from common.utils import encapsulate -from .permissions import (PERMISSION_DOCUMENT_INDEXING_VIEW, - PERMISSION_DOCUMENT_INDEXING_REBUILD_INDEXES) +from .forms import IndexForm, IndexTemplateNodeForm from .models import (Index, IndexTemplateNode, IndexInstanceNode) from .api import (get_breadcrumbs, get_instance_link, do_rebuild_all_indexes) from .widgets import index_instance_item_link +from .permissions import (PERMISSION_DOCUMENT_INDEXING_VIEW, + PERMISSION_DOCUMENT_INDEXING_REBUILD_INDEXES, + PERMISSION_DOCUMENT_INDEXING_SETUP, + PERMISSION_DOCUMENT_INDEXING_CREATE, + PERMISSION_DOCUMENT_INDEXING_EDIT, + PERMISSION_DOCUMENT_INDEXING_DELETE +) + +# Setup views +def index_setup_list(request): + context = { + 'title': _(u'indexes'), + 'hide_object': True, + 'list_object_variable_name': 'index', + 'extra_columns': [ + {'name': _(u'name'), 'attribute': 'name'}, + {'name': _(u'title'), 'attribute': 'title'}, + ] + } + + queryset = Index.objects.all() + + try: + Permission.objects.check_permissions(request.user, [PERMISSION_DOCUMENT_INDEXING_SETUP]) + except PermissionDenied: + queryset = AccessEntry.objects.filter_objects_by_access(PERMISSION_DOCUMENT_INDEXING_SETUP, request.user, queryset) + + context['object_list'] = queryset + + return render_to_response('generic_list.html', + context, + context_instance=RequestContext(request) + ) +def index_setup_create(request): + Permission.objects.check_permissions(request.user, [PERMISSION_DOCUMENT_INDEXING_CREATE]) + + if request.method == 'POST': + form = IndexForm(request.POST) + if form.is_valid(): + index = form.save() + #apply_default_acls(folder, request.user) + messages.success(request, _(u'Index created successfully.')) + return HttpResponseRedirect(reverse('index_setup_list')) + else: + form = IndexForm() + + return render_to_response('generic_form.html', { + 'title': _(u'create index'), + 'form': form, + }, + context_instance=RequestContext(request)) + + +def index_setup_edit(request, index_pk): + index = get_object_or_404(Index, pk=index_pk) + + try: + Permission.objects.check_permissions(request.user, [PERMISSION_DOCUMENT_INDEXING_EDIT]) + except PermissionDenied: + AccessEntry.objects.check_access(PERMISSION_DOCUMENT_INDEXING_CREATE, request.user, index) + + if request.method == 'POST': + form = IndexForm(request.POST, instance=index) + if form.is_valid(): + form.save() + messages.success(request, _(u'Index edited successfully')) + return HttpResponseRedirect(reverse('index_setup_list')) + else: + form = IndexForm(instance=index) + + return render_to_response('generic_form.html', { + 'title': _(u'edit index: %s') % index, + 'form': form, + 'index': index, + 'object_name': _(u'index'), + 'navigation_object_name': 'index', + }, + context_instance=RequestContext(request)) + + +def index_setup_delete(request, index_pk): + index = get_object_or_404(Index, pk=index_pk) + + try: + Permission.objects.check_permissions(request.user, [PERMISSION_DOCUMENT_INDEXING_DELETE]) + except PermissionDenied: + AccessEntry.objects.check_access(PERMISSION_DOCUMENT_INDEXING_DELETE, request.user, index) + + post_action_redirect = reverse('index_setup_list') + + 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': + try: + index.delete() + messages.success(request, _(u'Index: %s deleted successfully.') % index) + except Exception, e: + messages.error(request, _(u'Index: %(index)s delete error: %(error)s') % { + 'index': index, 'error': e}) + + return HttpResponseRedirect(next) + + context = { + 'index': index, + 'object_name': _(u'index'), + 'navigation_object_name': 'index', + 'delete_view': True, + 'previous': previous, + 'next': next, + 'title': _(u'Are you sure you with to delete the index: %s?') % index, + 'form_icon': u'tab_delete.png', + } + + return render_to_response('generic_confirm.html', context, + context_instance=RequestContext(request)) + + +def index_setup_view(request, index_pk): + index = get_object_or_404(Index, pk=index_pk) + + try: + Permission.objects.check_permissions(request.user, [PERMISSION_DOCUMENT_INDEXING_SETUP]) + except PermissionDenied: + AccessEntry.objects.check_access(PERMISSION_DOCUMENT_INDEXING_SETUP, request.user, index) + + root, created = IndexTemplateNode.objects.get_or_create(parent=None, index=index) + object_list = root.get_descendants(include_self=True) + + context = { + 'object_list': object_list, + 'index': index, + 'object_name': _(u'index'), + 'list_object_variable_name': 'node', + 'navigation_object_name': 'index', + 'title': _(u'tree template nodes for index: %s') % index, + 'hide_object': True, + 'extra_columns': [ + {'name': _(u'level'), 'attribute': encapsulate(lambda x: u''.join([mark_safe(conditional_escape(u'--') * (getattr(x, x._mptt_meta.level_attr) - 0)), unicode(x if x.parent else 'root') ] ))}, + ], + } + + return render_to_response('generic_list.html', context, + context_instance=RequestContext(request)) + + +def index_list(request): + context = { + 'title': _(u'indexes'), + #'hide_object': True, + #'list_object_variable_name': 'index', + #'extra_columns': [ + # {'name': _(u'name'), 'attribute': 'name'}, + # {'name': _(u'title'), 'attribute': 'title'}, + #] + 'overrided_object_links': [{}], + } + + queryset = Index.objects.all() + + try: + Permission.objects.check_permissions(request.user, [PERMISSION_DOCUMENT_INDEXING_SETUP]) + except PermissionDenied: + queryset = AccessEntry.objects.filter_objects_by_access(PERMISSION_DOCUMENT_INDEXING_SETUP, request.user, queryset) + + context['object_list'] = queryset + + return render_to_response('generic_list.html', + context, + context_instance=RequestContext(request) + ) + +# Node views +def template_node_create(request, parent_pk): + parent_node = get_object_or_404(IndexTemplateNode, pk=parent_pk) + + try: + Permission.objects.check_permissions(request.user, [PERMISSION_DOCUMENT_INDEXING_SETUP]) + except PermissionDenied: + AccessEntry.objects.check_access(PERMISSION_DOCUMENT_INDEXING_SETUP, request.user, parent_node.index) + + if request.method == 'POST': + form = IndexTemplateNodeForm(request.POST) + if form.is_valid(): + node = form.save() + messages.success(request, _(u'Index template node created successfully.')) + return HttpResponseRedirect(reverse('index_setup_view', args=[node.index.pk])) + else: + form = IndexTemplateNodeForm(initial={'index': parent_node.index, 'parent': parent_node}) + + return render_to_response('generic_form.html', { + 'title': _(u'create child node'), + 'form': form, + 'index': parent_node.index, + 'object_name': _(u'index'), + 'navigation_object_name': 'index', + }, + context_instance=RequestContext(request)) + + +def template_node_edit(request, node_pk): + node = get_object_or_404(IndexTemplateNode, pk=node_pk) + + try: + Permission.objects.check_permissions(request.user, [PERMISSION_DOCUMENT_INDEXING_SETUP]) + except PermissionDenied: + AccessEntry.objects.check_access(PERMISSION_DOCUMENT_INDEXING_SETUP, request.user, node.index) + + if request.method == 'POST': + form = IndexTemplateNodeForm(request.POST, instance=node) + if form.is_valid(): + form.save() + messages.success(request, _(u'Index template node edited successfully')) + return HttpResponseRedirect(reverse('index_setup_view', args=[node.index.pk])) + else: + form = IndexTemplateNodeForm(instance=node) + + return render_to_response('generic_form.html', { + 'title': _(u'edit index template node: %s') % node, + 'form': form, + 'index': node.index, + 'node': node, + + 'navigation_object_list': [ + {'object': 'index', 'name': _(u'index')}, + {'object': 'node', 'name': _(u'node')} + ], + }, + context_instance=RequestContext(request)) + + +def template_node_delete(request, node_pk): + node = get_object_or_404(IndexTemplateNode, pk=node_pk) + + try: + Permission.objects.check_permissions(request.user, [PERMISSION_DOCUMENT_INDEXING_SETUP]) + except PermissionDenied: + AccessEntry.objects.check_access(PERMISSION_DOCUMENT_INDEXING_SETUP, request.user, node.index) + + post_action_redirect = reverse('index_setup_view', args=[node.index.pk]) + + 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': + try: + node.delete() + messages.success(request, _(u'Node: %s deleted successfully.') % node) + except Exception, e: + messages.error(request, _(u'Node: %(node)s delete error: %(error)s') % { + 'node': node, 'error': e}) + + return HttpResponseRedirect(next) + + context = { + #'node': node, + #'object_name': _(u'index'), + #'navigation_object_name': 'index', + 'delete_view': True, + 'previous': previous, + 'next': next, + 'title': _(u'Are you sure you with to delete the index template node: %s?') % node, + 'form_icon': u'textfield_delete.png', + 'index': node.index, + 'node': node, + + 'navigation_object_list': [ + {'object': 'index', 'name': _(u'index')}, + {'object': 'node', 'name': _(u'node')} + ], + } + + return render_to_response('generic_confirm.html', context, + context_instance=RequestContext(request)) + + +# User views def index_instance_list(request, index_id=None): Permission.objects.check_permissions(request.user, [PERMISSION_DOCUMENT_INDEXING_VIEW]) if index_id: - index_instance = get_object_or_404(IndexInstance, pk=index_id) + index_instance = get_object_or_404(IndexInstanceNode, pk=index_id) index_instance_list = [index for index in index_instance.get_children().order_by('value')] breadcrumbs = get_breadcrumbs(index_instance) if index_instance.documents.count(): for document in index_instance.documents.all().order_by('file_filename'): index_instance_list.append(document) else: - index_instance_list = IndexInstance.objects.filter(parent=None) + index_instance_list = IndexInstanceNode.objects.filter(parent=None) breadcrumbs = get_instance_link() index_instance = None