from __future__ import absolute_import, unicode_literals from datetime import timedelta from django.db.models.signals import post_delete, post_migrate from django.utils.translation import ugettext_lazy as _ from kombu import Exchange, Queue 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, MissingItem, menu_facet, menu_list_facet, menu_main, menu_multi_item, menu_object, menu_secondary, menu_setup, menu_sidebar, menu_tools ) from mayan.apps.common.classes import ModelField, Template from mayan.apps.common.signals import post_initial_setup from mayan.apps.common.widgets import TwoStateWidget from mayan.apps.converter.links import link_transformation_list from mayan.apps.converter.permissions import ( permission_transformation_create, permission_transformation_delete, permission_transformation_edit, permission_transformation_view ) from mayan.apps.dashboards.dashboards import dashboard_main 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.apps.navigation import SourceColumn from mayan.apps.rest_api.fields import DynamicSerializerField from mayan.celery import app from .dashboard_widgets import ( DashboardWidgetDocumentPagesTotal, DashboardWidgetDocumentsInTrash, DashboardWidgetDocumentsNewThisMonth, DashboardWidgetDocumentsPagesNewThisMonth, DashboardWidgetDocumentsTotal, DashboardWidgetDocumentsTypesTotal ) from .events import ( event_document_create, event_document_download, event_document_new_version, event_document_properties_edit, event_document_type_change, event_document_type_created, event_document_type_edited, event_document_version_revert, event_document_view ) from .handlers import ( handler_create_default_document_type, handler_create_document_cache, handler_remove_empty_duplicates_lists, handler_scan_duplicates_for ) from .links import ( link_clear_image_cache, link_document_clear_transformations, link_document_clone_transformations, link_document_delete, link_document_document_type_edit, link_document_download, link_document_duplicates_list, link_document_edit, link_document_favorites_add, link_document_favorites_remove, link_document_list, link_document_list_deleted, link_document_list_favorites, link_document_list_recent_access, link_document_list_recent_added, link_document_multiple_clear_transformations, link_document_multiple_delete, link_document_multiple_document_type_edit, link_document_multiple_download, link_document_multiple_favorites_add, link_document_multiple_favorites_remove, link_document_multiple_restore, link_document_multiple_trash, link_document_multiple_update_page_count, link_document_page_navigation_first, link_document_page_navigation_last, link_document_page_navigation_next, link_document_page_navigation_previous, link_document_page_return, link_document_page_rotate_left, link_document_page_rotate_right, link_document_page_view, link_document_page_view_reset, link_document_page_zoom_in, link_document_page_zoom_out, link_document_pages, link_document_preview, link_document_print, link_document_properties, link_document_quick_download, link_document_restore, link_document_trash, link_document_type_create, link_document_type_delete, link_document_type_edit, link_document_type_filename_create, link_document_type_filename_delete, link_document_type_filename_edit, link_document_type_filename_list, link_document_type_list, link_document_type_setup, link_document_update_page_count, link_document_version_download, link_document_version_list, link_document_version_return_document, link_document_version_return_list, link_document_version_revert, link_document_version_view, link_duplicated_document_list, link_duplicated_document_scan, link_trash_can_empty ) from .literals import ( CHECK_DELETE_PERIOD_INTERVAL, CHECK_TRASH_PERIOD_INTERVAL, DELETE_STALE_STUBS_INTERVAL ) from .menus import menu_documents from .permissions import ( permission_document_create, permission_document_delete, permission_document_download, permission_document_edit, permission_document_new_version, permission_document_print, permission_document_properties_edit, permission_document_restore, permission_document_trash, permission_document_type_delete, permission_document_type_edit, permission_document_type_view, permission_document_version_revert, permission_document_version_view, permission_document_view ) from .queues import * # NOQA # Just import to initialize the search models from .search import document_page_search, document_search # NOQA from .signals import post_version_upload from .statistics import * # NOQA from .widgets import DocumentPageThumbnailWidget class DocumentsApp(MayanAppConfig): app_namespace = 'documents' app_url = 'documents' has_rest_api = True has_tests = True name = 'mayan.apps.documents' verbose_name = _('Documents') def ready(self): super(DocumentsApp, self).ready() from actstream import registry DeletedDocument = self.get_model('DeletedDocument') Document = self.get_model('Document') DocumentPage = self.get_model('DocumentPage') DocumentPageSearchResult = self.get_model('DocumentPageSearchResult') DocumentType = self.get_model('DocumentType') DocumentTypeFilename = self.get_model('DocumentTypeFilename') DocumentVersion = self.get_model('DocumentVersion') DuplicatedDocumentProxy = self.get_model('DuplicatedDocumentProxy') DynamicSerializerField.add_serializer( klass=Document, serializer_class='mayan.apps.documents.serializers.DocumentSerializer' ) MissingItem( label=_('Create a document type'), description=_( 'Every uploaded document must be assigned a document type, ' 'it is the basic way Mayan EDMS categorizes documents.' ), condition=lambda: not DocumentType.objects.exists(), view='documents:document_type_list' ) ModelField(Document, name='description') ModelField(Document, name='date_added') ModelField(Document, name='deleted_date_time') ModelField(Document, name='document_type__label') ModelField(Document, name='in_trash') ModelField(Document, name='is_stub') ModelField(Document, name='label') ModelField(Document, name='language') ModelField(Document, name='uuid') ModelField( Document, name='versions__checksum' ) ModelField( Document, label=_('Versions comment'), name='versions__comment' ) ModelField( Document, label=_('Versions encoding'), name='versions__encoding' ) ModelField( Document, label=_('Versions mime type'), name='versions__mimetype' ) ModelField( Document, label=_('Versions timestamp'), name='versions__timestamp' ) ModelEventType.register( model=DocumentType, event_types=( event_document_create, event_document_type_created, event_document_type_edited, ) ) ModelEventType.register( model=Document, event_types=( event_document_download, event_document_properties_edit, event_document_type_change, event_document_new_version, event_document_version_revert, event_document_view ) ) ModelPermission.register( model=Document, permissions=( permission_acl_edit, permission_acl_view, permission_document_delete, permission_document_download, permission_document_edit, permission_document_new_version, permission_document_print, permission_document_properties_edit, permission_document_restore, permission_document_trash, permission_document_version_revert, permission_document_version_view, permission_document_view, permission_events_view, permission_transformation_create, permission_transformation_delete, permission_transformation_edit, permission_transformation_view, ) ) ModelPermission.register( model=DocumentType, permissions=( permission_document_create, permission_document_type_delete, permission_document_type_edit, permission_document_type_view ) ) ModelPermission.register_proxy( source=Document, model=DocumentType, ) ModelPermission.register_inheritance( model=Document, related='document_type', ) ModelPermission.register_inheritance( model=DocumentPage, related='document_version__document', ) ModelPermission.register_inheritance( model=DocumentPageSearchResult, related='document_version__document', ) ModelPermission.register_inheritance( model=DocumentTypeFilename, related='document_type', ) ModelPermission.register_inheritance( model=DocumentVersion, related='document', ) Template( name='invalid_document', template_name='documents/invalid_document.html' ) # Document and document page thumbnail widget document_page_thumbnail_widget = DocumentPageThumbnailWidget() # Document SourceColumn( func=lambda context: document_page_thumbnail_widget.render( instance=context['object'] ), label=_('Thumbnail'), source=Document ) SourceColumn( attribute='document_type', label=_('Type'), source=Document ) SourceColumn(attribute='get_page_count', source=Document) # DocumentPage SourceColumn( func=lambda context: document_page_thumbnail_widget.render( instance=context['object'] ), label=_('Thumbnail'), source=DocumentPage ) SourceColumn( func=lambda context: document_page_thumbnail_widget.render( instance=context['object'] ), label=_('Thumbnail'), source=DocumentPageSearchResult ) SourceColumn( attribute='document_version.document.document_type', label=_('Type'), source=DocumentPageSearchResult ) # DocumentType SourceColumn( func=lambda context: context['object'].get_document_count( user=context['request'].user ), label=_('Documents'), source=DocumentType ) SourceColumn( attribute='enabled', source=DocumentTypeFilename, widget=TwoStateWidget ) # DeletedDocument SourceColumn( func=lambda context: document_page_thumbnail_widget.render( instance=context['object'] ), label=_('Thumbnail'), source=DeletedDocument ) SourceColumn( attribute='document_type', source=DeletedDocument ) SourceColumn( attribute='get_rendered_deleted_date_time', source=DeletedDocument ) # DocumentVersion SourceColumn( attribute='get_rendered_timestamp', is_identifier=True, source=DocumentVersion ) SourceColumn( func=lambda context: document_page_thumbnail_widget.render( instance=context['object'] ), label=_('Thumbnail'), source=DocumentVersion ) SourceColumn(attribute='get_page_count', source=DocumentVersion) SourceColumn(attribute='mimetype', source=DocumentVersion) SourceColumn(attribute='encoding', source=DocumentVersion) SourceColumn(attribute='comment', source=DocumentVersion) # DuplicatedDocument SourceColumn( func=lambda context: document_page_thumbnail_widget.render( instance=context['object'] ), label=_('Thumbnail'), source=DuplicatedDocumentProxy ) SourceColumn( func=lambda context: context['object'].get_duplicate_count( user=context['request'].user, ), label=_('Duplicates'), source=DuplicatedDocumentProxy ) app.conf.beat_schedule.update( { 'task_check_delete_periods': { 'task': 'mayan.apps.documents.tasks.task_check_delete_periods', 'schedule': timedelta( seconds=CHECK_DELETE_PERIOD_INTERVAL ), }, 'task_check_trash_periods': { 'task': 'mayan.apps.documents.tasks.task_check_trash_periods', 'schedule': timedelta(seconds=CHECK_TRASH_PERIOD_INTERVAL), }, 'task_delete_stubs': { 'task': 'mayan.apps.documents.tasks.task_delete_stubs', 'schedule': timedelta(seconds=DELETE_STALE_STUBS_INTERVAL), }, } ) app.conf.task_queues.extend( ( Queue( 'converter', Exchange('converter'), routing_key='converter', delivery_mode=1 ), Queue( 'documents_periodic', Exchange('documents_periodic'), routing_key='documents_periodic', delivery_mode=1 ), Queue('uploads', Exchange('uploads'), routing_key='uploads'), Queue( 'documents', Exchange('documents'), routing_key='documents' ), ) ) app.conf.task_routes.update( { 'mayan.apps.documents.tasks.task_check_delete_periods': { 'queue': 'documents_periodic' }, 'mayan.apps.documents.tasks.task_check_trash_periods': { 'queue': 'documents_periodic' }, 'mayan.apps.documents.tasks.task_clean_empty_duplicate_lists': { 'queue': 'documents' }, 'mayan.apps.documents.tasks.task_clear_image_cache': { 'queue': 'tools' }, 'mayan.apps.documents.tasks.task_delete_document': { 'queue': 'documents' }, 'mayan.apps.documents.tasks.task_delete_stubs': { 'queue': 'documents_periodic' }, 'mayan.apps.documents.tasks.task_generate_document_page_image': { 'queue': 'converter' }, 'mayan.apps.documents.tasks.task_scan_duplicates_all': { 'queue': 'tools' }, 'mayan.apps.documents.tasks.task_scan_duplicates_for': { 'queue': 'uploads' }, 'mayan.apps.documents.tasks.task_update_page_count': { 'queue': 'uploads' }, 'mayan.apps.documents.tasks.task_upload_new_version': { 'queue': 'uploads' }, } ) dashboard_main.add_widget( widget=DashboardWidgetDocumentsTotal, order=0 ) dashboard_main.add_widget( widget=DashboardWidgetDocumentPagesTotal, order=1 ) dashboard_main.add_widget( widget=DashboardWidgetDocumentsInTrash, order=2 ) dashboard_main.add_widget( widget=DashboardWidgetDocumentsTypesTotal, order=3 ) dashboard_main.add_widget( widget=DashboardWidgetDocumentsNewThisMonth, order=4 ) dashboard_main.add_widget( widget=DashboardWidgetDocumentsPagesNewThisMonth, order=5 ) menu_documents.bind_links( links=( link_document_list_recent_access, link_document_list_recent_added, link_document_list_favorites, link_document_list, link_document_list_deleted, link_duplicated_document_list, ) ) menu_main.bind_links(links=(menu_documents,), position=0) menu_setup.bind_links(links=(link_document_type_setup,)) menu_tools.bind_links( links=(link_clear_image_cache, link_duplicated_document_scan) ) # Document type links menu_list_facet.bind_links( links=( link_document_type_filename_list, link_acl_list, link_object_event_types_user_subcriptions_list, link_events_for_object, ), sources=(DocumentType,) ) menu_object.bind_links( links=( link_document_type_edit, link_document_type_delete, ), sources=(DocumentType,) ) menu_object.bind_links( links=( link_document_type_filename_edit, link_document_type_filename_delete ), sources=(DocumentTypeFilename,) ) menu_secondary.bind_links( links=(link_document_type_list, link_document_type_create), sources=( DocumentType, 'documents:document_type_create', 'documents:document_type_list' ) ) menu_sidebar.bind_links( links=(link_document_type_filename_create,), sources=( DocumentTypeFilename, 'documents:document_type_filename_list', 'documents:document_type_filename_create' ) ) menu_sidebar.bind_links( links=(link_trash_can_empty,), sources=( 'documents:document_list_deleted', 'documents:trash_can_empty' ) ) # Document object links menu_object.bind_links( links=( link_document_favorites_add, link_document_favorites_remove, link_document_edit, link_document_document_type_edit, link_document_print, link_document_trash, link_document_quick_download, link_document_download, link_document_clear_transformations, link_document_clone_transformations, link_document_update_page_count, ), sources=(Document,) ) menu_object.bind_links( links=(link_document_restore, link_document_delete), sources=(DeletedDocument,) ) # Document facet links menu_facet.bind_links( links=(link_document_duplicates_list, link_acl_list,), sources=(Document,) ) menu_facet.bind_links( links=(link_document_preview,), sources=(Document,), position=0 ) menu_facet.bind_links( links=(link_document_properties,), sources=(Document,), position=2 ) menu_facet.bind_links( links=( link_events_for_object, link_object_event_types_user_subcriptions_list, link_document_version_list, ), sources=(Document,), position=2 ) menu_facet.bind_links(links=(link_document_pages,), sources=(Document,)) # Document actions menu_object.bind_links( links=( link_document_version_revert, link_document_version_download ), sources=(DocumentVersion,) ) menu_multi_item.bind_links( links=( link_document_multiple_favorites_add, link_document_multiple_favorites_remove, link_document_multiple_clear_transformations, link_document_multiple_trash, link_document_multiple_download, link_document_multiple_update_page_count, link_document_multiple_document_type_edit, ), sources=(Document,) ) menu_multi_item.bind_links( links=( link_document_multiple_restore, link_document_multiple_delete ), sources=(DeletedDocument,) ) # Document pages menu_facet.add_unsorted_source(source=DocumentPage) menu_facet.bind_links( links=( link_document_page_rotate_left, link_document_page_rotate_right, link_document_page_zoom_in, link_document_page_zoom_out, link_document_page_view_reset ), sources=('documents:document_page_view',) ) menu_facet.bind_links( links=(link_document_page_return, link_document_page_view), sources=(DocumentPage,) ) menu_facet.bind_links( links=( link_document_page_navigation_first, link_document_page_navigation_previous, link_document_page_navigation_next, link_document_page_navigation_last, link_transformation_list ), sources=(DocumentPage,) ) menu_object.bind_links( links=(link_transformation_list,), sources=(DocumentPage,) ) # Document versions menu_facet.bind_links( links=( link_document_version_return_document, link_document_version_return_list ), sources=(DocumentVersion,) ) menu_facet.bind_links( links=(link_document_version_view,), sources=(DocumentVersion,) ) menu_object.bind_links( links=(link_document_version_view,), sources=(DocumentVersion,) ) post_delete.connect( dispatch_uid='documents_handler_remove_empty_duplicates_lists', receiver=handler_remove_empty_duplicates_lists, sender=Document, ) post_initial_setup.connect( dispatch_uid='documents_handler_create_default_document_type', receiver=handler_create_default_document_type, ) post_migrate.connect( dispatch_uid='documents_handler_create_document_cache', receiver=handler_create_document_cache, ) post_version_upload.connect( dispatch_uid='documents_handler_scan_duplicates_for', receiver=handler_scan_duplicates_for, ) registry.register(DeletedDocument) registry.register(Document) registry.register(DocumentType) registry.register(DocumentVersion)