diff --git a/apps/common/templates/generic_list.html b/apps/common/templates/generic_list.html index f0a72cfb02..064a9752ed 100644 --- a/apps/common/templates/generic_list.html +++ b/apps/common/templates/generic_list.html @@ -1,7 +1,7 @@ {% extends "base.html" %} {% load i18n %} {% load navigation_tags %} -{% block title %} :: {% blocktrans %}List of {{ title }}{% endblocktrans %}{% endblock %} +{% block title %} :: {% blocktrans with title|striptags as stripped_title %}List of {{ stripped_title }}{% endblocktrans %}{% endblock %} {#{% block secondary_links %}{{ secondary_links|safe }}{% endblock %}#} {% block sidebar %} diff --git a/apps/common/templates/generic_list_subtemplate.html b/apps/common/templates/generic_list_subtemplate.html index d87b6d0067..b92eb13b04 100644 --- a/apps/common/templates/generic_list_subtemplate.html +++ b/apps/common/templates/generic_list_subtemplate.html @@ -85,7 +85,7 @@ {% endif %} {% empty %} - {% blocktrans %}There are no {{ title }}{% endblocktrans %} + {% blocktrans with title|striptags as stripped_title %}There are no {{ stripped_title }}{% endblocktrans %} {% endfor %} diff --git a/apps/document_indexing/admin.py b/apps/document_indexing/admin.py index e0c71d04d9..0d4dadd840 100644 --- a/apps/document_indexing/admin.py +++ b/apps/document_indexing/admin.py @@ -13,7 +13,7 @@ class IndexInstanceInline(admin.StackedInline): class IndexAdmin(MPTTModelAdmin): - list_display = ('expression', 'enabled', 'link_document') + list_display = ('expression', 'enabled', 'link_documents') class IndexInstanceAdmin(MPTTModelAdmin): diff --git a/apps/document_indexing/api.py b/apps/document_indexing/api.py index 1cde0f6c4d..ee7119231f 100644 --- a/apps/document_indexing/api.py +++ b/apps/document_indexing/api.py @@ -1,4 +1,7 @@ from django.utils.translation import ugettext_lazy as _ +from django.utils.translation import ugettext +from django.core.urlresolvers import reverse +from django.utils.safestring import mark_safe from metadata.classes import MetadataObject @@ -14,7 +17,7 @@ def evaluate_index(eval_dict, document, node, parent_index_instance=None): try: result = eval(node.expression, eval_dict, AVAILABLE_INDEXING_FUNCTIONS) index_instance, created = IndexInstance.objects.get_or_create(index=node, value=result, parent=parent_index_instance) - if node.link_document: + if node.link_documents: index_instance.documents.add(document) for children in node.get_children(): @@ -42,7 +45,6 @@ def update_indexes(document): eval_dict['metadata'] = MetadataObject(metadata_dict) for root in Index.objects.filter(parent=None): - #for node in root.get_children(): index_warnings = evaluate_index(eval_dict, document, root) warnings.extend(index_warnings) @@ -51,3 +53,40 @@ def update_indexes(document): def delete_indexes(document): print 'delete_indexes' + + +def get_instance_link(index_instance=None, text=None, simple=False): + if simple: + # Just display the instance's value or overrided text, no + # HTML anchor + template = u'%(value)s' + else: + template = u'%(value)s' + if index_instance: + return template % { + 'url': index_instance.get_absolute_url(), 'value': text if text else index_instance + } + else: + # Root node + return template % { + 'url': reverse('index_instance_list'), 'value': ugettext(u'root') + } + + +def get_breadcrumbs(index_instance, simple=False, single_link=False): + result = [] + if single_link: + # Return the entire breadcrumb as a single HTML anchor + simple = True + + result.append(get_instance_link(simple=simple)) + + for instance in index_instance.get_ancestors(): + result.append(get_instance_link(instance, simple=simple)) + + result.append(get_instance_link(index_instance, simple=simple)) + + if single_link: + return mark_safe(get_instance_link(index_instance=index_instance, text=(u' / '.join(result)))) + else: + return mark_safe(u' / '.join(result)) diff --git a/apps/document_indexing/models.py b/apps/document_indexing/models.py index 53a51fc527..527dc24459 100644 --- a/apps/document_indexing/models.py +++ b/apps/document_indexing/models.py @@ -1,7 +1,8 @@ from django.db import models from django.utils.translation import ugettext_lazy as _ -from mptt.models import MPTTModel, TreeForeignKey +from mptt.models import MPTTModel +from mptt.fields import TreeForeignKey from documents.models import Document @@ -15,10 +16,10 @@ class Index(MPTTModel): expression = models.CharField(max_length=128, verbose_name=_(u'indexing expression'), help_text=_(u'Enter a python string expression to be evaluated.')) # % available_indexing_functions_string) enabled = models.BooleanField(default=True, verbose_name=_(u'enabled')) - link_document = models.BooleanField(default=False, verbose_name=_(u'link document')) + link_documents = models.BooleanField(default=False, verbose_name=_(u'link documents')) def __unicode__(self): - return self.expression if not self.link_document else u'%s/[document]' % self.expression + return self.expression if not self.link_documents else u'%s/[document]' % self.expression class Meta: verbose_name = _(u'index') @@ -34,9 +35,12 @@ class IndexInstance(MPTTModel): def __unicode__(self): return self.value + @models.permalink + def get_absolute_url(self): + return ('index_instance_list', [self.pk]) + def get_document_list_display(self): return u', '.join([d.file_filename for d in self.documents.all()]) - class Meta: verbose_name = _(u'index instance') diff --git a/apps/document_indexing/urls.py b/apps/document_indexing/urls.py new file mode 100644 index 0000000000..849a777c39 --- /dev/null +++ b/apps/document_indexing/urls.py @@ -0,0 +1,6 @@ +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'), +) diff --git a/apps/document_indexing/utils.py b/apps/document_indexing/utils.py new file mode 100644 index 0000000000..5966a5ef69 --- /dev/null +++ b/apps/document_indexing/utils.py @@ -0,0 +1,23 @@ +from django.utils.translation import ugettext_lazy as _ + +from document_indexing.api import get_breadcrumbs + + +def get_document_indexing_subtemplate(document): + """ + Return all the settings to render a subtemplate containing a + list of index instances where a document may be found + """ + object_list = [] + + for index_instance in document.indexinstance_set.all(): + object_list.append(get_breadcrumbs(index_instance, single_link=True)) + + return { + 'name': 'generic_list_subtemplate.html', + 'context': { + 'title': _(u'index links'), + 'object_list': object_list, + 'hide_link': True + } + } diff --git a/apps/document_indexing/views.py b/apps/document_indexing/views.py index 60f00ef0ef..0ca1130b0d 100644 --- a/apps/document_indexing/views.py +++ b/apps/document_indexing/views.py @@ -1 +1,37 @@ -# Create your views here. +from django.utils.translation import ugettext_lazy as _ +from django.utils.translation import ugettext +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.core.urlresolvers import reverse +from django.conf import settings +from django.utils.safestring import mark_safe + +from document_indexing.models import IndexInstance +from document_indexing.api import get_breadcrumbs, get_instance_link + + +def index_instance_list(request, index_id=None): + #TODO: check_permissions + #check_permissions(request.user, 'documents', [PERMISSION_DOCUMENT_VIEW]) + + if index_id: + index_instance = get_object_or_404(IndexInstance, pk=index_id) + index_instance_list = [index for index in index_instance.get_children()] + breadcrumbs = get_breadcrumbs(index_instance) + if index_instance.documents.count(): + for document in index_instance.documents.all(): + index_instance_list.append(document) + else: + index_instance_list = IndexInstance.objects.filter(parent=None) + breadcrumbs = get_instance_link() + + title = mark_safe(_(u'contents for index: %s') % breadcrumbs) + + return render_to_response('generic_list.html', { + 'object_list': index_instance_list, + 'title': title, + 'hide_links': True, + }, context_instance=RequestContext(request)) + diff --git a/apps/documents/views.py b/apps/documents/views.py index 979273fb60..12270de4e7 100644 --- a/apps/documents/views.py +++ b/apps/documents/views.py @@ -26,7 +26,6 @@ from converter.api import DEFAULT_ZOOM_LEVEL, DEFAULT_ROTATION, \ DEFAULT_FILE_FORMAT, QUALITY_PRINT from document_comments.utils import get_comments_subtemplate from filesystem_serving.api import document_create_fs_links, document_delete_fs_links -from filesystem_serving.conf.settings import FILESERVING_ENABLE from filetransfers.api import serve_file from grouping.models import DocumentGroup from grouping import document_group_link @@ -37,6 +36,7 @@ from metadata.forms import MetadataFormSet from navigation.utils import resolve_to_name from permissions.api import check_permissions from tags.utils import get_tags_subtemplate +from document_indexing.utils import get_document_indexing_subtemplate from documents.conf.settings import DELETE_STAGING_FILE_AFTER_UPLOAD from documents.conf.settings import USE_STAGING_DIRECTORY @@ -396,15 +396,8 @@ def document_view_advanced(request, document_id): if document_group_subtemplate: subtemplates_list.append(document_group_subtemplate) - if FILESERVING_ENABLE: - subtemplates_list.append({ - 'name': 'generic_list_subtemplate.html', - 'context': { - 'title': _(u'index links'), - 'object_list': document.documentmetadataindex_set.all(), - 'hide_link': True - } - }) + if document.indexinstance_set.count(): + subtemplates_list.append(get_document_indexing_subtemplate(document)) return render_to_response('generic_detail.html', { 'object': document, diff --git a/settings.py b/settings.py index 8cd9bbf6c4..f9673a0c47 100644 --- a/settings.py +++ b/settings.py @@ -147,8 +147,8 @@ INSTALLED_APPS = ( 'user_management', 'documents', 'grouping', - 'document_indexing', 'mptt', + 'document_indexing', ) TEMPLATE_CONTEXT_PROCESSORS = ( diff --git a/urls.py b/urls.py index fee8c9620d..b0a03cc5e9 100644 --- a/urls.py +++ b/urls.py @@ -23,6 +23,7 @@ urlpatterns = patterns('', (r'^settings/', include('smart_settings.urls')), (r'^metadata/', include('metadata.urls')), (r'^grouping/', include('grouping.urls')), + (r'^document_indexing/', include('document_indexing.urls')), )