Add view to add or remove required metadata types to a document type, simplify existing view to add remove optional metadata types

This commit is contained in:
Roberto Rosario
2014-10-30 02:28:49 -04:00
parent 375de8270e
commit c4c2646b60
4 changed files with 38 additions and 64 deletions

View File

@@ -15,10 +15,13 @@ from project_setup.api import register_setup
from rest_api.classes import APIEndPoint from rest_api.classes import APIEndPoint
from .api import get_metadata_string from .api import get_metadata_string
from .classes import DocumentTypeMetadataTypeManager
from .links import (metadata_add, metadata_edit, metadata_multiple_add, from .links import (metadata_add, metadata_edit, metadata_multiple_add,
metadata_multiple_edit, metadata_multiple_remove, metadata_multiple_edit, metadata_multiple_remove,
metadata_remove, metadata_view, 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_delete, setup_metadata_type_edit,
setup_metadata_type_list) setup_metadata_type_list)
from .models import MetadataType from .models import MetadataType
@@ -31,14 +34,6 @@ from .urls import api_urls
logger = logging.getLogger(__name__) 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) @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): def post_post_document_type_change_metadata(sender, instance, **kwargs):
logger.debug('received post_document_type_change') 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) 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(['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_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, [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([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') register_links([Document], [link_spacer, metadata_multiple_add, metadata_multiple_edit, metadata_multiple_remove], menu_name='multi_item_links')

View File

@@ -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_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]} 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_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]} setup_metadata_type_edit = {'text': _(u'Edit'), 'view': 'metadata:setup_metadata_type_edit', 'args': 'object.pk', 'famfam': 'xhtml', 'permissions': [PERMISSION_METADATA_TYPE_EDIT]}

View File

@@ -19,7 +19,8 @@ urlpatterns = patterns('metadata.views',
url(r'^setup/type/(?P<metadatatype_id>\d+)/edit/$', 'setup_metadata_type_edit', (), 'setup_metadata_type_edit'), url(r'^setup/type/(?P<metadatatype_id>\d+)/edit/$', 'setup_metadata_type_edit', (), 'setup_metadata_type_edit'),
url(r'^setup/type/(?P<metadatatype_id>\d+)/delete/$', 'setup_metadata_type_delete', (), 'setup_metadata_type_delete'), url(r'^setup/type/(?P<metadatatype_id>\d+)/delete/$', 'setup_metadata_type_delete', (), 'setup_metadata_type_delete'),
url(r'^setup/document/type/(?P<document_type_id>\d+)/metadata/default/edit/$', 'setup_document_type_metadata', (), 'setup_document_type_metadata'), url(r'^setup/document/type/(?P<document_type_id>\d+)/metadata/edit/$', 'setup_document_type_metadata', (), 'setup_document_type_metadata'),
url(r'^setup/document/type/(?P<document_type_id>\d+)/metadata/edit/required/$', 'setup_document_type_metadata_required', (), 'setup_document_type_metadata_required'),
) )
api_urls = patterns('', api_urls = patterns('',

View File

@@ -14,14 +14,14 @@ from documents.models import Document, DocumentType
from documents.permissions import PERMISSION_DOCUMENT_TYPE_EDIT from documents.permissions import PERMISSION_DOCUMENT_TYPE_EDIT
from permissions.models import Permission 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 common.views import assign_remove
from .api import save_metadata_list from .api import save_metadata_list
from .classes import MetadataObjectWrapper from .classes import MetadataObjectWrapper
from .forms import (AddMetadataForm, MetadataFormSet, MetadataRemoveFormSet, from .forms import (AddMetadataForm, MetadataFormSet, MetadataRemoveFormSet,
MetadataTypeForm) MetadataTypeForm)
from .models import DocumentMetadata, DocumentTypeDefaults, MetadataType from .models import DocumentMetadata, MetadataType
from .permissions import (PERMISSION_METADATA_DOCUMENT_ADD, from .permissions import (PERMISSION_METADATA_DOCUMENT_ADD,
PERMISSION_METADATA_DOCUMENT_EDIT, PERMISSION_METADATA_DOCUMENT_EDIT,
PERMISSION_METADATA_DOCUMENT_REMOVE, PERMISSION_METADATA_DOCUMENT_REMOVE,
@@ -375,64 +375,41 @@ def setup_metadata_type_delete(request, metadatatype_id):
context_instance=RequestContext(request)) 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): def setup_document_type_metadata(request, document_type_id):
Permission.objects.check_permissions(request.user, [PERMISSION_DOCUMENT_TYPE_EDIT]) Permission.objects.check_permissions(request.user, [PERMISSION_DOCUMENT_TYPE_EDIT])
document_type = get_object_or_404(DocumentType, pk=document_type_id) 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( return assign_remove(
request, request,
left_list=lambda: get_document_type_metadata_non_members(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: get_document_type_metadata_members(document_type), right_list=lambda: generate_choices_w_labels(document_type.metadata_type.filter(required=False), display_object_type=False),
add_method=lambda x: add_document_type_metadata(document_type, x), add_method=lambda x: document_type.metadata_type.add(x, required=False),
remove_method=lambda x: remove_document_type_metadata(document_type, x), remove_method=lambda x: document_type.metadata_type.remove(x),
left_list_title=_(u'Non members of document type: %s') % document_type,
right_list_title=_(u'Members of document type: %s') % document_type,
extra_context={ extra_context={
'document_type': document_type, 'document_type': document_type,
'navigation_object_name': '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,
) )