Added index rebuilding views

This commit is contained in:
Roberto Rosario
2011-05-18 15:43:32 -04:00
parent 2a2fba9ac6
commit e8b8904469
8 changed files with 86 additions and 29 deletions

View File

@@ -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'))

View File

@@ -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:

View File

@@ -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'),
)

View File

@@ -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)

View File

@@ -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,

View File

@@ -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')

View File

@@ -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)

View File

@@ -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''