Instead of inserting the path of the apps into the Python app, the apps are now referenced by their full import path. This app name claves with external or native Python libraries. Example: Mayan statistics app vs. Python new statistics library. Every app reference is now prepended with 'mayan.apps'. Existing config.yml files need to be updated manually. Signed-off-by: Roberto Rosario <roberto.rosario.gonzalez@gmail.com>
280 lines
9.5 KiB
Python
280 lines
9.5 KiB
Python
from __future__ import absolute_import, unicode_literals
|
|
|
|
import logging
|
|
|
|
from kombu import Exchange, Queue
|
|
|
|
from django.apps import apps
|
|
from django.db.models.signals import post_delete, post_save
|
|
from django.utils.translation import ugettext_lazy as _
|
|
|
|
from mayan.apps.acls import ModelPermission
|
|
from mayan.apps.acls.links import link_acl_list
|
|
from mayan.apps.acls.permissions import permission_acl_edit, permission_acl_view
|
|
from mayan.apps.common import (
|
|
MayanAppConfig, menu_facet, menu_list_facet, menu_multi_item, menu_object,
|
|
menu_secondary, menu_setup, menu_sidebar
|
|
)
|
|
from mayan.apps.common.classes import ModelAttribute, ModelField
|
|
from mayan.apps.common.widgets import TwoStateWidget
|
|
from mayan.apps.documents.search import document_page_search, document_search
|
|
from mayan.apps.documents.signals import post_document_type_change
|
|
from mayan.apps.events import ModelEventType
|
|
from mayan.apps.events.links import (
|
|
link_events_for_object, link_object_event_types_user_subcriptions_list,
|
|
)
|
|
from mayan.apps.events.permissions import permission_events_view
|
|
from mayan.celery import app
|
|
from mayan.apps.navigation import SourceColumn
|
|
|
|
from .classes import DocumentMetadataHelper
|
|
from .events import (
|
|
event_document_metadata_added, event_document_metadata_edited,
|
|
event_document_metadata_removed, event_metadata_type_edited,
|
|
event_metadata_type_relationship
|
|
)
|
|
from .handlers import (
|
|
handler_index_document, post_document_type_metadata_type_add,
|
|
post_document_type_metadata_type_delete,
|
|
post_document_type_change_metadata
|
|
)
|
|
from .links import (
|
|
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_types, link_setup_metadata_type_create,
|
|
link_setup_metadata_type_delete, link_setup_metadata_type_document_types,
|
|
link_setup_metadata_type_edit, link_setup_metadata_type_list,
|
|
)
|
|
from .permissions import (
|
|
permission_metadata_document_add, permission_metadata_document_edit,
|
|
permission_metadata_document_remove, permission_metadata_document_view,
|
|
permission_metadata_type_delete, permission_metadata_type_edit,
|
|
permission_metadata_type_view
|
|
)
|
|
|
|
from .queues import * # NOQA
|
|
from .search import metadata_type_search # NOQA
|
|
from .widgets import get_metadata_string
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
class MetadataApp(MayanAppConfig):
|
|
app_namespace = 'metadata'
|
|
app_url = 'metadata'
|
|
has_rest_api = True
|
|
has_tests = True
|
|
name = 'mayan.apps.metadata'
|
|
verbose_name = _('Metadata')
|
|
|
|
def ready(self):
|
|
super(MetadataApp, self).ready()
|
|
from actstream import registry
|
|
|
|
from .wizard_steps import WizardStepMetadata # NOQA
|
|
|
|
Document = apps.get_model(
|
|
app_label='documents', model_name='Document'
|
|
)
|
|
DocumentPageResult = apps.get_model(
|
|
app_label='documents', model_name='DocumentPageResult'
|
|
)
|
|
|
|
DocumentType = apps.get_model(
|
|
app_label='documents', model_name='DocumentType'
|
|
)
|
|
|
|
DocumentMetadata = self.get_model('DocumentMetadata')
|
|
DocumentTypeMetadataType = self.get_model('DocumentTypeMetadataType')
|
|
MetadataType = self.get_model('MetadataType')
|
|
|
|
Document.add_to_class(
|
|
'metadata_value_of', DocumentMetadataHelper.constructor
|
|
)
|
|
|
|
ModelAttribute(
|
|
Document, 'metadata_value_of',
|
|
description=_(
|
|
'Return the value of a specific document metadata'
|
|
),
|
|
)
|
|
|
|
ModelField(
|
|
Document, 'metadata__metadata_type__name',
|
|
label=_('Metadata type name')
|
|
)
|
|
ModelField(
|
|
Document, 'metadata__value', label=_('Metadata type value'),
|
|
)
|
|
|
|
ModelEventType.register(
|
|
model=Document, event_types=(
|
|
event_document_metadata_added,
|
|
event_document_metadata_edited,
|
|
event_document_metadata_removed,
|
|
)
|
|
)
|
|
|
|
ModelEventType.register(
|
|
model=MetadataType, event_types=(
|
|
event_document_metadata_added,
|
|
event_document_metadata_edited,
|
|
event_document_metadata_removed,
|
|
event_metadata_type_edited,
|
|
event_metadata_type_relationship,
|
|
)
|
|
)
|
|
|
|
ModelEventType.register(
|
|
model=DocumentType, event_types=(
|
|
event_metadata_type_relationship,
|
|
)
|
|
)
|
|
|
|
ModelPermission.register(
|
|
model=Document, permissions=(
|
|
permission_metadata_document_add,
|
|
permission_metadata_document_edit,
|
|
permission_metadata_document_remove,
|
|
permission_metadata_document_view,
|
|
)
|
|
)
|
|
ModelPermission.register(
|
|
model=MetadataType, permissions=(
|
|
permission_acl_edit, permission_acl_view,
|
|
permission_events_view, permission_metadata_type_delete,
|
|
permission_metadata_type_edit, permission_metadata_type_view
|
|
)
|
|
)
|
|
|
|
SourceColumn(
|
|
source=Document, label=_('Metadata'),
|
|
func=lambda context: get_metadata_string(context['object'])
|
|
)
|
|
|
|
SourceColumn(
|
|
source=DocumentPageResult, label=_('Metadata'),
|
|
func=lambda context: get_metadata_string(
|
|
context['object'].document
|
|
)
|
|
)
|
|
|
|
SourceColumn(
|
|
source=DocumentMetadata, label=_('Value'),
|
|
attribute='value'
|
|
)
|
|
SourceColumn(
|
|
source=DocumentMetadata, label=_('Required'),
|
|
func=lambda context: TwoStateWidget(
|
|
state=context['object'].is_required
|
|
).render()
|
|
)
|
|
|
|
app.conf.CELERY_QUEUES.append(
|
|
Queue('metadata', Exchange('metadata'), routing_key='metadata'),
|
|
)
|
|
|
|
app.conf.CELERY_ROUTES.update(
|
|
{
|
|
'mayan.apps.metadata.tasks.task_remove_metadata_type': {
|
|
'queue': 'metadata'
|
|
},
|
|
'mayan.apps.metadata.tasks.task_add_required_metadata_type': {
|
|
'queue': 'metadata'
|
|
},
|
|
}
|
|
)
|
|
|
|
document_search.add_model_field(
|
|
field='metadata__metadata_type__name', label=_('Metadata type')
|
|
)
|
|
document_search.add_model_field(
|
|
field='metadata__value', label=_('Metadata value')
|
|
)
|
|
|
|
document_page_search.add_model_field(
|
|
field='document_version__document__metadata__metadata_type__name',
|
|
label=_('Metadata type')
|
|
)
|
|
document_page_search.add_model_field(
|
|
field='document_version__document__metadata__value',
|
|
label=_('Metadata value')
|
|
)
|
|
|
|
menu_facet.bind_links(links=(link_metadata_view,), sources=(Document,))
|
|
menu_list_facet.bind_links(
|
|
links=(
|
|
link_setup_document_type_metadata_types,
|
|
), sources=(DocumentType,)
|
|
)
|
|
menu_list_facet.bind_links(
|
|
links=(
|
|
link_acl_list, link_setup_metadata_type_document_types,
|
|
link_object_event_types_user_subcriptions_list,
|
|
link_events_for_object,
|
|
), sources=(MetadataType,)
|
|
)
|
|
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_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'
|
|
)
|
|
)
|
|
|
|
post_delete.connect(
|
|
post_document_type_metadata_type_delete,
|
|
dispatch_uid='metadata_post_document_type_metadata_type_delete',
|
|
sender=DocumentTypeMetadataType
|
|
)
|
|
post_document_type_change.connect(
|
|
post_document_type_change_metadata,
|
|
dispatch_uid='metadata_post_document_type_change_metadata',
|
|
sender=Document
|
|
)
|
|
post_save.connect(
|
|
post_document_type_metadata_type_add,
|
|
dispatch_uid='metadata_post_document_type_metadata_type_add',
|
|
sender=DocumentTypeMetadataType
|
|
)
|
|
|
|
# Index updating
|
|
|
|
post_delete.connect(
|
|
handler_index_document,
|
|
dispatch_uid='metadata_handler_index_document_delete',
|
|
sender=DocumentMetadata
|
|
)
|
|
post_save.connect(
|
|
handler_index_document,
|
|
dispatch_uid='metadata_handler_index_document_save',
|
|
sender=DocumentMetadata
|
|
)
|
|
|
|
registry.register(MetadataType)
|
|
registry.register(DocumentTypeMetadataType)
|