diff --git a/mayan/apps/metadata/__init__.py b/mayan/apps/metadata/__init__.py index e495204f51..1b030e3bd4 100644 --- a/mayan/apps/metadata/__init__.py +++ b/mayan/apps/metadata/__init__.py @@ -15,10 +15,13 @@ from project_setup.api import register_setup from rest_api.classes import APIEndPoint from .api import get_metadata_string +from .classes import DocumentTypeMetadataTypeManager 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_metadata_type_create, + 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) from .models import MetadataType @@ -31,14 +34,6 @@ from .urls import api_urls logger = logging.getLogger(__name__) -@property -def document_type_metadata(self): - try: - return self.documenttypedefaults_set.get().default_metadata - except self.documenttypedefaults_set.model.DoesNotExist: - return MetadataType.objects.none() - - @receiver(post_document_type_change, dispatch_uid='post_post_document_type_change_metadata', sender=Document) def post_post_document_type_change_metadata(sender, instance, **kwargs): logger.debug('received post_document_type_change') @@ -52,11 +47,11 @@ def post_post_document_type_change_metadata(sender, instance, **kwargs): instance.metadata.create(metadata_type=metadata_type, value=None) -DocumentType.add_to_class('metadata', document_type_metadata) +DocumentType.add_to_class('metadata_type', DocumentTypeMetadataTypeManager.factory) 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(DocumentType, [setup_document_type_metadata]) +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') register_links([Document], [link_spacer, metadata_multiple_add, metadata_multiple_edit, metadata_multiple_remove], menu_name='multi_item_links') diff --git a/mayan/apps/metadata/links.py b/mayan/apps/metadata/links.py index 225599d325..c1e8e27891 100644 --- a/mayan/apps/metadata/links.py +++ b/mayan/apps/metadata/links.py @@ -22,7 +22,8 @@ metadata_multiple_add = {'text': _(u'Add metadata'), 'view': 'metadata:metadata_ metadata_remove = {'text': _(u'Remove metadata'), 'view': 'metadata:metadata_remove', 'args': 'object.pk', 'famfam': 'xhtml_delete', 'permissions': [PERMISSION_METADATA_DOCUMENT_REMOVE]} metadata_multiple_remove = {'text': _(u'Remove metadata'), 'view': 'metadata:metadata_multiple_remove', 'famfam': 'xhtml_delete', 'permissions': [PERMISSION_METADATA_DOCUMENT_REMOVE]} -setup_document_type_metadata = {'text': _(u'Metadata'), 'view': 'metadata:setup_document_type_metadata', 'args': 'document_type.pk', 'famfam': 'xhtml', 'permissions': [PERMISSION_DOCUMENT_TYPE_EDIT]} +setup_document_type_metadata = {'text': _(u'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': _(u'Required metadata'), 'view': 'metadata:setup_document_type_metadata_required', 'args': 'document_type.pk', 'famfam': 'xhtml', 'permissions': [PERMISSION_DOCUMENT_TYPE_EDIT]} setup_metadata_type_list = {'text': _(u'Metadata types'), 'view': 'metadata:setup_metadata_type_list', 'famfam': 'xhtml_go', 'icon': 'xhtml.png', 'permissions': [PERMISSION_METADATA_TYPE_VIEW]} setup_metadata_type_edit = {'text': _(u'Edit'), 'view': 'metadata:setup_metadata_type_edit', 'args': 'object.pk', 'famfam': 'xhtml', 'permissions': [PERMISSION_METADATA_TYPE_EDIT]} diff --git a/mayan/apps/metadata/urls.py b/mayan/apps/metadata/urls.py index 49f8131d74..a4f746b324 100644 --- a/mayan/apps/metadata/urls.py +++ b/mayan/apps/metadata/urls.py @@ -19,7 +19,8 @@ urlpatterns = patterns('metadata.views', url(r'^setup/type/(?P\d+)/edit/$', 'setup_metadata_type_edit', (), 'setup_metadata_type_edit'), url(r'^setup/type/(?P\d+)/delete/$', 'setup_metadata_type_delete', (), 'setup_metadata_type_delete'), - url(r'^setup/document/type/(?P\d+)/metadata/default/edit/$', 'setup_document_type_metadata', (), 'setup_document_type_metadata'), + 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'), ) api_urls = patterns('', diff --git a/mayan/apps/metadata/views.py b/mayan/apps/metadata/views.py index dc23d769d3..723ffe18f4 100644 --- a/mayan/apps/metadata/views.py +++ b/mayan/apps/metadata/views.py @@ -14,14 +14,14 @@ from documents.models import Document, DocumentType from documents.permissions import PERMISSION_DOCUMENT_TYPE_EDIT from permissions.models import Permission -from common.utils import get_object_name +from common.utils import get_object_name, generate_choices_w_labels from common.views import assign_remove from .api import save_metadata_list from .classes import MetadataObjectWrapper from .forms import (AddMetadataForm, MetadataFormSet, MetadataRemoveFormSet, MetadataTypeForm) -from .models import DocumentMetadata, DocumentTypeDefaults, MetadataType +from .models import DocumentMetadata, MetadataType from .permissions import (PERMISSION_METADATA_DOCUMENT_ADD, PERMISSION_METADATA_DOCUMENT_EDIT, PERMISSION_METADATA_DOCUMENT_REMOVE, @@ -375,64 +375,41 @@ def setup_metadata_type_delete(request, metadatatype_id): context_instance=RequestContext(request)) -def _as_choice_list(items): - return sorted([(MetadataObjectWrapper.encapsulate(item).gid, get_object_name(item, display_object_type=False)) for item in items], key=lambda x: x[1]) - - -def get_document_type_metadata_non_members(document_type): - metadata_types = get_document_type_metadata_members(document_type, separate=True) - metadata_types = set(MetadataType.objects.all()) - set(metadata_types) - - non_members = [] - if metadata_types: - non_members.append((_(u'Metadata types'), _as_choice_list(list(metadata_types)))) - - return non_members - - -def get_document_type_metadata_members(document_type, separate=False): - metadata_types = set(document_type.documenttypedefaults_set.get().default_metadata.all()) - - if separate: - return metadata_types - else: - members = [] - - if metadata_types: - members.append((_(u'Metadata types'), _as_choice_list(list(metadata_types)))) - - return members - - -def add_document_type_metadata(document_type, selection): - metadata_object = MetadataObjectWrapper.get(selection).source_object - document_type.documenttypedefaults_set.get().default_metadata.add(metadata_object) - - -def remove_document_type_metadata(document_type, selection): - metadata_object = MetadataObjectWrapper.get(selection).source_object - document_type.documenttypedefaults_set.get().default_metadata.remove(metadata_object) - - def setup_document_type_metadata(request, document_type_id): Permission.objects.check_permissions(request.user, [PERMISSION_DOCUMENT_TYPE_EDIT]) document_type = get_object_or_404(DocumentType, pk=document_type_id) - # Initialize defaults - DocumentTypeDefaults.objects.get_or_create(document_type=document_type) - return assign_remove( request, - left_list=lambda: get_document_type_metadata_non_members(document_type), - right_list=lambda: get_document_type_metadata_members(document_type), - add_method=lambda x: add_document_type_metadata(document_type, x), - remove_method=lambda x: remove_document_type_metadata(document_type, x), - left_list_title=_(u'Non members of document type: %s') % document_type, - right_list_title=_(u'Members of document type: %s') % document_type, + left_list=lambda: generate_choices_w_labels(set(MetadataType.objects.all()) - set(document_type.metadata_type.filter(required=False)) - set(document_type.metadata_type.filter(required=True)), display_object_type=False), + right_list=lambda: generate_choices_w_labels(document_type.metadata_type.filter(required=False), display_object_type=False), + add_method=lambda x: document_type.metadata_type.add(x, required=False), + remove_method=lambda x: document_type.metadata_type.remove(x), extra_context={ 'document_type': document_type, 'navigation_object_name': 'document_type', + 'title': _(u'Optional metadata types for document type: %s') % document_type, }, - grouped=True, + decode_content_type=True, + ) + + +def setup_document_type_metadata_required(request, document_type_id): + Permission.objects.check_permissions(request.user, [PERMISSION_DOCUMENT_TYPE_EDIT]) + + document_type = get_object_or_404(DocumentType, pk=document_type_id) + + return assign_remove( + request, + left_list=lambda: generate_choices_w_labels(set(MetadataType.objects.all()) - set(document_type.metadata_type.filter(required=False)) - set(document_type.metadata_type.filter(required=True)), display_object_type=False), + right_list=lambda: generate_choices_w_labels(document_type.metadata_type.filter(required=True), display_object_type=False), + add_method=lambda x: document_type.metadata_type.add(x, required=True), + remove_method=lambda x: document_type.metadata_type.remove(x), + extra_context={ + 'document_type': document_type, + 'navigation_object_name': 'document_type', + 'title': _('Required metadata types for document type: %s') % document_type, + }, + decode_content_type=True, )