Document the usable document attributes added by the metadata app using ModelAttribute class, add DocumentMetadataHelper to help retrieve a document metadata value easier

This commit is contained in:
Roberto Rosario
2014-11-11 02:58:49 -04:00
parent c6b1b5cb54
commit 742cc02305
2 changed files with 38 additions and 28 deletions

View File

@@ -6,6 +6,7 @@ from django.dispatch import receiver
from django.utils.translation import ugettext_lazy as _
from acls.api import class_permissions
from common.classes import ModelAttribute
from common.utils import encapsulate
from documents.models import Document, DocumentType
from documents.signals import post_document_type_change
@@ -15,15 +16,14 @@ from project_setup.api import register_setup
from rest_api.classes import APIEndPoint
from .api import get_metadata_string
from .classes import DocumentTypeMetadataTypeManager
from .classes import DocumentMetadataHelper, DocumentTypeMetadataTypeHelper
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,
setup_metadata_type_list)
setup_metadata_type_create, setup_metadata_type_delete,
setup_metadata_type_edit, setup_metadata_type_list)
from .models import DocumentMetadata, MetadataType
from .permissions import (PERMISSION_METADATA_DOCUMENT_ADD,
PERMISSION_METADATA_DOCUMENT_EDIT,
@@ -51,15 +51,16 @@ def document_metadata(document):
return document.document_metadata.select_related('metadata_type')
DocumentType.add_to_class('metadata_type', DocumentTypeMetadataTypeManager.factory)
DocumentType.add_to_class('metadata_type', DocumentTypeMetadataTypeHelper.constructor)
Document.add_to_class('metadata', document_metadata)
Document.add_to_class('metadata_value_of', DocumentMetadataHelper.constructor)
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], [link_spacer, metadata_multiple_add, metadata_multiple_edit, metadata_multiple_remove], 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')
register_links([Document], [link_spacer, metadata_multiple_add, metadata_multiple_edit, metadata_multiple_remove], menu_name='multi_item_links')
register_setup(setup_metadata_type_list)
@@ -75,3 +76,7 @@ register_model_list_columns(Document, [
])
APIEndPoint('metadata')
ModelAttribute(Document, 'document_metadata__metadata_type__name', label=_('Metadata type name'), type_name='query')
ModelAttribute(Document, 'document_metadata__value', label=_('Metadata type value'), type_name='query')
ModelAttribute(Document, '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'])

View File

@@ -2,29 +2,17 @@ from django.utils.translation import ugettext_lazy as _
from acls.classes import EncapsulatedObject
from .models import DocumentTypeMetadataType, MetadataType
from .models import DocumentMetadata, DocumentTypeMetadataType, MetadataType
class MetadataClass(object):
def __init__(self, dictionary):
self.dictionary = dictionary
def __getattr__(self, name):
if name in self.dictionary:
return self.dictionary.get(name)
else:
raise AttributeError(_(u'\'metadata\' object has no attribute \'%s\'') % name)
class DocumentTypeMetadataTypeManager(object):
class DocumentTypeMetadataTypeHelper(object):
@staticmethod
@property
def factory(document_type):
instance = DocumentTypeMetadataTypeManager(document_type)
return instance
def constructor(source_object):
return DocumentTypeMetadataTypeHelper(source_object)
def __init__(self, document_type):
self.document_type = document_type
def __init__(self, instance):
self.instance = instance
def filter(self, **kwargs):
return self.get_query_set(**kwargs)
@@ -34,12 +22,29 @@ class DocumentTypeMetadataTypeManager(object):
def get_query_set(self, **kwargs):
try:
return MetadataType.objects.filter(pk__in=self.document_type.documenttypemetadatatype_set.filter(**kwargs).values_list('metadata_type', flat=True))
except self.document_type.documenttypemetadatatype_set.model.DoesNotExist:
return MetadataType.objects.filter(pk__in=self.instance.documenttypemetadatatype_set.filter(**kwargs).values_list('metadata_type', flat=True))
except MetadataType.DoesNotExist:
return MetadataType.objects.none()
def add(self, metadata_type, required=False):
DocumentTypeMetadataType.objects.create(document_type=self.document_type, metadata_type=metadata_type, required=required)
DocumentTypeMetadataType.objects.create(document_type=self.instance, metadata_type=metadata_type, required=required)
def remove(self, metadata_type):
DocumentTypeMetadataType.objects.get(document_type=self.document_type, metadata_type=metadata_type).delete()
DocumentTypeMetadataType.objects.get(document_type=self.instance, metadata_type=metadata_type).delete()
class DocumentMetadataHelper(object):
@staticmethod
@property
def constructor(source_object):
return DocumentMetadataHelper(source_object)
def __init__(self, instance):
self.instance = instance
def __getattr__(self, name):
try:
return self.instance.metadata.get(metadata_type__name=name).value
except MetadataType.DoesNotExist:
raise AttributeError(_(u'\'metadata\' object has no attribute \'%s\'') % name)