from __future__ import unicode_literals import logging from kombu import Exchange, Queue from django.apps import apps from django.db.models.signals import post_save, post_delete from django.utils.translation import ugettext_lazy as _ from acls import ModelPermission from common import ( MayanAppConfig, menu_facet, menu_object, menu_sidebar, menu_tools ) from common.signals import post_upgrade from mayan.celery import app from navigation import SourceColumn from .handlers import ( unverify_key_signatures, verify_key_signatures, verify_missing_embedded_signature ) from .links import ( link_all_document_version_signature_verify, link_document_signature_list, link_document_version_signature_delete, link_document_version_signature_detached_create, link_document_version_signature_embedded_create, link_document_version_signature_details, link_document_version_signature_download, link_document_version_signature_list, link_document_version_signature_upload, ) from .permissions import ( permission_document_version_sign_detached, permission_document_version_sign_embedded, permission_document_version_signature_delete, permission_document_version_signature_download, permission_document_version_signature_upload, permission_document_version_signature_view, ) from .queues import * # NOQA logger = logging.getLogger(__name__) class DocumentSignaturesApp(MayanAppConfig): app_namespace = 'signatures' app_url = 'signatures' has_tests = True name = 'document_signatures' verbose_name = _('Document signatures') def ready(self): super(DocumentSignaturesApp, self).ready() Document = apps.get_model( app_label='documents', model_name='Document' ) DocumentVersion = apps.get_model( app_label='documents', model_name='DocumentVersion' ) Key = apps.get_model( app_label='django_gpg', model_name='Key' ) EmbeddedSignature = self.get_model('EmbeddedSignature') SignatureBaseModel = self.get_model('SignatureBaseModel') DocumentVersion.register_post_save_hook( order=1, func=EmbeddedSignature.objects.create ) DocumentVersion.register_pre_open_hook( order=1, func=EmbeddedSignature.objects.open_signed ) ModelPermission.register( model=Document, permissions=( permission_document_version_sign_detached, permission_document_version_sign_embedded, permission_document_version_signature_delete, permission_document_version_signature_download, permission_document_version_signature_view, permission_document_version_signature_upload, ) ) SourceColumn( source=SignatureBaseModel, label=_('Date'), attribute='date' ) SourceColumn( source=SignatureBaseModel, label=_('Key ID'), attribute='get_key_id' ) SourceColumn( source=SignatureBaseModel, label=_('Signature ID'), func=lambda context: context['object'].signature_id or _('None') ) SourceColumn( source=SignatureBaseModel, label=_('Type'), func=lambda context: SignatureBaseModel.objects.get_subclass( pk=context['object'].pk ).get_signature_type_display() ) app.conf.CELERY_QUEUES.append( Queue( 'signatures', Exchange('signatures'), routing_key='signatures' ), ) app.conf.CELERY_ROUTES.update( { 'document_signatures.tasks.task_verify_key_signatures': { 'queue': 'signatures' }, 'document_signatures.tasks.task_unverify_key_signatures': { 'queue': 'signatures' }, 'document_signatures.tasks.task_verify_document_version': { 'queue': 'signatures' }, 'document_signatures.tasks.task_verify_missing_embedded_signature': { 'queue': 'tools' }, } ) menu_facet.bind_links( links=(link_document_signature_list,), sources=(Document,) ) menu_facet.bind_links( links=( link_document_version_signature_list, ), position=9, sources=(DocumentVersion,) ) menu_object.bind_links( links=( link_document_version_signature_detached_create, link_document_version_signature_embedded_create ), sources=(DocumentVersion,) ) menu_object.bind_links( links=( link_document_version_signature_details, link_document_version_signature_download, link_document_version_signature_delete, ), sources=(SignatureBaseModel,) ) menu_sidebar.bind_links( links=( link_document_version_signature_upload, ), sources=(DocumentVersion,) ) menu_tools.bind_links( links=(link_all_document_version_signature_verify,) ) post_delete.connect( unverify_key_signatures, dispatch_uid='unverify_key_signatures', sender=Key ) post_upgrade.connect( verify_missing_embedded_signature, dispatch_uid='verify_missing_embedded_signature', ) post_save.connect( verify_key_signatures, dispatch_uid='verify_key_signatures', sender=Key )