diff --git a/mayan/apps/main/static/main/icons/to_do_list.png b/mayan/apps/main/static/main/icons/to_do_list.png new file mode 100644 index 0000000000..0b4ab11c03 Binary files /dev/null and b/mayan/apps/main/static/main/icons/to_do_list.png differ diff --git a/mayan/apps/metadata/__init__.py b/mayan/apps/metadata/__init__.py index 2a8845d3c8..97f1aebc90 100644 --- a/mayan/apps/metadata/__init__.py +++ b/mayan/apps/metadata/__init__.py @@ -14,6 +14,7 @@ from documents.signals import post_document_type_change from navigation.api import register_links, register_model_list_columns from navigation.links import link_spacer from project_setup.api import register_setup +from project_tools.api import register_tool from rest_api.classes import APIEndPoint from .api import get_metadata_string @@ -24,7 +25,8 @@ from .links import (metadata_add, metadata_edit, metadata_multiple_add, setup_document_type_metadata, setup_document_type_metadata_required, setup_metadata_type_create, setup_metadata_type_delete, - setup_metadata_type_edit, setup_metadata_type_list) + setup_metadata_type_edit, setup_metadata_type_list, + link_documents_missing_required_metadata) from .models import DocumentMetadata, DocumentTypeMetadataType, MetadataType from .permissions import (PERMISSION_METADATA_DOCUMENT_ADD, PERMISSION_METADATA_DOCUMENT_EDIT, @@ -72,6 +74,7 @@ register_links(MetadataType, [setup_metadata_type_edit, setup_metadata_type_dele register_links([MetadataType, 'metadata:setup_metadata_type_list', 'metadata:setup_metadata_type_create'], [setup_metadata_type_list, setup_metadata_type_create], menu_name='secondary_menu') register_setup(setup_metadata_type_list) +register_tool(link_documents_missing_required_metadata) class_permissions(Document, [ PERMISSION_METADATA_DOCUMENT_ADD, PERMISSION_METADATA_DOCUMENT_EDIT, diff --git a/mayan/apps/metadata/links.py b/mayan/apps/metadata/links.py index c1e8e27891..eb269380f0 100644 --- a/mayan/apps/metadata/links.py +++ b/mayan/apps/metadata/links.py @@ -29,3 +29,5 @@ setup_metadata_type_list = {'text': _(u'Metadata types'), 'view': 'metadata:setu setup_metadata_type_edit = {'text': _(u'Edit'), 'view': 'metadata:setup_metadata_type_edit', 'args': 'object.pk', 'famfam': 'xhtml', 'permissions': [PERMISSION_METADATA_TYPE_EDIT]} setup_metadata_type_delete = {'text': _(u'Delete'), 'view': 'metadata:setup_metadata_type_delete', 'args': 'object.pk', 'famfam': 'xhtml_delete', 'permissions': [PERMISSION_METADATA_TYPE_DELETE]} setup_metadata_type_create = {'text': _(u'Create new'), 'view': 'metadata:setup_metadata_type_create', 'famfam': 'xhtml_add', 'permissions': [PERMISSION_METADATA_TYPE_CREATE]} + +link_documents_missing_required_metadata = {'text': _(u'Missing metadata'), 'view': 'metadata:documents_missing_required_metadata', 'icon': 'to_do_list.png'} diff --git a/mayan/apps/metadata/urls.py b/mayan/apps/metadata/urls.py index accf23142f..95128dd731 100644 --- a/mayan/apps/metadata/urls.py +++ b/mayan/apps/metadata/urls.py @@ -22,6 +22,8 @@ urlpatterns = patterns('metadata.views', url(r'^setup/document/type/(?P\d+)/metadata/edit/$', 'setup_document_type_metadata', (), 'setup_document_type_metadata'), url(r'^setup/document/type/(?P\d+)/metadata/edit/required/$', 'setup_document_type_metadata_required', (), 'setup_document_type_metadata_required'), + + url(r'^tools/missing_required_metadata/$', 'documents_missing_required_metadata', (), 'documents_missing_required_metadata'), ) api_urls = patterns('', diff --git a/mayan/apps/metadata/views.py b/mayan/apps/metadata/views.py index 884b7f80c3..c0a1d7a855 100644 --- a/mayan/apps/metadata/views.py +++ b/mayan/apps/metadata/views.py @@ -12,7 +12,9 @@ from django.utils.translation import ugettext_lazy as _ from acls.models import AccessEntry from documents.models import Document, DocumentType -from documents.permissions import PERMISSION_DOCUMENT_TYPE_EDIT +from documents.permissions import (PERMISSION_DOCUMENT_TYPE_EDIT, + PERMISSION_DOCUMENT_VIEW) +from documents.views import document_list from permissions.models import Permission from common.utils import encapsulate, generate_choices_w_labels @@ -302,6 +304,33 @@ def metadata_view(request, document_id): }, context_instance=RequestContext(request)) +def documents_missing_required_metadata(request): + pre_object_list = Document.objects.filter(document_type__metadata__required=True, metadata__value__isnull=True) + + try: + Permission.objects.check_permissions(request.user, [PERMISSION_DOCUMENT_VIEW]) + except PermissionDenied: + # If user doesn't have global permission, get a list of document + # for which he/she does hace access use it to filter the + # provided object_list + object_list = AccessEntry.objects.filter_objects_by_access( + PERMISSION_DOCUMENT_VIEW, request.user, pre_object_list) + else: + object_list = pre_object_list + + context = { + 'object_list': object_list, + 'title': _('Documents missing required metadata'), + 'hide_links': True, + } + + return document_list( + request, + #object_list= + extra_context=context + ) + + # Setup views def setup_metadata_type_list(request): Permission.objects.check_permissions(request.user, [PERMISSION_METADATA_TYPE_VIEW])