diff --git a/apps/documents/__init__.py b/apps/documents/__init__.py index 1e57cb99c6..8456c477e5 100644 --- a/apps/documents/__init__.py +++ b/apps/documents/__init__.py @@ -6,13 +6,12 @@ from django.core.urlresolvers import reverse from common.api import register_links, register_menu, \ register_model_list_columns, register_multi_item_links from common.utils import pretty_size - +from common.conf import settings as common_settings +from main.api import register_diagnostic from permissions.api import register_permissions from models import Document, DocumentPage, DocumentPageTransformation from staging import StagingFile - -from common.conf import settings as common_settings from conf.settings import ENABLE_SINGLE_DOCUMENT_UPLOAD PERMISSION_DOCUMENT_CREATE = 'document_create' @@ -59,6 +58,8 @@ document_page_transformation_go_back = {'text':_('return to document'), 'view':' document_page_go_back = {'text':_('return to document'), 'view':'document_view', 'args':'object.document.id', 'famfam':'page_go', 'permissions':{'namespace':'documents', 'permissions':[PERMISSION_DOCUMENT_VIEW]}} +document_missing_list = {'text':_('Find missing document files'), 'url':reverse('document_missing_list'), 'famfam':'folder_page', 'permissions':{'namespace':'documents', 'permissions':[PERMISSION_DOCUMENT_VIEW]}} + staging_file_preview = {'text':_('preview'), 'class':'fancybox-noscaling', 'view':'staging_file_preview', 'args':'object.id', 'famfam':'drive_magnify'} staging_file_delete = {'text':_('delete'), 'view':'staging_file_delete', 'args':'object.id', 'famfam':'drive_delete'} @@ -79,6 +80,7 @@ register_links(['document_page_view', 'document_page_transformation_edit', 'docu register_links(StagingFile, [staging_file_preview, staging_file_delete]) +register_diagnostic('documents', _(u'Documents'), document_missing_list) def document_exists(document): diff --git a/apps/documents/urls.py b/apps/documents/urls.py index 6bbf94370c..27a399a032 100644 --- a/apps/documents/urls.py +++ b/apps/documents/urls.py @@ -45,4 +45,6 @@ urlpatterns = patterns('documents.views', url(r'^document/page/(?P\d+)/transformation/create/$', 'document_page_transformation_create', (), 'document_page_transformation_create'), url(r'^document/page/transformation/(?P\d+)/edit/$', 'document_page_transformation_edit', (), 'document_page_transformation_edit'), url(r'^document/page/transformation/(?P\d+)/delete/$', 'document_page_transformation_delete', (), 'document_page_transformation_delete'), + + url(r'^document/missing/list/$', 'document_missing_list', (), 'document_missing_list'), ) diff --git a/apps/documents/views.py b/apps/documents/views.py index 4e8a81bd8a..8156a6eaed 100644 --- a/apps/documents/views.py +++ b/apps/documents/views.py @@ -38,6 +38,7 @@ from documents.conf.settings import DEFAULT_TRANSFORMATIONS from documents.conf.settings import AUTOMATIC_OCR from documents.conf.settings import UNCOMPRESS_COMPRESSED_LOCAL_FILES from documents.conf.settings import UNCOMPRESS_COMPRESSED_STAGING_FILES +from documents.conf.settings import STORAGE_BACKEND from documents import PERMISSION_DOCUMENT_CREATE, \ PERMISSION_DOCUMENT_CREATE, PERMISSION_DOCUMENT_PROPERTIES_EDIT, \ @@ -879,3 +880,17 @@ def document_view_simple(request, document_id): 'subtemplates_dict':subtemplates_dict, 'sidebar_subtemplates_dict':sidebar_groups, }, context_instance=RequestContext(request)) + + +def document_missing_list(request): + check_permissions(request.user, 'documents', [PERMISSION_DOCUMENT_VIEW]) + + missing_id_list = [] + for document in Document.objects.only('id',): + if not STORAGE_BACKEND().exists(document.file): + missing_id_list.append(document.pk) + + return render_to_response('generic_list.html', { + 'object_list':Document.objects.in_bulk(missing_id_list).values(), + 'title':_(u'missing documents'), + }, context_instance=RequestContext(request)) diff --git a/apps/main/__init__.py b/apps/main/__init__.py index 948a215893..81a2dc928e 100644 --- a/apps/main/__init__.py +++ b/apps/main/__init__.py @@ -11,12 +11,14 @@ from filesystem_serving import filesystem_serving_recreate_all_links from main.conf.settings import SIDE_BAR_SEARCH check_settings = {'text':_(u'settings'), 'view':'check_settings', 'famfam':'cog'} +statistics = {'text':_(u'statistics'), 'view':'statistics', 'famfam':'table'} +diagnostics = {'text':_(u'diagnostics'), 'view':'diagnostics', 'famfam':'pill'} main_menu = [ {'text':_(u'home'), 'view':'home', 'famfam':'house', 'position':0}, {'text':_(u'tools'), 'view':'tools_menu', 'links': [ document_find_all_duplicates, filesystem_serving_recreate_all_links, - {'text':_(u'statistics'), 'view':'statistics', 'famfam':'table'} + statistics, diagnostics, ],'famfam':'wrench', 'name':'tools','position':7}, {'text':_(u'setup'), 'view':'check_settings', 'links': [ diff --git a/apps/main/api.py b/apps/main/api.py new file mode 100644 index 0000000000..468619dbfb --- /dev/null +++ b/apps/main/api.py @@ -0,0 +1,7 @@ +diagnostics = {} + +def register_diagnostic(namespace, title, link): + namespace_dict = diagnostics.get(namespace, {'title':None, 'links':[]}) + namespace_dict['title'] = title + namespace_dict['links'].append(link) + diagnostics[namespace] = namespace_dict diff --git a/apps/main/templates/diagnostics.html b/apps/main/templates/diagnostics.html new file mode 100644 index 0000000000..ea93bf35d8 --- /dev/null +++ b/apps/main/templates/diagnostics.html @@ -0,0 +1,20 @@ +{% extends "base.html" %} + +{% block title %} :: {{ title|capfirst }}{% endblock %} + +{% block content %} + {% for key, value in blocks.items %} +
+

{{ value.title|capfirst }}

+
+

+

    + {% with value.links as object_navigation_links %} + {% include "generic_navigation.html" %} + {% endwith %} +
+

+ +
+ {% endfor %} +{% endblock %} diff --git a/apps/main/urls.py b/apps/main/urls.py index 024868180b..71a1a0b1b1 100644 --- a/apps/main/urls.py +++ b/apps/main/urls.py @@ -6,4 +6,5 @@ urlpatterns = patterns('main.views', url(r'^check_settings/$', 'check_settings', (), 'check_settings'), url(r'^tools_menu/$', 'blank_menu', (), 'tools_menu'), url(r'^statistics/$', 'statistics', (), 'statistics'), + url(r'^diagnostics/$', 'diagnostics_view', (), 'diagnostics'), ) diff --git a/apps/main/views.py b/apps/main/views.py index 7ff54079d5..60df537da8 100644 --- a/apps/main/views.py +++ b/apps/main/views.py @@ -15,6 +15,7 @@ from ocr.statistics import get_statistics as ocr_statistics from filesystem_serving.conf import settings as filesystem_serving_settings from dynamic_search.conf import settings as search_settings +from main.api import diagnostics def home(request): return render_to_response('home.html', {}, @@ -136,3 +137,8 @@ def statistics(request): context_instance=RequestContext(request)) +def diagnostics_view(request): + return render_to_response('diagnostics.html', { + 'blocks':diagnostics, + 'title':_(u'Diagnostics') }, + context_instance=RequestContext(request))