Added index rebuilding views
This commit is contained in:
@@ -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'))
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -3,4 +3,5 @@ from django.conf.urls.defaults import patterns, url
|
||||
urlpatterns = patterns('document_indexing.views',
|
||||
url(r'^(?P<index_id>\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'),
|
||||
)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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')
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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''
|
||||
|
||||
Reference in New Issue
Block a user