diff --git a/apps/document_indexing/__init__.py b/apps/document_indexing/__init__.py index 8b13789179..5d4e18b8ce 100644 --- a/apps/document_indexing/__init__.py +++ b/apps/document_indexing/__init__.py @@ -1 +1,23 @@ +from django.utils.translation import ugettext_lazy as _ +from navigation.api import register_links, register_menu +from permissions.api import register_permissions +from main.api import register_tool + +PERMISSION_DOCUMENT_INDEXING_VIEW = 'document_index_view' +PERMISSION_DOCUMENT_INDEXING_REBUILD_INDEXES = 'document_rebuild_indexes' + +register_permissions('document_indexing', [ + {'name': PERMISSION_DOCUMENT_INDEXING_VIEW, 'label': _(u'View document indexes')}, + {'name': PERMISSION_DOCUMENT_INDEXING_REBUILD_INDEXES, 'label': _(u'Rebuild document indexes')}, +]) + +index_list = {'text': _(u'index list'), 'view': 'index_instance_list', 'famfam': 'folder_link', 'permissions': {'namespace': 'document_indexing', 'permissions': [PERMISSION_DOCUMENT_INDEXING_VIEW]}} + +register_menu([ + {'text': _('indexes'), 'view': 'index_instance_list', 'links': [ + ], 'famfam': 'folder_link', 'position': 2, 'permissions': {'namespace': 'document_indexing', 'permissions': [PERMISSION_DOCUMENT_INDEXING_VIEW]}}]) + +rebuild_index_instances = {'text': _('rebuild indexes'), 'view': 'rebuild_index_instances', 'famfam': 'folder_link', 'permissions': {'namespace': 'document_indexing', 'permissions': [PERMISSION_DOCUMENT_INDEXING_REBUILD_INDEXES]}, 'description': _(u'Deletes and creates from scratch all the document indexes.')} + +register_tool(rebuild_index_instances, namespace='document_indexing', title=_(u'Indexes')) diff --git a/apps/document_indexing/api.py b/apps/document_indexing/api.py index a762de42c3..ab23b2ad7b 100644 --- a/apps/document_indexing/api.py +++ b/apps/document_indexing/api.py @@ -3,6 +3,7 @@ from django.utils.translation import ugettext from django.core.urlresolvers import reverse from django.utils.safestring import mark_safe +from documents.models import Document from metadata.classes import MetadataObject from document_indexing.models import Index, IndexInstance @@ -43,8 +44,8 @@ def delete_indexes(document): """ warnings = [] - for node in document.indexinstance_set.all(): - _delete_document_from_node(document, node) + for index_instance in document.indexinstance_set.all(): + _remove_document_from_index_instance(document, index_instance) return warnings @@ -78,7 +79,7 @@ def get_breadcrumbs(index_instance, simple=False, single_link=False): """ result = [] if single_link: - # Return the entire breadcrumb as a single HTML anchor + # Return the entire breadcrumb path as a single HTML anchor simple = True result.append(get_instance_link(simple=simple)) @@ -89,17 +90,24 @@ def get_breadcrumbs(index_instance, simple=False, single_link=False): result.append(get_instance_link(index_instance, simple=simple)) if single_link: + # Return the entire breadcrumb path as a single HTML anchor return mark_safe(get_instance_link(index_instance=index_instance, text=(u' / '.join(result)))) else: return mark_safe(u' / '.join(result)) +def do_rebuild_all_indexes(): + IndexInstance.objects.all().delete() + for document in Document.objects.all(): + update_indexes(document) + + # Internal functions def _evaluate_index(eval_dict, document, node, parent_index_instance=None): """ - Evaluate an index expression and update or create all the related - index instances also recursively calling itself to evaluate all the - index's children + Evaluate an enabled index expression and update or create all the + related index instances also recursively calling itself to evaluate + all the index's children """ warnings = [] if node.enabled: @@ -116,9 +124,6 @@ def _evaluate_index(eval_dict, document, node, parent_index_instance=None): except (NameError, AttributeError), exc: warnings.append(_(u'Error in document indexing update expression: %(expression)s; %(exception)s') % { 'expression': node.expression, 'exception': exc}) - #raise NameError() - #This should be a warning not an error - #pass except Exception, exc: warnings.append(_(u'Error updating document index, expression: %(expression)s; %(exception)s') % { @@ -127,8 +132,7 @@ def _evaluate_index(eval_dict, document, node, parent_index_instance=None): return warnings - -def _delete_document_from_node(document, node): +def _remove_document_from_index_instance(document, index_instance): """ Delete a documents reference from an index instance and call itself recusively deleting documents and empty index instances up to the @@ -136,11 +140,13 @@ def _delete_document_from_node(document, node): """ warnings = [] try: - node.documents.remove(document) - if node.documents.count() == 0 and node.get_children().count() == 0: - parent = node.parent - node.delete() - parent_warnings = _delete_document_from_node(document, parent) + index_instance.documents.remove(document) + if index_instance.documents.count() == 0 and index_instance.get_children().count() == 0: + # if there are no more documents and no children, delete + # node and check parent for the same conditions + parent = index_instance.parent + index_instance.delete() + parent_warnings = _remove_document_from_index_instance(document, parent) warnings.extend(parent_warnings) except Exception, exc: diff --git a/apps/document_indexing/urls.py b/apps/document_indexing/urls.py index 849a777c39..5aa4fcf3a5 100644 --- a/apps/document_indexing/urls.py +++ b/apps/document_indexing/urls.py @@ -3,4 +3,5 @@ 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'^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 0ca1130b0d..ee87c680cd 100644 --- a/apps/document_indexing/views.py +++ b/apps/document_indexing/views.py @@ -8,13 +8,18 @@ from django.core.urlresolvers import reverse from django.conf import settings from django.utils.safestring import mark_safe +from permissions.api import check_permissions + +from document_indexing import PERMISSION_DOCUMENT_INDEXING_VIEW, \ + PERMISSION_DOCUMENT_INDEXING_REBUILD_INDEXES + from document_indexing.models import IndexInstance -from document_indexing.api import get_breadcrumbs, get_instance_link +from document_indexing.api import get_breadcrumbs, get_instance_link, \ + do_rebuild_all_indexes def index_instance_list(request, index_id=None): - #TODO: check_permissions - #check_permissions(request.user, 'documents', [PERMISSION_DOCUMENT_VIEW]) + check_permissions(request.user, 'document_indexing', [PERMISSION_DOCUMENT_INDEXING_VIEW]) if index_id: index_instance = get_object_or_404(IndexInstance, pk=index_id) @@ -35,3 +40,27 @@ def index_instance_list(request, index_id=None): 'hide_links': True, }, context_instance=RequestContext(request)) + +def rebuild_index_instances(request): + check_permissions(request.user, 'document_indexing', [PERMISSION_DOCUMENT_INDEXING_REBUILD_INDEXES]) + + previous = request.POST.get('previous', request.GET.get('previous', request.META.get('HTTP_REFERER', None))) + next = request.POST.get('next', request.GET.get('next', request.META.get('HTTP_REFERER', None))) + + if request.method != 'POST': + return render_to_response('generic_confirm.html', { + 'previous': previous, + 'next': next, + 'message': _(u'On large databases this operation may take some time to execute.'), + }, context_instance=RequestContext(request)) + else: + try: + errors, warnings = do_rebuild_all_indexes() + messages.success(request, _(u'Index rebuild completed successfully.')) + for warning in warnings: + messages.warning(request, warning) + + except Exception, e: + messages.error(request, _(u'Index rebuild error: %s') % e) + + return HttpResponseRedirect(next) diff --git a/apps/documents/views.py b/apps/documents/views.py index 45e3e2cd62..1256c953d7 100644 --- a/apps/documents/views.py +++ b/apps/documents/views.py @@ -318,6 +318,9 @@ def document_view_simple(request, document_id): if document_group_subtemplate: subtemplates_list.append(document_group_subtemplate) + if document.indexinstance_set.count(): + subtemplates_list.append(get_document_indexing_subtemplate(document)) + return render_to_response('generic_detail.html', { 'object': document, 'document': document, diff --git a/apps/folders/__init__.py b/apps/folders/__init__.py index d97f18fa0c..f8391bfd86 100644 --- a/apps/folders/__init__.py +++ b/apps/folders/__init__.py @@ -6,7 +6,7 @@ from navigation.api import register_sidebar_template from folders.models import Folder -folder_list = {'text': _(u'folder list'), 'view': 'folder_list', 'famfam': 'folder'} +folder_list = {'text': _(u'folder list'), 'view': 'folder_list', 'famfam': 'folder_user'} folder_create = {'text': _('create folder'), 'view': 'folder_create', 'famfam': 'folder_add'} folder_edit = {'text': _('edit'), 'view': 'folder_edit', 'args': 'object.id', 'famfam': 'folder_edit'} folder_delete = {'text': _('delete'), 'view': 'folder_delete', 'args': 'object.id', 'famfam': 'folder_delete'} @@ -21,6 +21,6 @@ register_links(['folder_edit', 'folder_delete', 'folder_list', 'folder_create'], register_menu([ {'text': _('folders'), 'view': 'folder_list', 'links': [ folder_list, folder_create - ], 'famfam': 'folder', 'position': 2}]) + ], 'famfam': 'folder_user', 'position': 2}]) register_sidebar_template(['document_view', 'document_view_simple'], 'folders_sidebar_template.html') diff --git a/apps/grouping/managers.py b/apps/grouping/managers.py index ec11f53310..081f9fd9d0 100644 --- a/apps/grouping/managers.py +++ b/apps/grouping/managers.py @@ -45,10 +45,8 @@ class DocumentGroupManager(models.Manager): '%s__%s' % (attribute, item.operator): eval(item.expression, eval_dict) }) if item.negated: - #query = (Q(metadata_type__name=attribute) & ~value_query) query = ~value_query else: - #query = (Q(metadata_type__name=attribute) & value_query) query = value_query if item.inclusion == INCLUSION_AND: total_query &= query @@ -59,7 +57,6 @@ class DocumentGroupManager(models.Manager): errors.append(e) value_query = Q() query = Q() - print 'total_query', total_query if total_query: try: document_qs = Document.objects.filter(total_query) diff --git a/settings.py b/settings.py index 3b2bf30d48..dc79404274 100644 --- a/settings.py +++ b/settings.py @@ -184,6 +184,10 @@ TEMPLATE_CONTEXT_PROCESSORS = ( # METADATA_AVAILABLE_MODELS = {} #---------- Indexing ----------------- #DOCUMENT_INDEXING_AVAILABLE_INDEXING_FUNCTIONS = {} +# Flesystem serving +#DOCUMENT_INDEXING_FILESYSTEM_FILESERVING_ENABLE = True +#DOCUMENT_INDEXING_FILESYSTEM_FILESERVING_PATH = u'/tmp/mayan/documents' +#DOCUMENT_INDEXING_FILESYSTEM_SLUGIFY_PATHS = False #---------- Documents ------------------ # Upload #DOCUMENTS_USE_STAGING_DIRECTORY = False @@ -215,11 +219,6 @@ TEMPLATE_CONTEXT_PROCESSORS = ( #------------- Groups -------------------- #GROUPING_SHOW_EMPTY_GROUPS = True -#------------ Filesystem serving -------------- -#FILESYSTEM_FILESERVING_ENABLE = True -#FILESYSTEM_FILESERVING_PATH = u'/tmp/mayan/documents' -#FILESYSTEM_SLUGIFY_PATHS = False -#FILESYSTEM_MAX_RENAME_COUNT = 200 #------------ Converter -------------- #CONVERTER_DEFAULT_OPTIONS = u'' #CONVERTER_LOW_QUALITY_OPTIONS = u''