diff --git a/apps/document_indexing/__init__.py b/apps/document_indexing/__init__.py
index 0adb88c37a..7b1b921442 100644
--- a/apps/document_indexing/__init__.py
+++ b/apps/document_indexing/__init__.py
@@ -21,7 +21,11 @@ from .permissions import (PERMISSION_DOCUMENT_INDEXING_VIEW,
def is_root_node(context):
- return context['node'].parent==None
+ return context['node'].parent is None
+
+
+def is_not_instance_root_node(context):
+ return context['object'].parent is not None
index_setup = {'text': _(u'indexes'), 'view': 'index_setup_list', 'icon': 'tab.png', 'permissions': [PERMISSION_DOCUMENT_INDEXING_SETUP]}
@@ -36,10 +40,11 @@ template_node_edit = {'text': _(u'edit'), 'view': 'template_node_edit', 'args':
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}
+
+index_parent = {'text': _(u'go up one level'), 'view': 'index_instance_node_view', 'args': 'object.parent.pk', 'famfam': 'arrow_up', 'permissions': [PERMISSION_DOCUMENT_INDEXING_VIEW], 'dont_mark_active': True, 'condition': is_not_instance_root_node}
document_index_list = {'text': _(u'indexes'), 'view': 'document_index_list', 'args': 'object.pk', 'famfam': 'folder_page', 'permissions': [PERMISSION_DOCUMENT_INDEXING_VIEW, PERMISSION_DOCUMENT_VIEW]}
-register_top_menu('indexes', link={'text': _('indexes'), 'famfam': 'folder_page', 'view': 'index_instance_list'})
+register_top_menu('indexes', link={'text': _('indexes'), 'famfam': 'folder_page', 'view': 'index_list'})
rebuild_index_instances = {'text': _('rebuild indexes'), 'view': 'rebuild_index_instances', 'famfam': 'folder_page', 'permissions': [PERMISSION_DOCUMENT_INDEXING_REBUILD_INDEXES], 'description': _(u'Deletes and creates from scratch all the document indexes.')}
diff --git a/apps/document_indexing/api.py b/apps/document_indexing/api.py
index 6a6cfde3a4..d815e3cec6 100644
--- a/apps/document_indexing/api.py
+++ b/apps/document_indexing/api.py
@@ -41,9 +41,11 @@ def update_indexes(document):
eval_dict['document'] = document
eval_dict['metadata'] = MetadataObject(document_metadata_dict)
- for root in Index.objects.filter(parent=None):
- index_warnings = _evaluate_index(eval_dict, document, root)
- warnings.extend(index_warnings)
+ for index in Index.objects.all():
+ root_instance, created = IndexInstanceNode.objects.get_or_create(index_template_node=index.template_root, parent=None)
+ for template_node in index.template_root.get_children():
+ index_warnings = _evaluate_index(eval_dict, document, template_node, root_instance)
+ warnings.extend(index_warnings)
return warnings
@@ -54,14 +56,14 @@ def delete_indexes(document):
"""
warnings = []
- for index_instance in document.indexinstance_set.all():
+ for index_instance in document.indexinstancenode_set.all():
index_warnings = _remove_document_from_index_instance(document, index_instance)
warnings.extend(index_warnings)
return warnings
-def get_instance_link(index_instance=None, text=None, simple=False):
+def get_instance_link(index_instance_node=None, text=None, simple=False):
"""
Return an HTML anchor to an index instance
"""
@@ -72,15 +74,15 @@ def get_instance_link(index_instance=None, text=None, simple=False):
template = u'%(value)s'
else:
template = u'%(value)s'
- if index_instance:
+ if index_instance_node:
return template % {
- 'url': index_instance.get_absolute_url(),
- 'value': text if text else index_instance
+ 'url': index_instance_node.get_absolute_url(),
+ 'value': text if text else (index_instance_node if index_instance_node.parent else index_instance_node.index_template_node.index)
}
else:
# Root node
return template % {
- 'url': reverse('index_instance_list'),
+ 'url': '#',#reverse('index_instance_node_view', args=[index_instance_node.parent.pk]),
'value': ugettext(u'root')
}
@@ -95,7 +97,7 @@ def get_breadcrumbs(index_instance, simple=False, single_link=False, include_cou
# Return the entire breadcrumb path as a single HTML anchor
simple = True
- result.append(get_instance_link(simple=simple))
+ #result.append(get_instance_link(index_instance.get_root(), simple=simple))
for instance in index_instance.get_ancestors():
result.append(get_instance_link(instance, simple=simple))
@@ -109,7 +111,7 @@ def get_breadcrumbs(index_instance, simple=False, single_link=False, include_cou
if single_link:
# Return the entire breadcrumb path as a single HTML anchor
- output.insert(0, get_instance_link(index_instance=index_instance, text=(u' / '.join(result))))
+ output.insert(0, get_instance_link(index_instance_node=index_instance, text=(u' / '.join(result))))
return mark_safe(u' '.join(output))
else:
output.insert(0, u' / '.join(result))
@@ -118,8 +120,8 @@ def get_breadcrumbs(index_instance, simple=False, single_link=False, include_cou
def do_rebuild_all_indexes():
fs_delete_directory_recusive()
- IndexInstance.objects.all().delete()
- DocumentRenameCount.objects.all().delete()
+ IndexInstanceNone.objects.delete()
+ DocumentRenameCount.objects.delete()
for document in Document.objects.all():
update_indexes(document)
@@ -129,56 +131,61 @@ def do_rebuild_all_indexes():
# Internal functions
def find_lowest_available_suffix(index_instance, document):
# TODO: verify extension's role in query
- index_instance_documents = DocumentRenameCount.objects.filter(index_instance=index_instance)#.filter(document__file_extension=document.file_extension)
+ index_instance_documents = DocumentRenameCount.objects.filter(index_instance_node=index_instance)#.filter(document__file_extension=document.file_extension)
files_list = []
for index_instance_document in index_instance_documents:
- files_list.append(assemble_suffixed_filename(index_instance_document.document.file.name, index_instance_document.suffix))
+ files_list.append(assemble_suffixed_filename(index_instance_document.document.file_filename, index_instance_document.suffix))
for suffix in xrange(MAX_SUFFIX_COUNT):
- if assemble_suffixed_filename(document.file.name, suffix) not in files_list:
+ if assemble_suffixed_filename(document.file_filename, suffix) not in files_list:
return suffix
raise MaxSuffixCountReached(ugettext(u'Maximum suffix (%s) count reached.') % MAX_SUFFIX_COUNT)
-def _evaluate_index(eval_dict, document, node, parent_index_instance=None):
+def _evaluate_index(eval_dict, document, template_node, parent_index_instance=None):
"""
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:
+ if template_node.enabled:
try:
- result = eval(node.expression, eval_dict, AVAILABLE_INDEXING_FUNCTIONS)
+ result = eval(template_node.expression, eval_dict, AVAILABLE_INDEXING_FUNCTIONS)
if result:
- index_instance, created = IndexInstance.objects.get_or_create(index=node, value=result, parent=parent_index_instance)
+ index_instance, created = IndexInstanceNode.objects.get_or_create(index_template_node=template_node)
+ index_instance.value = result
+ index_instance.parent = parent_index_instance
+ index_instance.save()
#if created:
- fs_create_index_directory(index_instance)
- if node.link_documents:
+ #fs_create_index_directory(index_instance)
+ if template_node.link_documents:
suffix = find_lowest_available_suffix(index_instance, document)
document_count = DocumentRenameCount(
- index_instance=index_instance,
+ index_instance_node=index_instance,
document=document,
suffix=suffix
)
document_count.save()
- fs_create_document_link(index_instance, document, suffix)
+ #fs_create_document_link(index_instance, document, suffix)
index_instance.documents.add(document)
- for children in node.get_children():
+ for child in template_node.get_children():
children_warnings = _evaluate_index(
- eval_dict, document, children, index_instance
+ eval_dict, document, child, index_instance
)
warnings.extend(children_warnings)
except (NameError, AttributeError), exc:
+ raise
warnings.append(_(u'Error in document indexing update expression: %(expression)s; %(exception)s') % {
- 'expression': node.expression, 'exception': exc})
+ 'expression': template_node.expression, 'exception': exc})
except Exception, exc:
+ raise
warnings.append(_(u'Error updating document index, expression: %(expression)s; %(exception)s') % {
- 'expression': node.expression, 'exception': exc})
+ 'expression': template_node.expression, 'exception': exc})
return warnings
@@ -191,15 +198,15 @@ def _remove_document_from_index_instance(document, index_instance):
"""
warnings = []
try:
- document_rename_count = DocumentRenameCount.objects.get(index_instance=index_instance, document=document)
- fs_delete_document_link(index_instance, document, document_rename_count.suffix)
+ document_rename_count = DocumentRenameCount.objects.get(index_instance_node=index_instance, document=document)
+ #fs_delete_document_link(index_instance, document, document_rename_count.suffix)
document_rename_count.delete()
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
- fs_delete_index_directory(index_instance)
+ #fs_delete_index_directory(index_instance)
index_instance.delete()
parent_warnings = _remove_document_from_index_instance(
document, parent
@@ -208,6 +215,7 @@ def _remove_document_from_index_instance(document, index_instance):
except DocumentRenameCount.DoesNotExist:
return warnings
except Exception, exc:
+ raise
warnings.append(_(u'Unable to delete document indexing node; %s') % exc)
return warnings
diff --git a/apps/document_indexing/models.py b/apps/document_indexing/models.py
index 274d2b06f3..6a11585aca 100644
--- a/apps/document_indexing/models.py
+++ b/apps/document_indexing/models.py
@@ -18,9 +18,22 @@ class Index(models.Model):
title = models.CharField(unique=True, max_length=128, verbose_name=_(u'title'))
enabled = models.BooleanField(default=True, verbose_name=_(u'enabled'))
+ @property
+ def template_root(self):
+ # Catch error
+ return self.indextemplatenode_set.get(parent=None)
+
+ @property
+ def instance_root(self):
+ return self.template_root.indexinstancenode_set.get()
+
def __unicode__(self):
return self.title
+ @models.permalink
+ def get_absolute_url(self):
+ return ('index_instance_node_view', [self.instance_root.pk])
+
class Meta:
verbose_name = _(u'index')
verbose_name_plural = _(u'indexes')
@@ -60,7 +73,7 @@ class IndexInstanceNode(MPTTModel):
@models.permalink
def get_absolute_url(self):
- return ('index_instance_list', [self.pk])
+ return ('index_instance_node_view', [self.pk])
#def get_document_list_display(self):
# return u', '.join([d.file_filename for d in self.documents.all()])
diff --git a/apps/document_indexing/os_specifics.py b/apps/document_indexing/os_specifics.py
index d57eae409c..d7cbe3e68d 100644
--- a/apps/document_indexing/os_specifics.py
+++ b/apps/document_indexing/os_specifics.py
@@ -12,7 +12,7 @@ def assemble_suffixed_filename(filename, suffix=0):
"""
if suffix:
- name, extension = filename.split(os.split(os.extsep))
+ name, extension = os.path.splitext(filename)
return SUFFIX_SEPARATOR.join([name, unicode(suffix), os.extsep, extension])
else:
return filename
diff --git a/apps/document_indexing/urls.py b/apps/document_indexing/urls.py
index 74e7b11aae..ecb7ffbeda 100644
--- a/apps/document_indexing/urls.py
+++ b/apps/document_indexing/urls.py
@@ -11,12 +11,9 @@ urlpatterns = patterns('document_indexing.views',
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'^index/list/$', 'index_list', (), 'index_list'),
+ url(r'^instance/node/(?P\d+)/$', 'index_instance_node_view', (), 'index_instance_node_view'),
+
url(r'^rebuild/all/$', 'rebuild_index_instances', (), 'rebuild_index_instances'),
-
url(r'^list/for/document/(?P\d+)/$', 'document_index_list', (), 'document_index_list'),
)
diff --git a/apps/document_indexing/views.py b/apps/document_indexing/views.py
index 758e2ad945..4fdb020425 100644
--- a/apps/document_indexing/views.py
+++ b/apps/document_indexing/views.py
@@ -10,12 +10,14 @@ from django.contrib import messages
#from django.utils.safestring import mark_safe
from django.core.urlresolvers import reverse
from django.utils.html import conditional_escape, mark_safe
+from django.core.exceptions import PermissionDenied
from permissions.models import Permission
from documents.permissions import PERMISSION_DOCUMENT_VIEW
from documents.models import Document
from documents.views import document_list
from common.utils import encapsulate
+from acls.utils import apply_default_acls
from .forms import IndexForm, IndexTemplateNodeForm
from .models import (Index, IndexTemplateNode, IndexInstanceNode)
@@ -64,7 +66,7 @@ def index_setup_create(request):
form = IndexForm(request.POST)
if form.is_valid():
index = form.save()
- #apply_default_acls(folder, request.user)
+ apply_default_acls(index, request.user)
messages.success(request, _(u'Index created successfully.'))
return HttpResponseRedirect(reverse('index_setup_list'))
else:
@@ -170,32 +172,6 @@ def index_setup_view(request, index_pk):
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)
@@ -301,30 +277,56 @@ def template_node_delete(request, node_pk):
# 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(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 = IndexInstanceNode.objects.filter(parent=None)
- breadcrumbs = get_instance_link()
- index_instance = None
+#from . import index_roots as index_roots_link
+
+def index_list(request):
+ context = {
+ 'title': _(u'indexes'),
+ #'hide_object': True,
+ #'list_object_variable_name': 'index',
+ 'extra_columns': [
+ {'name': _(u'root'), 'attribute': 'root'},
+ # {'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_VIEW])
+ except PermissionDenied:
+ queryset = AccessEntry.objects.filter_objects_by_access(PERMISSION_DOCUMENT_INDEXING_VIEW, request.user, queryset)
+
+ context['object_list'] = queryset
+
+ return render_to_response('generic_list.html',
+ context,
+ context_instance=RequestContext(request)
+ )
+
+
+def index_instance_node_view(request, index_instance_node_pk):
+ index_instance = get_object_or_404(IndexInstanceNode, pk=index_instance_node_pk)
+ index_instance_list = [index for index in index_instance.get_children().order_by('value')]
+ breadcrumbs = get_breadcrumbs(index_instance)
+
+ try:
+ Permission.objects.check_permissions(request.user, [PERMISSION_DOCUMENT_INDEXING_VIEW])
+ except PermissionDenied:
+ AccessEntry.objects.check_access(PERMISSION_DOCUMENT_INDEXING_VIEW, request.user, index_instance.index)
title = mark_safe(_(u'contents for index: %s') % breadcrumbs)
if index_instance:
- if index_instance.index.link_documents:
+ if index_instance.index_template_node.link_documents:
# Document list, use the document_list view for consistency
return document_list(
request,
title=title,
- object_list=index_instance_list,
+ object_list=index_instance.documents.all(),
extra_context={
'object': index_instance
}
@@ -334,12 +336,12 @@ def index_instance_list(request, index_id=None):
'object_list': index_instance_list,
'extra_columns_preffixed': [
{
- 'name': _(u'index'),
+ 'name': _(u'node'),
'attribute': encapsulate(lambda x: index_instance_item_link(x))
},
{
'name': _(u'items'),
- 'attribute': encapsulate(lambda x: x.documents.count() if x.index.link_documents else x.get_children().count())
+ 'attribute': encapsulate(lambda x: x.documents.count() if x.index_template_node.link_documents else x.get_children().count())
}
],
'title': title,
@@ -378,12 +380,13 @@ def rebuild_index_instances(request):
def document_index_list(request, document_id):
+ #TODO: add ACL check
Permission.objects.check_permissions(request.user, [PERMISSION_DOCUMENT_VIEW, PERMISSION_DOCUMENT_INDEXING_VIEW])
document = get_object_or_404(Document, pk=document_id)
object_list = []
- for index_instance in document.indexinstance_set.all():
+ for index_instance in document.indexinstancenode_set.all():
object_list.append(get_breadcrumbs(index_instance, single_link=True, include_count=True))
return render_to_response('generic_list.html', {
diff --git a/apps/document_indexing/widgets.py b/apps/document_indexing/widgets.py
index 6e01a407ed..fd4629564a 100644
--- a/apps/document_indexing/widgets.py
+++ b/apps/document_indexing/widgets.py
@@ -10,7 +10,7 @@ FOLDER_ICON = u'folder'
def index_instance_item_link(index_instance_item):
if isinstance(index_instance_item, IndexInstanceNode):
- if index_instance_item.index.link_documents:
+ if index_instance_item.index_template_node.link_documents:
icon = FOLDER_W_DOCUMENTS
else:
icon = FOLDER_ICON