diff --git a/mayan/apps/document_indexing/apps.py b/mayan/apps/document_indexing/apps.py index 01a43be4e5..962eae2cc2 100644 --- a/mayan/apps/document_indexing/apps.py +++ b/mayan/apps/document_indexing/apps.py @@ -11,11 +11,12 @@ from metadata.models import DocumentMetadata from rest_api.classes import APIEndPoint from .links import ( - document_index_list, link_index_main_menu, index_parent, - link_index_setup, index_setup_create, index_setup_document_types, - index_setup_delete, index_setup_edit, index_setup_list, index_setup_view, - link_rebuild_index_instances, template_node_create, template_node_delete, - template_node_edit + link_document_index_list, link_index_main_menu, link_index_parent, + link_index_setup, link_index_setup_create, link_index_setup_document_types, + link_index_setup_delete, link_index_setup_edit, link_index_setup_list, + link_index_setup_view, link_rebuild_index_instances, + link_template_node_create, link_template_node_delete, + link_template_node_edit ) from .models import Index, IndexTemplateNode, IndexInstanceNode from .tasks import task_delete_empty_index_nodes, task_index_document @@ -38,11 +39,7 @@ class DocumentIndexingApp(apps.AppConfig): verbose_name = _('Document indexing') def ready(self): - post_delete.connect(document_index_delete, dispatch_uid='document_index_delete', sender=Document) - post_save.connect(document_metadata_index_update, dispatch_uid='document_metadata_index_update', sender=DocumentMetadata) - post_delete.connect(document_metadata_index_post_delete, dispatch_uid='document_metadata_index_post_delete', sender=DocumentMetadata) - - register_maintenance_links([link_rebuild_index_instances], namespace='document_indexing', title=_('Indexes')) + APIEndPoint('indexes', app_name='document_indexing') # TODO: convert #register_links(Document, [document_index_list], menu_name='form_header') @@ -55,4 +52,8 @@ class DocumentIndexingApp(apps.AppConfig): menu_main.bind_links(links=[link_index_main_menu]) - APIEndPoint('indexes', app_name='document_indexing') + post_delete.connect(document_index_delete, dispatch_uid='document_index_delete', sender=Document) + post_save.connect(document_metadata_index_update, dispatch_uid='document_metadata_index_update', sender=DocumentMetadata) + post_delete.connect(document_metadata_index_post_delete, dispatch_uid='document_metadata_index_post_delete', sender=DocumentMetadata) + + register_maintenance_links([link_rebuild_index_instances], namespace='document_indexing', title=_('Indexes')) diff --git a/mayan/apps/document_indexing/links.py b/mayan/apps/document_indexing/links.py index c009902b94..bd4d31ca97 100644 --- a/mayan/apps/document_indexing/links.py +++ b/mayan/apps/document_indexing/links.py @@ -21,28 +21,22 @@ def is_not_root_node(context): return not context['node'].is_root_node() +link_document_index_list = Link(permissions=[PERMISSION_DOCUMENT_INDEXING_VIEW, PERMISSION_DOCUMENT_VIEW], text=_('Indexes'), view='indexing:document_index_list', args='object.pk') +link_index_list = Link(permissions=[PERMISSION_DOCUMENT_INDEXING_VIEW], text=_('Index list'), view='indexing:index_list') link_index_main_menu = Link(icon='fa fa-sitemap', text=_('Indexes'), view='indexing:index_list') - +link_index_parent = Link(condition=is_not_instance_root_node, dont_mark_active=True, permissions=[PERMISSION_DOCUMENT_INDEXING_VIEW], text=_('Go up one level'), view='indexing:index_instance_node_view', args='object.parent.pk') link_index_setup = Link(icon='fa fa-sitemap', permissions=[PERMISSION_DOCUMENT_INDEXING_SETUP], text=_('Indexes'), view='indexing:index_setup_list') -index_setup_list = {'text': _('Indexes'), 'view': 'indexing:index_setup_list', 'famfam': 'tab', 'permissions': [PERMISSION_DOCUMENT_INDEXING_SETUP]} -index_setup_create = {'text': _('Create index'), 'view': 'indexing:index_setup_create', 'famfam': 'tab_add', 'permissions': [PERMISSION_DOCUMENT_INDEXING_CREATE]} -index_setup_edit = {'text': _('Edit'), 'view': 'indexing:index_setup_edit', 'args': 'index.pk', 'famfam': 'tab_edit', 'permissions': [PERMISSION_DOCUMENT_INDEXING_EDIT]} -index_setup_delete = {'text': _('Delete'), 'view': 'indexing:index_setup_delete', 'args': 'index.pk', 'famfam': 'tab_delete', 'permissions': [PERMISSION_DOCUMENT_INDEXING_DELETE]} -index_setup_view = {'text': _('Tree template'), 'view': 'indexing:index_setup_view', 'args': 'index.pk', 'famfam': 'textfield', 'permissions': [PERMISSION_DOCUMENT_INDEXING_SETUP]} -index_setup_document_types = {'text': _('Document types'), 'view': 'indexing:index_setup_document_types', 'args': 'index.pk', 'famfam': 'layout', 'permissions': [PERMISSION_DOCUMENT_INDEXING_EDIT]} - -template_node_create = {'text': _('New child node'), 'view': 'indexing:template_node_create', 'args': 'node.pk', 'famfam': 'textfield_add', 'permissions': [PERMISSION_DOCUMENT_INDEXING_SETUP]} -template_node_edit = {'text': _('Edit'), 'view': 'indexing:template_node_edit', 'args': 'node.pk', 'famfam': 'textfield', 'permissions': [PERMISSION_DOCUMENT_INDEXING_SETUP], 'condition': is_not_root_node} -template_node_delete = {'text': _('Delete'), 'view': 'indexing:template_node_delete', 'args': 'node.pk', 'famfam': 'textfield_delete', 'permissions': [PERMISSION_DOCUMENT_INDEXING_SETUP], 'condition': is_not_root_node} - -index_list = {'text': _('Index list'), 'view': 'indexing:index_list', 'famfam': 'tab', 'permissions': [PERMISSION_DOCUMENT_INDEXING_VIEW]} - -index_parent = {'text': _('Go up one level'), 'view': 'indexing: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': _('Indexes'), 'view': 'indexing:document_index_list', 'args': 'object.pk', 'famfam': 'folder_page', 'permissions': [PERMISSION_DOCUMENT_INDEXING_VIEW, PERMISSION_DOCUMENT_VIEW]} - -# Maintenance +link_index_setup_list = Link(permissions=[PERMISSION_DOCUMENT_INDEXING_SETUP], text=_('Indexes'), view='indexing:index_setup_list') +link_index_setup_create = Link(permissions=[PERMISSION_DOCUMENT_INDEXING_CREATE], text=_('Create index'), view='indexing:index_setup_create') +link_index_setup_edit = Link(permissions=[PERMISSION_DOCUMENT_INDEXING_EDIT], text=_('Edit'), view='indexing:index_setup_edit', args='index.pk') +link_index_setup_delete = Link(permissions=[PERMISSION_DOCUMENT_INDEXING_DELETE], text=_('Delete'), view='indexing:index_setup_delete', args='index.pk') +link_index_setup_view = Link(permissions=[PERMISSION_DOCUMENT_INDEXING_SETUP], text=_('Tree template'), view='indexing:index_setup_view', args='index.pk') +link_index_setup_document_types = Link(permissions=[PERMISSION_DOCUMENT_INDEXING_EDIT], text=_('Document types'), view='indexing:index_setup_document_types', args='index.pk') link_rebuild_index_instances = Link( - permissions=[PERMISSION_DOCUMENT_INDEXING_REBUILD_INDEXES], description=_('Deletes and creates from scratch all the document indexes.'), + permissions=[PERMISSION_DOCUMENT_INDEXING_REBUILD_INDEXES], text=_('Rebuild indexes'), view='indexing:rebuild_index_instances' ) +link_template_node_create = Link(permissions=[PERMISSION_DOCUMENT_INDEXING_SETUP], text=_('New child node'), view='indexing:template_node_create', args='node.pk') +link_template_node_edit = Link(condition=is_not_root_node, permissions=[PERMISSION_DOCUMENT_INDEXING_SETUP], text=_('Edit'), view='indexing:template_node_edit', args='node.pk') +link_template_node_delete = Link(condition=is_not_root_node, permissions=[PERMISSION_DOCUMENT_INDEXING_SETUP], text=_('Delete'), view='indexing:template_node_delete', args='node.pk') diff --git a/mayan/apps/document_signatures/apps.py b/mayan/apps/document_signatures/apps.py index b691d68420..946838bead 100644 --- a/mayan/apps/document_signatures/apps.py +++ b/mayan/apps/document_signatures/apps.py @@ -11,13 +11,14 @@ from django import apps from django.utils.translation import ugettext_lazy as _ from acls.api import class_permissions +from common import menu_facet, menu_sidebar from django_gpg.exceptions import GPGDecryptionError from django_gpg.runtime import gpg from documents.models import Document, DocumentVersion from .links import ( - document_signature_delete, document_signature_download, - document_signature_upload, document_verify + link_document_signature_delete, link_document_signature_download, + link_document_signature_upload, link_document_verify ) from .models import DocumentVersionSignature from .permissions import ( @@ -57,12 +58,8 @@ class DocumentSignaturesApp(apps.AppConfig): verbose_name = _('Document signatures') def ready(self): - # TODO: convert - #register_links(Document, [document_verify], menu_name='form_header') - #register_links(['signatures:document_verify', 'signatures:document_signature_upload', 'signatures:document_signature_download', 'signatures:document_signature_delete'], [document_signature_upload, document_signature_download, document_signature_delete], menu_name='sidebar') - - DocumentVersion.register_pre_open_hook(1, document_pre_open_hook) DocumentVersion.register_post_save_hook(1, document_post_save_hook) + DocumentVersion.register_pre_open_hook(1, document_pre_open_hook) class_permissions(Document, [ PERMISSION_DOCUMENT_VERIFY, @@ -70,3 +67,6 @@ class DocumentSignaturesApp(apps.AppConfig): PERMISSION_SIGNATURE_DOWNLOAD, PERMISSION_SIGNATURE_UPLOAD, ]) + + menu_facet.bind_links(links=[link_document_verify], sources=[Document]) + menu_sidebar.bind_links(links=[link_document_signature_upload, link_document_signature_download, link_document_signature_delete], sources=['signatures:document_verify', 'signatures:document_signature_upload', 'signatures:document_signature_download', 'signatures:document_signature_delete']) diff --git a/mayan/apps/document_signatures/links.py b/mayan/apps/document_signatures/links.py index 329b1a0e50..c9daf4a3f2 100644 --- a/mayan/apps/document_signatures/links.py +++ b/mayan/apps/document_signatures/links.py @@ -2,6 +2,8 @@ from __future__ import unicode_literals from django.utils.translation import ugettext_lazy as _ +from navigation import Link + from .models import DocumentVersionSignature from .permissions import ( PERMISSION_DOCUMENT_VERIFY, @@ -19,7 +21,7 @@ def doesnt_have_detached_signature(context): return DocumentVersionSignature.objects.has_detached_signature(context['object']) is False -document_signature_delete = {'text': _('Delete signature'), 'view': 'signatures:document_signature_delete', 'args': 'object.pk', 'famfam': 'pencil_delete', 'permissions': [PERMISSION_SIGNATURE_DELETE], 'conditional_disable': doesnt_have_detached_signature} -document_signature_download = {'text': _('Download signature'), 'view': 'signatures:document_signature_download', 'args': 'object.pk', 'famfam': 'disk', 'permissions': [PERMISSION_SIGNATURE_DOWNLOAD], 'conditional_disable': doesnt_have_detached_signature} -document_signature_upload = {'text': _('Upload signature'), 'view': 'signatures:document_signature_upload', 'args': 'object.pk', 'famfam': 'pencil_add', 'permissions': [PERMISSION_SIGNATURE_UPLOAD], 'conditional_disable': has_embedded_signature} -document_verify = {'text': _('Signatures'), 'view': 'signatures:document_verify', 'args': 'object.pk', 'famfam': 'text_signature', 'permissions': [PERMISSION_DOCUMENT_VERIFY]} +link_document_signature_delete = Link(conditional_disable=doesnt_have_detached_signature, permissions=[PERMISSION_SIGNATURE_DELETE], text=_('Delete signature'), view='signatures:document_signature_delete', args='object.pk') +link_document_signature_download = Link(conditional_disable=doesnt_have_detached_signature, text=_('Download signature'), view='signatures:document_signature_download', args='object.pk', permissions=[PERMISSION_SIGNATURE_DOWNLOAD]) +link_document_signature_upload = Link(conditional_disable=has_embedded_signature, permissions=[PERMISSION_SIGNATURE_UPLOAD], text=_('Upload signature'), view='signatures:document_signature_upload', args='object.pk') +link_document_verify = Link(permissions=[PERMISSION_DOCUMENT_VERIFY], text=_('Signatures'), view='signatures:document_verify', args='object.pk') diff --git a/mayan/apps/folders/apps.py b/mayan/apps/folders/apps.py index 1d5e75010c..0f689309a9 100644 --- a/mayan/apps/folders/apps.py +++ b/mayan/apps/folders/apps.py @@ -34,15 +34,15 @@ class FoldersApp(apps.AppConfig): def ready(self): APIEndPoint('folders') + class_permissions(Document, [ + PERMISSION_FOLDER_ADD_DOCUMENT, PERMISSION_FOLDER_REMOVE_DOCUMENT + ]) + class_permissions(Folder, [ ACLS_EDIT_ACL, ACLS_VIEW_ACL, PERMISSION_FOLDER_DELETE, PERMISSION_FOLDER_EDIT, PERMISSION_FOLDER_VIEW ]) - class_permissions(Document, [ - PERMISSION_FOLDER_ADD_DOCUMENT, PERMISSION_FOLDER_REMOVE_DOCUMENT - ]) - menu_facet.bind_links(links=[link_document_folder_list], sources=[Document]) menu_main.bind_links(links=[link_folder_list]) menu_multi_item.bind_links(links=[link_folder_add_multiple_documents], sources=[Document]) diff --git a/mayan/apps/folders/links.py b/mayan/apps/folders/links.py index 808253776a..f8d542b745 100644 --- a/mayan/apps/folders/links.py +++ b/mayan/apps/folders/links.py @@ -12,6 +12,7 @@ from .permissions import ( PERMISSION_FOLDER_REMOVE_DOCUMENT ) +link_document_folder_list = Link(permissions=[PERMISSION_DOCUMENT_VIEW], text=_('Folders'), view='folders:document_folder_list', args='object.pk') link_folder_acl_list = Link(permissions=[ACLS_VIEW_ACL], text=_('ACLs'), view='folders:folder_acl_list', args='object.pk') link_folder_add_document = Link(permissions=[PERMISSION_FOLDER_ADD_DOCUMENT], text=_('Add to a folder'), view='folders:folder_add_document', args='object.pk') link_folder_add_multiple_documents = Link(text=_('Add to folder'), view='folders:folder_add_multiple_documents') @@ -21,4 +22,3 @@ link_folder_document_multiple_remove = Link(permissions=[PERMISSION_FOLDER_REMOV link_folder_edit = Link(permissions=[PERMISSION_FOLDER_EDIT], text=_('Edit'), view='folders:folder_edit', args='object.pk') link_folder_list = Link(icon='fa fa-folder', text=_('Folders'), view='folders:folder_list') link_folder_view = Link(permissions=[PERMISSION_FOLDER_VIEW], text=_('Documents'), view='folders:folder_view', args='object.pk') -link_document_folder_list = Link(permissions=[PERMISSION_DOCUMENT_VIEW], text=_('Folders'), view='folders:document_folder_list', args='object.pk') diff --git a/mayan/apps/installation/apps.py b/mayan/apps/installation/apps.py index 6712d6f434..f41c49e56a 100644 --- a/mayan/apps/installation/apps.py +++ b/mayan/apps/installation/apps.py @@ -20,7 +20,6 @@ class InstallationApp(apps.AppConfig): menu_secondary.bind_links(links=[link_namespace_list], sources=['installation:namespace_list', PropertyNamespace]) menu_tools.bind_links(links=[link_menu_link]) - # Virtualenv namespace = PropertyNamespace('venv', _('VirtualEnv')) try: venv = VirtualEnv() diff --git a/mayan/apps/linking/apps.py b/mayan/apps/linking/apps.py index 841decd582..020ce27eca 100644 --- a/mayan/apps/linking/apps.py +++ b/mayan/apps/linking/apps.py @@ -5,16 +5,20 @@ from django.utils.translation import ugettext_lazy as _ from acls.api import class_permissions from acls.permissions import ACLS_EDIT_ACL, ACLS_VIEW_ACL -from common import menu_setup +from common import ( + menu_facet, menu_object, menu_secondary, menu_setup, menu_sidebar +) from documents.models import Document from .classes import ResolvedSmartLink from .links import ( - smart_link_acl_list, smart_link_create, smart_link_condition_create, - smart_link_condition_delete, smart_link_condition_edit, - smart_link_condition_list, smart_link_delete, smart_link_document_types, - smart_link_edit, smart_link_instance_view, - smart_link_instances_for_document, smart_link_list, link_smart_link_setup + link_smart_link_acl_list, link_smart_link_create, + link_smart_link_condition_create, link_smart_link_condition_delete, + link_smart_link_condition_edit, link_smart_link_condition_list, + link_smart_link_delete, link_smart_link_document_types, + link_smart_link_edit, link_smart_link_instance_view, + link_smart_link_instances_for_document, link_smart_link_list, + link_smart_link_setup ) from .models import SmartLink, SmartLinkCondition from .permissions import ( @@ -28,17 +32,15 @@ class LinkingApp(apps.AppConfig): verbose_name = _('Linking') def ready(self): - # TODO: convert - #register_links(Document, [smart_link_instances_for_document], menu_name='form_header') - #register_links(SmartLink, [smart_link_edit, smart_link_document_types, smart_link_condition_list, smart_link_acl_list, smart_link_delete]) - #register_links([SmartLink, 'linking:smart_link_list', 'linking:smart_link_create'], [smart_link_list, smart_link_create], menu_name='secondary_menu') - #register_links(SmartLinkCondition, [smart_link_condition_edit, smart_link_condition_delete]) - #register_links(ResolvedSmartLink, [smart_link_instance_view]) - #register_links(['linking:smart_link_condition_list', 'linking:smart_link_condition_create', 'linking:smart_link_condition_edit', 'linking:smart_link_condition_delete'], [smart_link_condition_create], menu_name='sidebar') - - menu_setup.bind_links(links=[link_smart_link_setup]) - class_permissions(SmartLink, [ ACLS_EDIT_ACL, ACLS_VIEW_ACL, PERMISSION_SMART_LINK_DELETE, PERMISSION_SMART_LINK_EDIT, PERMISSION_SMART_LINK_VIEW ]) + + menu_facet.bind_links(links=[link_smart_link_instances_for_document], sources=[Document]) + menu_object.bind_links(links=[link_smart_link_condition_edit, link_smart_link_condition_delete], sources=[SmartLinkCondition]) + menu_object.bind_links(links=[link_smart_link_edit, link_smart_link_document_types, link_smart_link_condition_list, link_smart_link_acl_list, link_smart_link_delete], sources=[SmartLink]) + menu_object.bind_links(links=[link_smart_link_instance_view], sources=[ResolvedSmartLink]) + menu_secondary.bind_links(links=[link_smart_link_list, link_smart_link_create], sources=[SmartLink, 'linking:smart_link_list', 'linking:smart_link_create']) + menu_setup.bind_links(links=[link_smart_link_setup]) + menu_sidebar.bind_links(links=[link_smart_link_condition_create], sources=['linking:smart_link_condition_list', 'linking:smart_link_condition_create', 'linking:smart_link_condition_edit', 'linking:smart_link_condition_delete']) diff --git a/mayan/apps/linking/forms.py b/mayan/apps/linking/forms.py index fbe90ac1f4..afe095b5ed 100644 --- a/mayan/apps/linking/forms.py +++ b/mayan/apps/linking/forms.py @@ -12,7 +12,7 @@ from .models import SmartLink, SmartLinkCondition class SmartLinkForm(forms.ModelForm): def __init__(self, *args, **kwargs): super(SmartLinkForm, self).__init__(*args, **kwargs) - self.fields['dynamic_title'].help_text = ' '.join([self.fields['dynamic_title'].help_text, ModelAttribute.help_text_for(Document, type_names=['field', 'related', 'property'])]) + self.fields['dynamic_title'].help_text = ' '.join([unicode(self.fields['dynamic_title'].help_text), ModelAttribute.help_text_for(Document, type_names=['field', 'related', 'property'])]) class Meta: fields = ('title', 'dynamic_title', 'enabled') diff --git a/mayan/apps/linking/links.py b/mayan/apps/linking/links.py index 3baf7cac0f..ac859fd522 100644 --- a/mayan/apps/linking/links.py +++ b/mayan/apps/linking/links.py @@ -11,19 +11,16 @@ from .permissions import ( PERMISSION_SMART_LINK_EDIT, PERMISSION_SMART_LINK_VIEW ) +link_smart_link_acl_list = Link(permissions=[ACLS_VIEW_ACL], text=_('ACLs'), view='linking:smart_link_acl_list', args='object.pk') +link_smart_link_condition_create = Link(permissions=[PERMISSION_SMART_LINK_EDIT], text=_('Create condition'), view='linking:smart_link_condition_create', args='object.pk') +link_smart_link_condition_delete = Link(permissions=[PERMISSION_SMART_LINK_EDIT], text=_('Delete'), view='linking:smart_link_condition_delete', args='condition.pk') +link_smart_link_condition_edit = Link(permissions=[PERMISSION_SMART_LINK_EDIT], text=_('Edit'), view='linking:smart_link_condition_edit', args='condition.pk') +link_smart_link_condition_list = Link(permissions=[PERMISSION_SMART_LINK_EDIT], text=_('Conditions'), view='linking:smart_link_condition_list', args='object.pk') +link_smart_link_create = Link(permissions=[PERMISSION_SMART_LINK_CREATE], text=_('Create new smart link'), view='linking:smart_link_create') +link_smart_link_delete = Link(permissions=[PERMISSION_SMART_LINK_DELETE], text=_('Delete'), view='linking:smart_link_delete', args='object.pk') +link_smart_link_document_types = Link(permissions=[PERMISSION_SMART_LINK_EDIT], text=_('Document types'), view='linking:smart_link_document_types', args='object.pk') +link_smart_link_edit = Link(permissions=[PERMISSION_SMART_LINK_EDIT], text=_('Edit'), view='linking:smart_link_edit', args='object.pk') +link_smart_link_instance_view = Link(permissions=[PERMISSION_SMART_LINK_VIEW], text=_('Documents'), view='linking:smart_link_instance_view', args=['document.pk', 'object.smart_link.pk']) +link_smart_link_instances_for_document = Link(permissions=[PERMISSION_DOCUMENT_VIEW], text=_('Smart links'), view='linking:smart_link_instances_for_document', args='object.pk') +link_smart_link_list = Link(permissions=[PERMISSION_SMART_LINK_CREATE], text=_('Smart links'), view='linking:smart_link_list') link_smart_link_setup = Link(icon='fa fa-link', permissions=[PERMISSION_SMART_LINK_CREATE], text=_('Smart links'), view='linking:smart_link_list') -smart_link_list = {'text': _('Smart links'), 'view': 'linking:smart_link_list', 'famfam': 'link', 'permissions': [PERMISSION_SMART_LINK_CREATE]} -smart_link_create = {'text': _('Create new smart link'), 'view': 'linking:smart_link_create', 'famfam': 'link_add', 'permissions': [PERMISSION_SMART_LINK_CREATE]} -smart_link_edit = {'text': _('Edit'), 'view': 'linking:smart_link_edit', 'args': 'object.pk', 'famfam': 'link_edit', 'permissions': [PERMISSION_SMART_LINK_EDIT]} -smart_link_delete = {'text': _('Delete'), 'view': 'linking:smart_link_delete', 'args': 'object.pk', 'famfam': 'link_delete', 'permissions': [PERMISSION_SMART_LINK_DELETE]} -smart_link_document_types = {'text': _('Document types'), 'view': 'linking:smart_link_document_types', 'args': 'object.pk', 'famfam': 'layout', 'permissions': [PERMISSION_SMART_LINK_EDIT]} - -smart_link_instances_for_document = {'text': _('Smart links'), 'view': 'linking:smart_link_instances_for_document', 'args': 'object.pk', 'famfam': 'page_link', 'permissions': [PERMISSION_DOCUMENT_VIEW]} -smart_link_instance_view = {'text': _('Documents'), 'view': 'linking:smart_link_instance_view', 'args': ['document.pk', 'object.smart_link.pk'], 'famfam': 'layout', 'page': [PERMISSION_SMART_LINK_VIEW]} - -smart_link_condition_list = {'text': _('Conditions'), 'view': 'linking:smart_link_condition_list', 'args': 'object.pk', 'famfam': 'cog', 'permissions': [PERMISSION_SMART_LINK_EDIT]} -smart_link_condition_create = {'text': _('Create condition'), 'view': 'linking:smart_link_condition_create', 'args': 'object.pk', 'famfam': 'cog_add', 'permissions': [PERMISSION_SMART_LINK_EDIT]} -smart_link_condition_edit = {'text': _('Edit'), 'view': 'linking:smart_link_condition_edit', 'args': 'condition.pk', 'famfam': 'cog_edit', 'permissions': [PERMISSION_SMART_LINK_EDIT]} -smart_link_condition_delete = {'text': _('Delete'), 'view': 'linking:smart_link_condition_delete', 'args': 'condition.pk', 'famfam': 'cog_delete', 'permissions': [PERMISSION_SMART_LINK_EDIT]} - -smart_link_acl_list = {'text': _('ACLs'), 'view': 'linking:smart_link_acl_list', 'args': 'object.pk', 'famfam': 'lock', 'permissions': [ACLS_VIEW_ACL]} diff --git a/mayan/apps/metadata/apps.py b/mayan/apps/metadata/apps.py index 0b030a2bd9..5f57492c9b 100644 --- a/mayan/apps/metadata/apps.py +++ b/mayan/apps/metadata/apps.py @@ -7,7 +7,10 @@ from django.db.models.signals import post_delete, post_save from django.utils.translation import ugettext_lazy as _ from acls.api import class_permissions -from common import menu_setup, menu_tools +from common import ( + menu_facet, menu_multi_item, menu_object, menu_secondary, menu_setup, + menu_sidebar, menu_tools +) from common.classes import ModelAttribute from common.utils import encapsulate from documents.models import Document, DocumentType @@ -18,12 +21,12 @@ from rest_api.classes import APIEndPoint from .api import get_metadata_string from .classes import DocumentMetadataHelper from .links import ( - metadata_add, metadata_edit, metadata_multiple_add, metadata_multiple_edit, - metadata_multiple_remove, metadata_remove, metadata_view, - setup_document_type_metadata, setup_document_type_metadata_required, - setup_metadata_type_create, setup_metadata_type_delete, - setup_metadata_type_edit, link_setup_metadata_type_list, - link_documents_missing_required_metadata + link_metadata_add, link_metadata_edit, link_metadata_multiple_add, + link_metadata_multiple_edit, link_metadata_multiple_remove, + link_metadata_remove, link_metadata_view, link_setup_document_type_metadata, + link_setup_document_type_metadata_required, link_setup_metadata_type_create, + link_setup_metadata_type_delete, link_setup_metadata_type_edit, + link_setup_metadata_type_list, link_documents_missing_required_metadata ) from .models import DocumentMetadata, DocumentTypeMetadataType, MetadataType from .permissions import ( @@ -64,36 +67,35 @@ class MetadataApp(apps.AppConfig): verbose_name = _('Metadata') def ready(self): - post_save.connect(post_document_type_metadata_type_add, dispatch_uid='post_document_type_metadata_type_add', sender=DocumentTypeMetadataType) - post_delete.connect(post_document_type_metadata_type_delete, dispatch_uid='post_document_type_metadata_type_delete', sender=DocumentTypeMetadataType) - post_document_type_change.connect(post_post_document_type_change_metadata, dispatch_uid='post_post_document_type_change_metadata', sender=Document) + APIEndPoint('metadata') Document.add_to_class('metadata_value_of', DocumentMetadataHelper.constructor) - # TODO: convert - #register_links(['metadata:metadata_add', 'metadata:metadata_edit', 'metadata:metadata_remove', 'metadata:metadata_view'], [metadata_add, metadata_edit, metadata_remove], menu_name='sidebar') - #register_links(Document, [metadata_view], menu_name='form_header') - #register_links([Document], [metadata_multiple_add, metadata_multiple_edit, metadata_multiple_remove, link_spacer], menu_name='multi_item_links') - #register_links(DocumentType, [setup_document_type_metadata, setup_document_type_metadata_required]) - #register_links(MetadataType, [setup_metadata_type_edit, setup_metadata_type_delete]) - #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') - - menu_setup.bind_links(links=[link_setup_metadata_type_list]) - menu_tools.bind_links(links=[link_documents_missing_required_metadata]) + ModelAttribute(Document, 'metadata', type_name='related', description=_('Queryset containing a MetadataType instance reference and a value for that metadata type')) + ModelAttribute(Document, 'metadata__metadata_type__name', label=_('Metadata type name'), type_name='query') + ModelAttribute(Document, 'metadata__value', label=_('Metadata type value'), type_name='query') + ModelAttribute(Document, 'metadata_value_of', label=_('Value of a metadata'), description=_('Return the value of a specific document metadata'), type_name=['property', 'indexing']) class_permissions(Document, [ PERMISSION_METADATA_DOCUMENT_ADD, PERMISSION_METADATA_DOCUMENT_EDIT, PERMISSION_METADATA_DOCUMENT_REMOVE, PERMISSION_METADATA_DOCUMENT_VIEW, ]) + menu_facet.bind_links(links=[link_metadata_view], sources=[Document]) + menu_multi_item.bind_links(links=[link_metadata_multiple_add, link_metadata_multiple_edit, link_metadata_multiple_remove], sources=[Document]) + menu_object.bind_links(links=[link_setup_document_type_metadata, link_setup_document_type_metadata_required], sources=[DocumentType]) + menu_object.bind_links(links=[link_setup_metadata_type_edit, link_setup_metadata_type_delete], sources=[MetadataType]) + menu_secondary.bind_links(links=[link_setup_metadata_type_list, link_setup_metadata_type_create], sources=[MetadataType, 'metadata:setup_metadata_type_list', 'metadata:setup_metadata_type_create']) + menu_setup.bind_links(links=[link_setup_metadata_type_list]) + menu_sidebar.bind_links(links=[link_metadata_add, link_metadata_edit, link_metadata_remove], sources=['metadata:metadata_add', 'metadata:metadata_edit', 'metadata:metadata_remove', 'metadata:metadata_view']) + menu_tools.bind_links(links=[link_documents_missing_required_metadata]) + + post_save.connect(post_document_type_metadata_type_add, dispatch_uid='post_document_type_metadata_type_add', sender=DocumentTypeMetadataType) + post_delete.connect(post_document_type_metadata_type_delete, dispatch_uid='post_document_type_metadata_type_delete', sender=DocumentTypeMetadataType) + post_document_type_change.connect(post_post_document_type_change_metadata, dispatch_uid='post_post_document_type_change_metadata', sender=Document) + register_model_list_columns(Document, [ { 'name': _('Metadata'), 'attribute': encapsulate(lambda x: get_metadata_string(x)) }, ]) - - APIEndPoint('metadata') - ModelAttribute(Document, 'metadata__metadata_type__name', label=_('Metadata type name'), type_name='query') - ModelAttribute(Document, 'metadata__value', label=_('Metadata type value'), type_name='query') - ModelAttribute(Document, 'metadata', type_name='related', description=_('Queryset containing a MetadataType instance reference and a value for that metadata type')) - ModelAttribute(Document, 'metadata_value_of', label=_('Value of a metadata'), description=_('Return the value of a specific document metadata'), type_name=['property', 'indexing']) diff --git a/mayan/apps/metadata/links.py b/mayan/apps/metadata/links.py index c65ab9cfbd..628d3c3234 100644 --- a/mayan/apps/metadata/links.py +++ b/mayan/apps/metadata/links.py @@ -12,21 +12,17 @@ from .permissions import ( PERMISSION_METADATA_TYPE_EDIT, PERMISSION_METADATA_TYPE_VIEW ) - -metadata_edit = {'text': _('Edit metadata'), 'view': 'metadata:metadata_edit', 'args': 'object.pk', 'famfam': 'xhtml_go', 'permissions': [PERMISSION_METADATA_DOCUMENT_EDIT]} -metadata_view = {'text': _('Metadata'), 'view': 'metadata:metadata_view', 'args': 'object.pk', 'famfam': 'xhtml_go', 'permissions': [PERMISSION_METADATA_DOCUMENT_VIEW]} -metadata_multiple_edit = {'text': _('Edit metadata'), 'view': 'metadata:metadata_multiple_edit', 'famfam': 'xhtml_go', 'permissions': [PERMISSION_METADATA_DOCUMENT_EDIT]} -metadata_add = {'text': _('Add metadata'), 'view': 'metadata:metadata_add', 'args': 'object.pk', 'famfam': 'xhtml_add', 'permissions': [PERMISSION_METADATA_DOCUMENT_ADD]} -metadata_multiple_add = {'text': _('Add metadata'), 'view': 'metadata:metadata_multiple_add', 'famfam': 'xhtml_add', 'permissions': [PERMISSION_METADATA_DOCUMENT_ADD]} -metadata_remove = {'text': _('Remove metadata'), 'view': 'metadata:metadata_remove', 'args': 'object.pk', 'famfam': 'xhtml_delete', 'permissions': [PERMISSION_METADATA_DOCUMENT_REMOVE]} -metadata_multiple_remove = {'text': _('Remove metadata'), 'view': 'metadata:metadata_multiple_remove', 'famfam': 'xhtml_delete', 'permissions': [PERMISSION_METADATA_DOCUMENT_REMOVE]} - -setup_document_type_metadata = {'text': _('Optional metadata'), 'view': 'metadata:setup_document_type_metadata', 'args': 'document_type.pk', 'famfam': 'xhtml', 'permissions': [PERMISSION_DOCUMENT_TYPE_EDIT]} -setup_document_type_metadata_required = {'text': _('Required metadata'), 'view': 'metadata:setup_document_type_metadata_required', 'args': 'document_type.pk', 'famfam': 'xhtml', 'permissions': [PERMISSION_DOCUMENT_TYPE_EDIT]} - -link_setup_metadata_type_list = Link(icon='fa fa-list', permissions=[PERMISSION_METADATA_TYPE_VIEW], text=_('Metadata types'), view='metadata:setup_metadata_type_list') -setup_metadata_type_edit = {'text': _('Edit'), 'view': 'metadata:setup_metadata_type_edit', 'args': 'object.pk', 'famfam': 'xhtml', 'permissions': [PERMISSION_METADATA_TYPE_EDIT]} -setup_metadata_type_delete = {'text': _('Delete'), 'view': 'metadata:setup_metadata_type_delete', 'args': 'object.pk', 'famfam': 'xhtml_delete', 'permissions': [PERMISSION_METADATA_TYPE_DELETE]} -setup_metadata_type_create = {'text': _('Create new'), 'view': 'metadata:setup_metadata_type_create', 'famfam': 'xhtml_add', 'permissions': [PERMISSION_METADATA_TYPE_CREATE]} - link_documents_missing_required_metadata = Link(icon='fa fa-edit', text=_('Missing required metadata'), view='metadata:documents_missing_required_metadata') +link_metadata_add = Link(permissions=[PERMISSION_METADATA_DOCUMENT_ADD], text=_('Add metadata'), view='metadata:metadata_add', args='object.pk') +link_metadata_edit = Link(permissions=[PERMISSION_METADATA_DOCUMENT_EDIT], text=_('Edit metadata'), view='metadata:metadata_edit', args='object.pk') +link_metadata_multiple_add = Link(permissions=[PERMISSION_METADATA_DOCUMENT_ADD], text=_('Add metadata'), view='metadata:metadata_multiple_add') +link_metadata_multiple_edit = Link(permissions=[PERMISSION_METADATA_DOCUMENT_EDIT], text=_('Edit metadata'), view='metadata:metadata_multiple_edit') +link_metadata_multiple_remove = Link(permissions=[PERMISSION_METADATA_DOCUMENT_REMOVE], text=_('Remove metadata'), view='metadata:metadata_multiple_remove') +link_metadata_remove = Link(permissions=[PERMISSION_METADATA_DOCUMENT_REMOVE], text=_('Remove metadata'), view='metadata:metadata_remove', args='object.pk') +link_metadata_view = Link(permissions=[PERMISSION_METADATA_DOCUMENT_VIEW], text=_('Metadata'), view='metadata:metadata_view', args='object.pk') +link_setup_document_type_metadata = Link(permissions=[PERMISSION_DOCUMENT_TYPE_EDIT], text=_('Optional metadata'), view='metadata:setup_document_type_metadata', args='document_type.pk') +link_setup_document_type_metadata_required = Link(permissions=[PERMISSION_DOCUMENT_TYPE_EDIT], text=_('Required metadata'), view='metadata:setup_document_type_metadata_required', args='document_type.pk') +link_setup_metadata_type_create = Link(permissions=[PERMISSION_METADATA_TYPE_CREATE], text=_('Create new'), view='metadata:setup_metadata_type_create') +link_setup_metadata_type_delete = Link(permissions=[PERMISSION_METADATA_TYPE_DELETE], text=_('Delete'), view='metadata:setup_metadata_type_delete', args='object.pk') +link_setup_metadata_type_edit = Link(permissions=[PERMISSION_METADATA_TYPE_EDIT], text=_('Edit'), view='metadata:setup_metadata_type_edit', args='object.pk') +link_setup_metadata_type_list = Link(icon='fa fa-list', permissions=[PERMISSION_METADATA_TYPE_VIEW], text=_('Metadata types'), view='metadata:setup_metadata_type_list') diff --git a/mayan/apps/navigation/classes.py b/mayan/apps/navigation/classes.py index 6001d0849d..e07e421b83 100644 --- a/mayan/apps/navigation/classes.py +++ b/mayan/apps/navigation/classes.py @@ -90,13 +90,18 @@ class Menu(object): for resolved_navigation_object in resolved_navigation_object_list: for source, links in self.bound_links.iteritems(): - if inspect.isclass(source) and isinstance(resolved_navigation_object, source) or source == CombinedSource(obj=(resolved_navigation_object), view=current_view): - for link in links: - resolved_link = link.resolve(context) - if resolved_link: - result.append(resolved_link) + try: + if inspect.isclass(source) and isinstance(resolved_navigation_object, source) or source == CombinedSource(obj=resolved_navigation_object, view=current_view): + for link in links: + resolved_link = link.resolve(context) + if resolved_link: + result.append(resolved_link) + #break # No need for further content object match testing + + except TypeError: + # When source is a dictionary + pass - #break # No need for further content object match testing # View links for link in self.bound_links.get(current_view, []): diff --git a/mayan/apps/ocr/apps.py b/mayan/apps/ocr/apps.py index f57126e0e9..30272467c4 100644 --- a/mayan/apps/ocr/apps.py +++ b/mayan/apps/ocr/apps.py @@ -8,7 +8,7 @@ from django import apps from django.utils.translation import ugettext_lazy as _ from acls.api import class_permissions -from common import menu_tools +from common import menu_multi_item, menu_object, menu_secondary, menu_tools from common.utils import encapsulate from documents.models import Document, DocumentVersion from documents.signals import post_version_upload @@ -52,36 +52,21 @@ class OCRApp(apps.AppConfig): verbose_name = _('OCR') def ready(self): - # TODO: convert - #register_links(Document, [link_document_submit]) - #register_links([Document], [link_document_submit_multiple, link_spacer], menu_name='multi_item_links') - #register_links([DocumentVersionOCRError], [link_entry_re_queue_multiple, link_entry_delete_multiple], menu_name='multi_item_links') - #register_links([DocumentVersionOCRError], [link_entry_re_queue, link_entry_delete]) - #register_links(['ocr:entry_list', 'ocr:entry_delete_multiple', 'ocr:entry_re_queue_multiple', DocumentVersionOCRError], [link_entry_list], menu_name='secondary_menu') - register_maintenance_links([link_document_all_ocr_cleanup], namespace='ocr', title=_('OCR')) - - post_version_upload.connect(post_version_upload_ocr, dispatch_uid='post_version_upload_ocr', sender=DocumentVersion) + APIEndPoint('ocr') Document.add_to_class('submit_for_ocr', document_ocr_submit) DocumentVersion.add_to_class('submit_for_ocr', document_version_ocr_submit) class_permissions(Document, [PERMISSION_OCR_DOCUMENT]) + menu_multi_item.bind_links(links=[link_document_submit_multiple], sources=[Document]) + menu_multi_item.bind_links(links=[link_entry_re_queue_multiple, link_entry_delete_multiple], sources=[DocumentVersionOCRError]) + menu_object.bind_links(links=[link_document_submit], sources=[Document]) + menu_object.bind_links(links=[link_entry_re_queue, link_entry_delete], sources=[DocumentVersionOCRError]) + menu_secondary.bind_links(links=[link_entry_list], sources=['ocr:entry_list', 'ocr:entry_delete_multiple', 'ocr:entry_re_queue_multiple', DocumentVersionOCRError]) menu_tools.bind_links(links=[link_entry_list]) - APIEndPoint('ocr') - - register_model_list_columns(DocumentVersionOCRError, [ - { - 'name': _('Document'), 'attribute': encapsulate(lambda entry: document_link(entry.document_version.document)) - }, - { - 'name': _('Added'), 'attribute': 'datetime_submitted' - }, - { - 'name': _('Result'), 'attribute': 'result' - }, - ]) + post_version_upload.connect(post_version_upload_ocr, dispatch_uid='post_version_upload_ocr', sender=DocumentVersion) namespace = PropertyNamespace('ocr', _('OCR')) @@ -111,3 +96,17 @@ class OCRApp(apps.AppConfig): namespace.add_property('unpaper', _('unpaper version'), _('error getting version'), report=True) else: namespace.add_property('unpaper', _('unpaper version'), unpaper('-V').stdout, report=True) + + register_maintenance_links([link_document_all_ocr_cleanup], namespace='ocr', title=_('OCR')) + + register_model_list_columns(DocumentVersionOCRError, [ + { + 'name': _('Document'), 'attribute': encapsulate(lambda entry: document_link(entry.document_version.document)) + }, + { + 'name': _('Added'), 'attribute': 'datetime_submitted' + }, + { + 'name': _('Result'), 'attribute': 'result' + }, + ]) diff --git a/mayan/apps/permissions/apps.py b/mayan/apps/permissions/apps.py index 4f7c01ea68..4e352952f2 100644 --- a/mayan/apps/permissions/apps.py +++ b/mayan/apps/permissions/apps.py @@ -6,7 +6,9 @@ from django.core.exceptions import ObjectDoesNotExist from django.db.models.signals import post_save from django.utils.translation import ugettext_lazy as _ -from common.menus import menu_setup +from common.menus import ( + menu_multi_item, menu_object, menu_secondary, menu_setup +) from rest_api.classes import APIEndPoint from .models import Role @@ -38,13 +40,11 @@ class PermissionsApp(apps.AppConfig): verbose_name = _('Permissions') def ready(self): - # TODO: convert - #register_links(Role, [role_edit, role_members, role_permissions, role_delete]) - #register_links([Role, 'permissions:role_create', 'permissions:role_list'], [role_list, role_create], menu_name='secondary_menu') - #register_links(['permissions:role_permissions'], [permission_grant, permission_revoke], menu_name='multi_item_links') - - post_save.connect(user_post_save, sender=User) + APIEndPoint('permissions') + menu_object.bind_links(links=[link_role_edit, link_role_members, link_role_permissions, link_role_delete], sources=[Role]) + menu_multi_item.bind_links(links=[link_permission_grant, link_permission_revoke], sources=['permissions:role_permissions']) + menu_secondary.bind_links(links=[link_role_list, link_role_create], sources=[Role, 'permissions:role_create', 'permissions:role_list']) menu_setup.bind_links(links=[link_role_list]) - APIEndPoint('permissions') + post_save.connect(user_post_save, sender=User) diff --git a/mayan/apps/sources/apps.py b/mayan/apps/sources/apps.py index ae7dfe2bc7..7430849457 100644 --- a/mayan/apps/sources/apps.py +++ b/mayan/apps/sources/apps.py @@ -3,7 +3,9 @@ from __future__ import absolute_import, unicode_literals from django import apps from django.utils.translation import ugettext_lazy as _ -from common import menu_front_page, menu_setup +from common import ( + menu_front_page, menu_object, menu_secondary, menu_sidebar, menu_setup +) from common.utils import encapsulate from documents.models import Document from main import MissingItem @@ -35,23 +37,19 @@ class SourcesApp(apps.AppConfig): APIEndPoint('sources') MissingItem(label=_('Create a document source'), description=_('Document sources are the way in which new documents are feed to Mayan EDMS, create at least a web form source to be able to upload documents from a browser.'), condition=lambda: not Source.objects.exists(), view='sources:setup_source_list') + menu_front_page.bind_links(links=[link_document_create_multiple]) + menu_object.bind_links(links=[link_document_create_siblings], sources=[Document]) + menu_object.bind_links(links=[link_setup_source_edit, link_setup_source_transformation_list, link_setup_source_delete], sources=[Source]) + menu_object.bind_links(links=[link_setup_source_transformation_edit, link_setup_source_transformation_delete], sources=[SourceTransformation]) + menu_object.bind_links(links=[link_staging_file_delete], sources=[StagingFile]) + menu_secondary.bind_links(links=[link_setup_sources, link_setup_source_create_webform, link_setup_source_create_staging_folder, link_setup_source_create_pop3_email, link_setup_source_create_imap_email, link_setup_source_create_watch_folder], sources=[Source, 'sources:setup_source_list', 'sources:setup_source_create']) + menu_setup.bind_links(links=[link_setup_sources]) + menu_sidebar.bind_links(links=[link_setup_source_transformation_create], sources=[SourceTransformation, 'sources:setup_source_transformation_create', 'sources:setup_source_transformation_list']) + menu_sidebar.bind_links(links=[link_upload_version], sources=['documents:document_version_list', 'documents:upload_version', 'documents:document_version_revert']) + register_model_list_columns(StagingFile, [ { 'name': _('Thumbnail'), 'attribute': encapsulate(lambda x: staging_file_thumbnail(x, gallery_name='sources:staging_list', title=x.filename, size='100')) }, ]) - - # TODO: convert - #register_links([StagingFile], [staging_file_delete]) - #register_links([Source, 'sources:setup_source_list', 'sources:setup_source_create'], [setup_sources, setup_source_create_webform, setup_source_create_staging_folder, setup_source_create_pop3_email, setup_source_create_imap_email, setup_source_create_watch_folder], menu_name='secondary_menu') - #register_links([Source], [setup_source_edit, setup_source_transformation_list, setup_source_delete]) - #register_links(SourceTransformation, [setup_source_transformation_edit, setup_source_transformation_delete]) - #register_links([SourceTransformation, 'sources:setup_source_transformation_create', 'sources:setup_source_transformation_list'], [setup_source_transformation_create], menu_name='sidebar') - #register_links(['documents:document_version_list', 'documents:upload_version', 'documents:document_version_revert'], [upload_version], menu_name='sidebar') - #register_links(Document, [document_create_siblings]) - - menu_setup.bind_links(links=[link_setup_sources]) - - menu_front_page.bind_links(links=[link_document_create_multiple]) - diff --git a/mayan/apps/statistics/apps.py b/mayan/apps/statistics/apps.py index 75a81f2c8b..a6044523d9 100644 --- a/mayan/apps/statistics/apps.py +++ b/mayan/apps/statistics/apps.py @@ -3,7 +3,7 @@ from __future__ import unicode_literals from django import apps from django.utils.translation import ugettext_lazy as _ -from common import menu_tools +from common import menu_object, menu_secondary, menu_tools from .classes import Statistic, StatisticNamespace from .links import ( @@ -17,7 +17,7 @@ class StatisticsApp(apps.AppConfig): verbose_name = _('Statistics') def ready(self): - #register_links(StatisticNamespace, [link_namespace_details]) - #register_links([StatisticNamespace, 'statistics:namespace_list', 'statistics:execute'], [link_namespace_list], menu_name='secondary_menu') - #register_links(Statistic, [link_execute]) + menu_object.bind_links(links=[link_execute], sources=[Statistic]) + menu_object.bind_links(links=[link_namespace_details], sources=[StatisticNamespace]) + menu_secondary.bind_links(links=[link_namespace_list], sources=[StatisticNamespace, 'statistics:namespace_list', 'statistics:execute']) menu_tools.bind_links(links=[link_statistics])