Beispiel #1
0
    def ready(self):
        super(CheckoutsApp, self).ready()

        APIEndPoint(app=self, version_string='1')

        Document = apps.get_model(app_label='documents', model_name='Document')

        DocumentCheckout = self.get_model('DocumentCheckout')

        Document.add_to_class('check_in',
                              lambda document, user=None: DocumentCheckout.
                              objects.check_in_document(document, user))
        Document.add_to_class(
            'checkout_info', lambda document: DocumentCheckout.objects.
            document_checkout_info(document))
        Document.add_to_class(
            'checkout_state', lambda document: DocumentCheckout.objects.
            document_checkout_state(document))
        Document.add_to_class(
            'is_checked_out', lambda document: DocumentCheckout.objects.
            is_document_checked_out(document))

        ModelPermission.register(
            model=Document,
            permissions=(permission_document_checkout,
                         permission_document_checkin,
                         permission_document_checkin_override,
                         permission_document_checkout_detail_view))

        app.conf.CELERYBEAT_SCHEDULE.update({
            'task_check_expired_check_outs': {
                'task': 'checkouts.tasks.task_check_expired_check_outs',
                'schedule':
                timedelta(seconds=CHECK_EXPIRED_CHECK_OUTS_INTERVAL),
            },
        })

        app.conf.CELERY_QUEUES.append(
            Queue('checkouts_periodic',
                  Exchange('checkouts_periodic'),
                  routing_key='checkouts_periodic',
                  delivery_mode=1), )

        app.conf.CELERY_ROUTES.update({
            'checkouts.tasks.task_check_expired_check_outs': {
                'queue': 'checkouts_periodic'
            },
        })

        menu_facet.bind_links(links=(link_checkout_info, ),
                              sources=(Document, ))
        menu_main.bind_links(links=(link_checkout_list, ))
        menu_sidebar.bind_links(links=(link_checkout_document,
                                       link_checkin_document),
                                sources=('checkouts:checkout_info',
                                         'checkouts:checkout_document',
                                         'checkouts:checkin_document'))
Beispiel #2
0
    def ready(self):
        super(EventsApp, self).ready()
        Action = apps.get_model(app_label='actstream', model_name='Action')
        Notification = self.get_model(model_name='Notification')
        StoredEventType = self.get_model(model_name='StoredEventType')
        User = get_user_model()

        SourceColumn(source=Action,
                     label=_('Timestamp'),
                     attribute='timestamp')
        SourceColumn(source=Action,
                     label=_('Actor'),
                     func=lambda context: event_user_link(context['object']))
        SourceColumn(source=Action,
                     label=_('Event'),
                     func=lambda context: event_type_link(context['object']))
        SourceColumn(source=Action,
                     label=_('Action object'),
                     func=lambda context: event_object_link(
                         entry=context['object'], attribute='action_object'))

        SourceColumn(source=StoredEventType,
                     label=_('Namespace'),
                     attribute='namespace')
        SourceColumn(source=StoredEventType,
                     label=_('Label'),
                     attribute='label')

        SourceColumn(source=Notification,
                     label=_('Timestamp'),
                     attribute='action.timestamp')
        SourceColumn(source=Notification,
                     label=_('Actor'),
                     attribute='action.actor')
        SourceColumn(
            source=Notification,
            label=_('Event'),
            func=lambda context: event_type_link(context['object'].action))
        SourceColumn(
            source=Notification,
            label=_('Target'),
            func=lambda context: event_object_link(context['object'].action))
        SourceColumn(source=Notification,
                     label=_('Seen'),
                     func=lambda context: two_state_template(state=context[
                         'object'].read))

        menu_main.bind_links(links=(link_user_notifications_list, ),
                             position=99)
        menu_object.bind_links(links=(link_notification_mark_read, ),
                               sources=(Notification, ))
        menu_object.bind_links(links=(link_user_events, ), sources=(User, ))
        menu_secondary.bind_links(links=(link_notification_mark_read_all, ),
                                  sources=('events:user_notifications_list', ))
        menu_tools.bind_links(links=(link_events_list, ))
        menu_user.bind_links(links=(link_event_types_subscriptions_list, ))
Beispiel #3
0
    def ready(self):
        super(FoldersApp, self).ready()

        Document = apps.get_model(app_label='documents', model_name='Document')

        DocumentFolder = self.get_model('DocumentFolder')
        Folder = self.get_model('Folder')

        APIEndPoint(app=self, version_string='1')

        Document.add_to_class(
            'document_folders',
            lambda document: DocumentFolder.objects.filter(documents=document))

        ModelPermission.register(
            model=Document,
            permissions=(permission_folder_add_document,
                         permission_folder_remove_document))

        ModelPermission.register(
            model=Folder,
            permissions=(permission_acl_edit, permission_acl_view,
                         permission_folder_delete, permission_folder_edit,
                         permission_folder_view))

        SourceColumn(source=Folder,
                     label=_('Created'),
                     attribute='datetime_created')
        SourceColumn(source=Folder,
                     label=_('Documents'),
                     func=lambda context: context['object'].get_document_count(
                         user=context['request'].user))

        menu_facet.bind_links(links=(link_document_folder_list, ),
                              sources=(Document, ))

        menu_folders.bind_links(links=(link_folder_list, link_folder_create))

        menu_main.bind_links(links=(menu_folders, ), position=98)
        menu_multi_item.bind_links(
            links=(link_folder_add_multiple_documents,
                   link_multiple_document_folder_remove),
            sources=(Document, ))
        menu_object.bind_links(links=(link_folder_view, ),
                               sources=(DocumentFolder, ))
        menu_object.bind_links(links=(link_folder_view, link_folder_edit,
                                      link_acl_list, link_folder_delete),
                               sources=(Folder, ))
        menu_sidebar.bind_links(links=(link_folder_add_document,
                                       link_document_folder_remove),
                                sources=('folders:document_folder_list',
                                         'folders:folder_add_document',
                                         'folders:document_folder_remove'))
Beispiel #4
0
    def ready(self):
        super(CabinetsApp, self).ready()

        Document = apps.get_model(app_label='documents', model_name='Document')

        DocumentCabinet = self.get_model('DocumentCabinet')
        Cabinet = self.get_model('Cabinet')

        APIEndPoint(app=self, version_string='1')

        Document.add_to_class(
            'document_cabinets', lambda document: DocumentCabinet.objects.
            filter(documents=document))

        ModelPermission.register(
            model=Document,
            permissions=(permission_cabinet_add_document,
                         permission_cabinet_remove_document))

        ModelPermission.register(
            model=Cabinet,
            permissions=(permission_acl_edit, permission_acl_view,
                         permission_cabinet_delete, permission_cabinet_edit,
                         permission_cabinet_view))

        menu_facet.bind_links(links=(link_document_cabinet_list, ),
                              sources=(Document, ))

        menu_cabinets.bind_links(links=(link_cabinet_list,
                                        link_cabinet_create))

        menu_main.bind_links(links=(menu_cabinets, ), position=98)

        menu_multi_item.bind_links(
            links=(link_cabinet_add_multiple_documents,
                   link_multiple_document_cabinet_remove),
            sources=(Document, ))
        menu_object.bind_links(links=(link_cabinet_view, ),
                               sources=(DocumentCabinet, ))
        menu_object.bind_links(links=(link_cabinet_view, link_cabinet_edit,
                                      link_custom_acl_list,
                                      link_cabinet_delete),
                               sources=(Cabinet, ))
        menu_sidebar.bind_links(links=(link_cabinet_child_add, ),
                                sources=(Cabinet, ))
        menu_sidebar.bind_links(links=(link_cabinet_add_document,
                                       link_document_cabinet_remove),
                                sources=('cabinets:document_cabinet_list',
                                         'cabinets:cabinet_add_document',
                                         'cabinets:document_cabinet_remove'))
Beispiel #5
0
    def ready(self):
        super(DocumentIndexingApp, self).ready()

        Document = apps.get_model(app_label='documents', model_name='Document')

        DocumentType = apps.get_model(app_label='documents',
                                      model_name='DocumentType')

        DocumentMetadata = apps.get_model(app_label='metadata',
                                          model_name='DocumentMetadata')

        DocumentIndexInstanceNode = self.get_model('DocumentIndexInstanceNode')

        Index = self.get_model('Index')
        IndexInstance = self.get_model('IndexInstance')
        IndexInstanceNode = self.get_model('IndexInstanceNode')
        IndexTemplateNode = self.get_model('IndexTemplateNode')

        APIEndPoint(app=self, version_string='1')

        ModelPermission.register(model=Index,
                                 permissions=(
                                     permission_acl_edit,
                                     permission_acl_view,
                                     permission_document_indexing_create,
                                     permission_document_indexing_delete,
                                     permission_document_indexing_edit,
                                     permission_document_indexing_view,
                                 ))

        Package(label='Django MPTT',
                license_text='''
Django MPTT
-----------

Copyright (c) 2007, Jonathan Buchanan

Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
the Software, and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
        ''')

        Package(label='djangorestframework-recursive',
                license_text='''
Copyright (c) 2015, Warren Jin <*****@*****.**>

Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted, provided that the above
copyright notice and this permission notice appear in all copies.

THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
        ''')

        SourceColumn(source=Index, label=_('Label'), attribute='label')
        SourceColumn(source=Index, label=_('Slug'), attribute='slug')
        SourceColumn(
            source=Index,
            label=_('Enabled'),
            func=lambda context: two_state_template(context['object'].enabled))

        SourceColumn(source=IndexInstance,
                     label=_('Items'),
                     func=lambda context: context['object'].get_item_count(
                         user=context['request'].user))
        SourceColumn(source=IndexInstance,
                     label=_('Document types'),
                     attribute='get_document_types_names')

        SourceColumn(source=IndexTemplateNode,
                     label=_('Level'),
                     func=lambda context: node_level(context['object']))
        SourceColumn(
            source=IndexTemplateNode,
            label=_('Enabled'),
            func=lambda context: two_state_template(context['object'].enabled))
        SourceColumn(source=IndexTemplateNode,
                     label=_('Has document links?'),
                     func=lambda context: two_state_template(context['object'].
                                                             link_documents))

        SourceColumn(
            source=IndexInstanceNode,
            label=_('Node'),
            func=lambda context: index_instance_item_link(context['object']))
        SourceColumn(source=IndexInstanceNode,
                     label=_('Items'),
                     func=lambda context: context['object'].get_item_count(
                         user=context['request'].user))

        SourceColumn(source=DocumentIndexInstanceNode,
                     label=_('Node'),
                     func=lambda context: get_instance_link(
                         index_instance_node=context['object'], ))
        SourceColumn(source=DocumentIndexInstanceNode,
                     label=_('Items'),
                     func=lambda context: context['object'].get_item_count(
                         user=context['request'].user))

        app.conf.CELERY_QUEUES.append(
            Queue('indexing', Exchange('indexing'), routing_key='indexing'), )

        app.conf.CELERY_ROUTES.update({
            'document_indexing.tasks.task_delete_empty_index_nodes': {
                'queue': 'indexing'
            },
            'document_indexing.tasks.task_index_document': {
                'queue': 'indexing'
            },
            'document_indexing.tasks.task_do_rebuild_all_indexes': {
                'queue': 'tools'
            },
        })

        menu_facet.bind_links(links=(link_document_index_list, ),
                              sources=(Document, ))
        menu_object.bind_links(links=(link_index_setup_edit,
                                      link_index_setup_view,
                                      link_index_setup_document_types,
                                      link_acl_list, link_index_setup_delete),
                               sources=(Index, ))
        menu_object.bind_links(links=(link_template_node_create,
                                      link_template_node_edit,
                                      link_template_node_delete),
                               sources=(IndexTemplateNode, ))
        menu_main.bind_links(links=(link_index_main_menu, ))
        menu_secondary.bind_links(links=(link_index_setup_list,
                                         link_index_setup_create),
                                  sources=(Index, 'indexing:index_setup_list',
                                           'indexing:index_setup_create'))
        menu_setup.bind_links(links=(link_index_setup, ))
        menu_tools.bind_links(links=(link_rebuild_index_instances, ))

        post_delete.connect(document_index_delete,
                            dispatch_uid='document_index_delete',
                            sender=Document)
        post_delete.connect(document_metadata_index_post_delete,
                            dispatch_uid='document_metadata_index_post_delete',
                            sender=DocumentMetadata)
        post_document_created.connect(
            document_created_index_update,
            dispatch_uid='document_created_index_update',
            sender=Document)
        post_initial_document_type.connect(
            create_default_document_index,
            dispatch_uid='create_default_document_index',
            sender=DocumentType)
        post_save.connect(document_metadata_index_update,
                          dispatch_uid='document_metadata_index_update',
                          sender=DocumentMetadata)
Beispiel #6
0
    def ready(self):
        super(DocumentStatesApp, self).ready()

        Action = apps.get_model(
            app_label='actstream', model_name='Action'
        )
        Document = apps.get_model(
            app_label='documents', model_name='Document'
        )
        ErrorLogEntry = apps.get_model(
            app_label='common', model_name='ErrorLogEntry'
        )

        Workflow = self.get_model('Workflow')
        WorkflowInstance = self.get_model('WorkflowInstance')
        WorkflowInstanceLogEntry = self.get_model('WorkflowInstanceLogEntry')
        WorkflowRuntimeProxy = self.get_model('WorkflowRuntimeProxy')
        WorkflowState = self.get_model('WorkflowState')
        WorkflowStateAction = self.get_model('WorkflowStateAction')
        WorkflowStateRuntimeProxy = self.get_model('WorkflowStateRuntimeProxy')
        WorkflowTransition = self.get_model('WorkflowTransition')
        WorkflowTransitionTriggerEvent = self.get_model(
            'WorkflowTransitionTriggerEvent'
        )

        Document.add_to_class(
            'workflow', DocumentStateHelper.constructor
        )

        ErrorLogEntry.objects.register(model=WorkflowStateAction)

        WorkflowAction.initialize()

        ModelAttribute(
            model=Document,
            name='workflow.< workflow internal name >.get_current_state',
            label=_('Current state of a workflow'), description=_(
                'Return the current state of the selected workflow'
            )
        )
        ModelAttribute(
            model=Document,
            name='workflow.< workflow internal name >.get_current_state.completion',
            label=_('Current state of a workflow'), description=_(
                'Return the completion value of the current state of the '
                'selected workflow'
            )
        )

        ModelPermission.register(
            model=Document, permissions=(permission_workflow_view,)
        )
        ModelPermission.register(
            model=Workflow, permissions=(
                permission_error_log_view, permission_workflow_delete,
                permission_workflow_edit, permission_workflow_transition,
                permission_workflow_view,
            )
        )

        ModelPermission.register_inheritance(
            model=WorkflowInstance, related='workflow',
        )
        ModelPermission.register_inheritance(
            model=WorkflowInstanceLogEntry,
            related='workflow_instance__workflow',
        )
        ModelPermission.register(
            model=WorkflowTransition,
            permissions=(permission_workflow_transition,)
        )

        ModelPermission.register_inheritance(
            model=WorkflowState, related='workflow',
        )
        ModelPermission.register_inheritance(
            model=WorkflowStateAction, related='state__workflow',
        )
        ModelPermission.register_inheritance(
            model=WorkflowTransition, related='workflow',
        )
        ModelPermission.register_inheritance(
            model=WorkflowTransitionTriggerEvent,
            related='transition__workflow',
        )

        SourceColumn(
            source=Workflow, label=_('Label'), attribute='label'
        )
        SourceColumn(
            source=Workflow, label=_('Internal name'),
            attribute='internal_name'
        )
        SourceColumn(
            source=Workflow, label=_('Initial state'),
            func=lambda context: context['object'].get_initial_state() or _('None')
        )

        SourceColumn(
            source=WorkflowInstance, label=_('Current state'),
            attribute='get_current_state'
        )
        SourceColumn(
            source=WorkflowInstance, label=_('User'),
            func=lambda context: getattr(
                context['object'].get_last_log_entry(), 'user', _('None')
            )
        )
        SourceColumn(
            source=WorkflowInstance, label=_('Last transition'),
            attribute='get_last_transition'
        )
        SourceColumn(
            source=WorkflowInstance, label=_('Date and time'),
            func=lambda context: getattr(
                context['object'].get_last_log_entry(), 'datetime', _('None')
            )
        )
        SourceColumn(
            source=WorkflowInstance, label=_('Completion'),
            func=lambda context: getattr(
                context['object'].get_current_state(), 'completion', _('None')
            )
        )

        SourceColumn(
            source=WorkflowInstanceLogEntry, label=_('Date and time'),
            attribute='datetime'
        )
        SourceColumn(
            source=WorkflowInstanceLogEntry, label=_('User'), attribute='user'
        )
        SourceColumn(
            source=WorkflowInstanceLogEntry, label=_('Transition'),
            attribute='transition'
        )
        SourceColumn(
            source=WorkflowInstanceLogEntry, label=_('Comment'),
            attribute='comment'
        )

        SourceColumn(
            source=WorkflowState, label=_('Is initial state?'),
            func=lambda context: TwoStateWidget(
                state=context['object'].initial
            ).render()
        )
        SourceColumn(
            source=WorkflowState, label=_('Completion'), attribute='completion'
        )

        SourceColumn(
            source=WorkflowStateAction, label=_('Label'), attribute='label'
        )
        SourceColumn(
            source=WorkflowStateAction, label=_('Enabled?'),
            func=lambda context: TwoStateWidget(
                state=context['object'].enabled
            ).render()
        )
        SourceColumn(
            source=WorkflowStateAction, label=_('When?'),
            attribute='get_when_display'
        )
        SourceColumn(
            source=WorkflowStateAction, label=_('Action type'),
            attribute='get_class_label'
        )

        SourceColumn(
            source=WorkflowTransition, label=_('Origin state'),
            attribute='origin_state'
        )
        SourceColumn(
            source=WorkflowTransition, label=_('Destination state'),
            attribute='destination_state'
        )
        SourceColumn(
            source=WorkflowTransition, label=_('Triggers'),
            func=lambda context: widget_transition_events(
                transition=context['object']
            )
        )

        app.conf.CELERY_QUEUES.extend(
            (
                Queue(
                    'document_states', Exchange('document_states'),
                    routing_key='document_states'
                ),
            )
        )

        app.conf.CELERY_ROUTES.update(
            {
                'document_states.tasks.task_launch_all_workflows': {
                    'queue': 'document_states'
                },
            }
        )

        menu_facet.bind_links(
            links=(link_document_workflow_instance_list,), sources=(Document,)
        )
        menu_main.bind_links(links=(link_workflow_list,), position=10)
        menu_object.bind_links(
            links=(
                link_setup_workflow_states, link_setup_workflow_transitions,
                link_setup_workflow_document_types, link_setup_workflow_edit,
                link_acl_list, link_workflow_preview,
                link_setup_workflow_delete
            ), sources=(Workflow,)
        )
        menu_object.bind_links(
            links=(
                link_setup_workflow_state_edit,
                link_setup_workflow_state_action_list,
                link_setup_workflow_state_delete
            ), sources=(WorkflowState,)
        )
        menu_object.bind_links(
            links=(
                link_setup_workflow_transition_edit,
                link_workflow_instance_transition_events, link_acl_list,
                link_setup_workflow_transition_delete
            ), sources=(WorkflowTransition,)
        )
        menu_object.bind_links(
            links=(
                link_workflow_instance_detail,
                link_workflow_instance_transition
            ), sources=(WorkflowInstance,)
        )
        menu_object.bind_links(
            links=(
                link_workflow_document_list, link_workflow_state_list,
            ), sources=(WorkflowRuntimeProxy,)
        )
        menu_object.bind_links(
            links=(
                link_workflow_state_document_list,
            ), sources=(WorkflowStateRuntimeProxy,)
        )
        menu_object.bind_links(
            links=(
                link_setup_workflow_state_action_edit,
                link_object_error_list,
                link_setup_workflow_state_action_delete,
            ), sources=(WorkflowStateAction,)
        )

        menu_secondary.bind_links(
            links=(link_setup_workflow_list, link_setup_workflow_create),
            sources=(
                Workflow, 'document_states:setup_workflow_create',
                'document_states:setup_workflow_list'
            )
        )
        menu_secondary.bind_links(
            links=(link_workflow_list,),
            sources=(
                WorkflowRuntimeProxy,
            )
        )
        menu_secondary.bind_links(
            links=(link_setup_workflow_state_action_selection,),
            sources=(
                WorkflowState,
            )
        )
        menu_setup.bind_links(links=(link_setup_workflow_list,))
        menu_sidebar.bind_links(
            links=(
                link_setup_workflow_state_create,
                link_setup_workflow_transition_create
            ), sources=(Workflow,)
        )
        menu_tools.bind_links(links=(link_tool_launch_all_workflows,))

        post_save.connect(
            launch_workflow, dispatch_uid='launch_workflow', sender=Document
        )

        # Index updating

        post_save.connect(
            handler_index_document,
            dispatch_uid='handler_index_document_save',
            sender=WorkflowInstanceLogEntry
        )
        post_save.connect(
            handler_trigger_transition,
            dispatch_uid='document_states_handler_trigger_transition',
            sender=Action
        )
Beispiel #7
0
    def ready(self):
        super(DocumentsApp, self).ready()
        from actstream import registry

        APIEndPoint(app=self, version_string='1')

        DeletedDocument = self.get_model('DeletedDocument')
        Document = self.get_model('Document')
        DocumentPage = self.get_model('DocumentPage')
        DocumentPageResult = self.get_model('DocumentPageResult')
        DocumentType = self.get_model('DocumentType')
        DocumentTypeFilename = self.get_model('DocumentTypeFilename')
        DocumentVersion = self.get_model('DocumentVersion')
        DuplicatedDocument = self.get_model('DuplicatedDocument')

        Collection(
            label=_('Recent documents'), link=link_document_list_recent,
            order=1
        )
        Collection(
            label=_('Document types'), model=DocumentType,
            icon='fa fa-book'
        )
        Collection(
            label=_('All documents'), link=link_document_list, order=99
        )
        Collection(
            label=_('Trash'), link=link_document_list_deleted, order=100
        )

        DynamicSerializerField.add_serializer(
            klass=Document,
            serializer_class='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'
        )

        ModelAttribute(
            Document, label=_('Label'), name='label', type_name='field'
        )

        ModelAttribute(
            Document,
            description=_('The MIME type of any of the versions of a document'),
            label=_('MIME type'), name='versions__mimetype', type_name='field'
        )

        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',
        )
        ModelPermission.register_inheritance(
            model=DocumentTypeFilename, related='document_type',
        )
        ModelPermission.register_inheritance(
            model=DocumentVersion, related='document',
        )

        # Document and document page thumbnail widget
        document_page_thumbnail_widget = DocumentPageThumbnailWidget()
        document_thumbnail_widget = DocumentThumbnailWidget()
        document_version_thumbnail_widget = DocumentVersionThumbnailWidget()

        # Document
        SourceColumn(
            source=Document, label=_('Thumbnail'),
            func=lambda context: document_thumbnail_widget.render(
                instance=context['object']
            )
        )
        SourceColumn(
            source=Document, label=_('Type'), attribute='document_type'
        )

        # DocumentPage
        SourceColumn(
            source=DocumentPage, label=_('Thumbnail'),
            func=lambda context: document_page_thumbnail_widget.render(
                instance=context['object']
            )
        )

        SourceColumn(
            source=DocumentPageResult, label=_('Thumbnail'),
            func=lambda context: document_page_thumbnail_widget.render(
                instance=context['object']
            )
        )

        SourceColumn(
            source=DocumentPageResult, label=_('Type'),
            attribute='document_version.document.document_type'
        )

        # DocumentType
        SourceColumn(
            source=DocumentType, label=_('Documents'),
            func=lambda context: context['object'].get_document_count(
                user=context['request'].user
            )
        )

        SourceColumn(
            source=DocumentTypeFilename, label=_('Enabled'),
            func=lambda context: two_state_template(context['object'].enabled)
        )

        # DeletedDocument
        SourceColumn(
            source=DeletedDocument, label=_('Thumbnail'),
            func=lambda context: document_thumbnail_widget.render(
                instance=context['object']
            )
        )

        SourceColumn(
            source=DeletedDocument, label=_('Type'), attribute='document_type'
        )
        SourceColumn(
            source=DeletedDocument, label=_('Date time trashed'),
            attribute='deleted_date_time'
        )

        # DocumentVersion
        SourceColumn(
            source=DocumentVersion, label=_('Time and date'),
            attribute='timestamp'
        )
        SourceColumn(
            source=DocumentVersion, label=_('MIME type'),
            attribute='mimetype'
        )
        SourceColumn(
            source=DocumentVersion, label=_('Encoding'),
            attribute='encoding'
        )
        SourceColumn(
            source=DocumentVersion, label=_('Comment'),
            attribute='comment'
        )
        SourceColumn(
            source=DocumentVersion, label=_('Thumbnail'),
            func=lambda context: document_version_thumbnail_widget.render(
                instance=context['object']
            )
        )

        # DuplicatedDocument
        SourceColumn(
            source=DuplicatedDocument, label=_('Thumbnail'),
            func=lambda context: document_thumbnail_widget.render(
                instance=context['object'].document
            )
        )
        SourceColumn(
            source=DuplicatedDocument, label=_('Duplicates'),
            func=lambda context: context['object'].documents.count()
        )

        app.conf.CELERYBEAT_SCHEDULE.update(
            {
                'task_check_delete_periods': {
                    'task': 'documents.tasks.task_check_delete_periods',
                    'schedule': timedelta(
                        seconds=CHECK_DELETE_PERIOD_INTERVAL
                    ),
                },
                'task_check_trash_periods': {
                    'task': 'documents.tasks.task_check_trash_periods',
                    'schedule': timedelta(seconds=CHECK_TRASH_PERIOD_INTERVAL),
                },
                'task_delete_stubs': {
                    'task': 'documents.tasks.task_delete_stubs',
                    'schedule': timedelta(seconds=DELETE_STALE_STUBS_INTERVAL),
                },
            }
        )

        app.conf.CELERY_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.CELERY_ROUTES.update(
            {
                'documents.tasks.task_check_delete_periods': {
                    'queue': 'documents_periodic'
                },
                'documents.tasks.task_check_trash_periods': {
                    'queue': 'documents_periodic'
                },
                'documents.tasks.task_delete_stubs': {
                    'queue': 'documents_periodic'
                },
                'documents.tasks.task_clear_image_cache': {
                    'queue': 'tools'
                },
                'documents.tasks.task_generate_document_page_image': {
                    'queue': 'converter'
                },
                'documents.tasks.task_update_page_count': {
                    'queue': 'uploads'
                },
                'documents.tasks.task_upload_new_version': {
                    'queue': 'uploads'
                },
                'documents.tasks.task_scan_duplicates_all': {
                    'queue': 'tools'
                },
                'documents.tasks.task_scan_duplicates_for': {
                    'queue': 'uploads'
                },
                'documents.tasks.task_delete_document': {
                    'queue': 'documents'
                },
            }
        )

        dashboard_main.add_widget(widget=widget_document_types)
        dashboard_main.add_widget(widget=widget_documents_in_trash)
        dashboard_main.add_widget(widget=widget_new_documents_this_month)
        dashboard_main.add_widget(widget=widget_pages_per_month)
        dashboard_main.add_widget(widget=widget_total_documents)

        menu_documents.bind_links(
            links=(
                link_document_list_recent, 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_object.bind_links(
            links=(
                link_document_type_edit, link_document_type_filename_list,
                link_acl_list, 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_edit, link_document_document_type_edit,
                link_document_print, link_document_trash,
                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_with_icon,),
            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_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_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.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,)
        )

        namespace = StatisticNamespace(slug='documents', label=_('Documents'))
        namespace.add_statistic(
            slug='new-documents-per-month',
            label=_('New documents per month'),
            func=new_documents_per_month,
            renderer=CharJSLine,
            minute='0'
        )
        namespace.add_statistic(
            slug='new-document-versions-per-month',
            label=_('New document versions per month'),
            func=new_document_versions_per_month,
            renderer=CharJSLine,
            minute='0'
        )
        namespace.add_statistic(
            slug='new-document-pages-per-month',
            label=_('New document pages per month'),
            func=new_document_pages_per_month,
            renderer=CharJSLine,
            minute='0'
        )
        namespace.add_statistic(
            slug='total-documents-at-each-month',
            label=_('Total documents at each month'),
            func=total_document_per_month,
            renderer=CharJSLine,
            minute='0'
        )
        namespace.add_statistic(
            slug='total-document-versions-at-each-month',
            label=_('Total document versions at each month'),
            func=total_document_version_per_month,
            renderer=CharJSLine,
            minute='0'
        )
        namespace.add_statistic(
            slug='total-document-pages-at-each-month',
            label=_('Total document pages at each month'),
            func=total_document_page_per_month,
            renderer=CharJSLine,
            minute='0'
        )

        post_initial_setup.connect(
            create_default_document_type,
            dispatch_uid='create_default_document_type'
        )
        post_version_upload.connect(
            handler_scan_duplicates_for,
            dispatch_uid='handler_scan_duplicates_for',
        )

        registry.register(DeletedDocument)
        registry.register(Document)
        registry.register(DocumentType)
        registry.register(DocumentVersion)
Beispiel #8
0
    def ready(self):
        super(DocumentStatesApp, self).ready()

        APIEndPoint(app=self, version_string='1')

        Document = apps.get_model(
            app_label='documents', model_name='Document'
        )

        Document.add_to_class(
            'workflow', DocumentStateHelper.constructor
        )

        Workflow = self.get_model('Workflow')
        WorkflowInstance = self.get_model('WorkflowInstance')
        WorkflowInstanceLogEntry = self.get_model('WorkflowInstanceLogEntry')
        WorkflowRuntimeProxy = self.get_model('WorkflowRuntimeProxy')
        WorkflowState = self.get_model('WorkflowState')
        WorkflowStateRuntimeProxy = self.get_model('WorkflowStateRuntimeProxy')
        WorkflowTransition = self.get_model('WorkflowTransition')

        ModelAttribute(
            Document, 'workflow.< workflow internal name >.get_current_state',
            label=_('Current state of a workflow'), description=_(
                'Return the current state of the selected workflow'
            ), type_name=['property', 'indexing']
        )
        ModelAttribute(
            Document,
            'workflow.< workflow internal name >.get_current_state.completion',
            label=_('Current state of a workflow'), description=_(
                'Return the completion value of the current state of the '
                'selected workflow'
            ), type_name=['property', 'indexing']
        )

        ModelPermission.register(
            model=Workflow, permissions=(permission_workflow_transition,)
        )

        ModelPermission.register(
            model=WorkflowTransition,
            permissions=(permission_workflow_transition,)
        )

        SourceColumn(
            source=Workflow, label=_('Label'), attribute='label'
        )
        SourceColumn(
            source=Workflow, label=_('Internal name'),
            attribute='internal_name'
        )
        SourceColumn(
            source=Workflow, label=_('Initial state'),
            func=lambda context: context['object'].get_initial_state() or _('None')
        )

        SourceColumn(
            source=WorkflowInstance, label=_('Current state'),
            attribute='get_current_state'
        )
        SourceColumn(
            source=WorkflowInstance, label=_('User'),
            func=lambda context: getattr(
                context['object'].get_last_log_entry(), 'user', _('None')
            )
        )
        SourceColumn(
            source=WorkflowInstance, label=_('Last transition'),
            attribute='get_last_transition'
        )
        SourceColumn(
            source=WorkflowInstance, label=_('Date and time'),
            func=lambda context: getattr(
                context['object'].get_last_log_entry(), 'datetime', _('None')
            )
        )
        SourceColumn(
            source=WorkflowInstance, label=_('Completion'),
            func=lambda context: getattr(
                context['object'].get_current_state(), 'completion', _('None')
            )
        )

        SourceColumn(
            source=WorkflowInstanceLogEntry, label=_('Date and time'),
            attribute='datetime'
        )
        SourceColumn(
            source=WorkflowInstanceLogEntry, label=_('User'), attribute='user'
        )
        SourceColumn(
            source=WorkflowInstanceLogEntry, label=_('Transition'),
            attribute='transition'
        )
        SourceColumn(
            source=WorkflowInstanceLogEntry, label=_('Comment'),
            attribute='comment'
        )

        SourceColumn(
            source=WorkflowState, label=_('Is initial state?'),
            func=lambda context: two_state_template(context['object'].initial)
        )
        SourceColumn(
            source=WorkflowState, label=_('Completion'), attribute='completion'
        )

        SourceColumn(
            source=WorkflowTransition, label=_('Origin state'),
            attribute='origin_state'
        )
        SourceColumn(
            source=WorkflowTransition, label=_('Destination state'),
            attribute='destination_state'
        )

        app.conf.CELERY_QUEUES.extend(
            (
                Queue(
                    'document_states', Exchange('document_states'),
                    routing_key='document_states'
                ),
            )
        )

        app.conf.CELERY_ROUTES.update(
            {
                'document_states.tasks.task_launch_all_workflows': {
                    'queue': 'document_states'
                },
            }
        )

        menu_facet.bind_links(
            links=(link_document_workflow_instance_list,), sources=(Document,)
        )
        menu_main.bind_links(links=(link_workflow_list,), position=10)
        menu_object.bind_links(
            links=(
                link_setup_workflow_states, link_setup_workflow_transitions,
                link_setup_workflow_document_types, link_setup_workflow_edit,
                link_acl_list, link_setup_workflow_delete
            ), sources=(Workflow,)
        )
        menu_object.bind_links(
            links=(
                link_setup_workflow_state_edit,
                link_setup_workflow_state_delete
            ), sources=(WorkflowState,)
        )
        menu_object.bind_links(
            links=(
                link_setup_workflow_transition_edit, link_acl_list,
                link_setup_workflow_transition_delete
            ), sources=(WorkflowTransition,)
        )
        menu_object.bind_links(
            links=(
                link_workflow_instance_detail,
                link_workflow_instance_transition
            ), sources=(WorkflowInstance,)
        )
        menu_object.bind_links(
            links=(
                link_workflow_document_list, link_workflow_state_list,
            ), sources=(WorkflowRuntimeProxy,)
        )
        menu_object.bind_links(
            links=(
                link_workflow_state_document_list,
            ), sources=(WorkflowStateRuntimeProxy,)
        )
        menu_secondary.bind_links(
            links=(link_setup_workflow_list, link_setup_workflow_create),
            sources=(
                Workflow, 'document_states:setup_workflow_create',
                'document_states:setup_workflow_list'
            )
        )
        menu_secondary.bind_links(
            links=(link_workflow_list,),
            sources=(
                WorkflowRuntimeProxy,
            )
        )
        menu_setup.bind_links(links=(link_setup_workflow_list,))
        menu_sidebar.bind_links(
            links=(
                link_setup_workflow_state_create,
                link_setup_workflow_transition_create
            ), sources=(Workflow,)
        )
        menu_tools.bind_links(links=(link_tool_launch_all_workflows,))

        post_save.connect(
            launch_workflow, dispatch_uid='launch_workflow', sender=Document
        )

        # Index updating

        post_save.connect(
            handler_index_document,
            dispatch_uid='handler_index_document_save',
            sender=WorkflowInstanceLogEntry
        )
Beispiel #9
0
    def ready(self):
        super(EventsApp, self).ready()
        Action = apps.get_model(app_label='actstream', model_name='Action')
        Notification = self.get_model(model_name='Notification')
        StoredEventType = self.get_model(model_name='StoredEventType')
        User = get_user_model()

        SourceColumn(
            source=Action, label=_('Timestamp'), attribute='timestamp'
        )
        SourceColumn(
            source=Action, label=_('Actor'),
            func=lambda context: event_user_link(context['object'])
        )
        SourceColumn(
            source=Action, label=_('Event'),
            func=lambda context: event_type_link(context['object'])
        )
        SourceColumn(
            source=Action, label=_('Action object'),
            func=lambda context: event_object_link(
                entry=context['object'], attribute='action_object'
            )
        )

        SourceColumn(
            source=StoredEventType, label=_('Namespace'), attribute='namespace'
        )
        SourceColumn(
            source=StoredEventType, label=_('Label'), attribute='label'
        )

        SourceColumn(
            source=Notification, label=_('Timestamp'),
            attribute='action.timestamp'
        )
        SourceColumn(
            source=Notification, label=_('Actor'), attribute='action.actor'
        )
        SourceColumn(
            source=Notification, label=_('Event'),
            func=lambda context: event_type_link(context['object'].action)
        )
        SourceColumn(
            source=Notification, label=_('Target'),
            func=lambda context: event_object_link(context['object'].action)
        )
        SourceColumn(
            source=Notification, label=_('Seen'),
            func=lambda context: TwoStateWidget(
                state=context['object'].read
            ).render()
        )

        menu_main.bind_links(
            links=(link_user_notifications_list,), position=99
        )
        menu_object.bind_links(
            links=(link_notification_mark_read,), sources=(Notification,)
        )
        menu_object.bind_links(
            links=(link_user_events,), sources=(User,)
        )
        menu_secondary.bind_links(
            links=(link_notification_mark_read_all,),
            sources=('events:user_notifications_list',)
        )
        menu_tools.bind_links(links=(link_events_list,))
        menu_user.bind_links(links=(link_event_types_subscriptions_list,))
Beispiel #10
0
    def ready(self):
        super(TagsApp, self).ready()

        Document = apps.get_model(app_label='documents', model_name='Document')

        DocumentTag = self.get_model('DocumentTag')
        Tag = self.get_model('Tag')

        APIEndPoint(app=self, version_string='1')

        Document.add_to_class(
            'attached_tags',
            lambda document: DocumentTag.objects.filter(documents=document))

        ModelPermission.register(model=Document,
                                 permissions=(permission_tag_attach,
                                              permission_tag_remove,
                                              permission_tag_view))

        ModelPermission.register(model=Tag,
                                 permissions=(
                                     permission_acl_edit,
                                     permission_acl_view,
                                     permission_tag_delete,
                                     permission_tag_edit,
                                     permission_tag_view,
                                 ))

        SourceColumn(source=DocumentTag,
                     label=_('Preview'),
                     func=lambda context: widget_single_tag(context['object']))

        SourceColumn(
            source=Document,
            label=_('Tags'),
            func=lambda context: widget_document_tags(
                document=context['object'], user=context['request'].user))

        SourceColumn(source=Tag,
                     label=_('Preview'),
                     func=lambda context: widget_single_tag(context['object']))
        SourceColumn(source=Tag,
                     label=_('Documents'),
                     func=lambda context: context['object'].get_document_count(
                         user=context['request'].user))

        document_search.add_model_field(field='tags__label', label=_('Tags'))

        menu_facet.bind_links(links=(link_tag_document_list, ),
                              sources=(Document, ))
        menu_main.bind_links(links=(link_tag_list, ))
        menu_multi_item.bind_links(links=(link_multiple_documents_attach_tag,
                                          link_multiple_documents_tag_remove),
                                   sources=(Document, ))
        menu_multi_item.bind_links(links=(link_tag_multiple_delete, ),
                                   sources=(Tag, ))
        menu_multi_item.bind_links(
            links=(link_single_document_multiple_tag_remove, ),
            sources=(DocumentTag, ))
        menu_object.bind_links(links=(link_tag_tagged_item_list, link_tag_edit,
                                      link_acl_list, link_tag_delete),
                               sources=(Tag, ))
        menu_secondary.bind_links(links=(link_tag_list, link_tag_create),
                                  sources=(Tag, 'tags:tag_list',
                                           'tags:tag_create'))
        menu_sidebar.bind_links(
            links=(link_tag_attach, ),
            sources=('tags:document_tags', 'tags:tag_remove',
                     'tags:tag_multiple_remove', 'tags:tag_attach'))
Beispiel #11
0
    def ready(self):
        super(CabinetsApp, self).ready()
        from actstream import registry

        Document = apps.get_model(
            app_label='documents', model_name='Document'
        )

        DocumentCabinet = self.get_model('DocumentCabinet')
        Cabinet = self.get_model('Cabinet')

        APIEndPoint(app=self, version_string='1')

        # Add explicit order_by as DocumentCabinet ordering Meta option has no
        # effect.
        Document.add_to_class(
            'document_cabinets',
            lambda document: DocumentCabinet.objects.filter(documents=document).order_by('parent__label', 'label')
        )

        ModelPermission.register(
            model=Document, permissions=(
                permission_cabinet_add_document,
                permission_cabinet_remove_document
            )
        )

        ModelPermission.register(
            model=Cabinet, permissions=(
                permission_acl_edit, permission_acl_view,
                permission_cabinet_delete, permission_cabinet_edit,
                permission_cabinet_view, permission_cabinet_add_document,
                permission_cabinet_remove_document
            )
        )
        ModelPermission.register_inheritance(
            model=Cabinet, related='get_root',
        )

        SourceColumn(
            source=Document, label=_('Cabinets'),
            func=lambda context: widget_document_cabinets(
                document=context['object'], user=context['request'].user
            ), order=1
        )

        document_page_search.add_model_field(
            field='document_version__document__cabinets__label',
            label=_('Cabinets')
        )
        document_search.add_model_field(
            field='cabinets__label', label=_('Cabinets')
        )

        menu_facet.bind_links(
            links=(link_document_cabinet_list,), sources=(Document,)
        )

        menu_cabinets.bind_links(
            links=(
                link_cabinet_list, link_cabinet_create
            )
        )

        menu_main.bind_links(links=(menu_cabinets,), position=98)

        menu_multi_item.bind_links(
            links=(
                link_cabinet_add_multiple_documents,
                link_multiple_document_cabinet_remove
            ), sources=(Document,)
        )
        menu_object.bind_links(
            links=(
                link_cabinet_view,
            ), sources=(DocumentCabinet, )
        )
        menu_object.bind_links(
            links=(
                link_cabinet_view, link_cabinet_edit,
                link_custom_acl_list, link_cabinet_delete
            ), sources=(Cabinet,)
        )
        menu_sidebar.bind_links(
            links=(link_cabinet_child_add,), sources=(Cabinet,)
        )
        menu_sidebar.bind_links(
            links=(link_cabinet_add_document, link_document_cabinet_remove),
            sources=(
                'cabinets:document_cabinet_list',
                'cabinets:cabinet_add_document',
                'cabinets:document_cabinet_remove'
            )
        )

        registry.register(Cabinet)
Beispiel #12
0
    def ready(self):
        super(CheckoutsApp, self).ready()

        APIEndPoint(app=self, version_string='1')

        Document = apps.get_model(
            app_label='documents', model_name='Document'
        )
        DocumentVersion = apps.get_model(
            app_label='documents', model_name='DocumentVersion'
        )

        DocumentCheckout = self.get_model('DocumentCheckout')

        Document.add_to_class(
            'check_in',
            lambda document, user=None: DocumentCheckout.objects.check_in_document(document, user)
        )
        Document.add_to_class(
            'checkout_info',
            lambda document: DocumentCheckout.objects.document_checkout_info(
                document
            )
        )
        Document.add_to_class(
            'checkout_state',
            lambda document: DocumentCheckout.objects.document_checkout_state(
                document
            )
        )
        Document.add_to_class(
            'is_checked_out',
            lambda document: DocumentCheckout.objects.is_document_checked_out(
                document
            )
        )

        ModelPermission.register(
            model=Document, permissions=(
                permission_document_checkout,
                permission_document_checkin,
                permission_document_checkin_override,
                permission_document_checkout_detail_view
            )
        )

        app.conf.CELERYBEAT_SCHEDULE.update(
            {
                'task_check_expired_check_outs': {
                    'task': 'checkouts.tasks.task_check_expired_check_outs',
                    'schedule': timedelta(
                        seconds=CHECK_EXPIRED_CHECK_OUTS_INTERVAL
                    ),
                },
            }
        )

        app.conf.CELERY_QUEUES.append(
            Queue(
                'checkouts_periodic', Exchange('checkouts_periodic'),
                routing_key='checkouts_periodic', delivery_mode=1
            ),
        )

        app.conf.CELERY_ROUTES.update(
            {
                'checkouts.tasks.task_check_expired_check_outs': {
                    'queue': 'checkouts_periodic'
                },
            }
        )

        dashboard_main.add_widget(order=-1, widget=widget_checkouts)

        menu_facet.bind_links(links=(link_checkout_info,), sources=(Document,))
        menu_main.bind_links(links=(link_checkout_list,), position=98)
        menu_sidebar.bind_links(
            links=(link_checkout_document, link_checkin_document),
            sources=(
                'checkouts:checkout_info', 'checkouts:checkout_document',
                'checkouts:checkin_document'
            )
        )

        pre_save.connect(
            check_new_version_creation,
            dispatch_uid='check_new_version_creation',
            sender=DocumentVersion
        )
Beispiel #13
0
    def ready(self):
        super(CheckoutsApp, self).ready()

        Document = apps.get_model(
            app_label='documents', model_name='Document'
        )
        DocumentVersion = apps.get_model(
            app_label='documents', model_name='DocumentVersion'
        )

        DocumentCheckout = self.get_model('DocumentCheckout')

        Document.add_to_class(
            'check_in',
            lambda document, user=None: DocumentCheckout.objects.check_in_document(document, user)
        )
        Document.add_to_class(
            'checkout_info',
            lambda document: DocumentCheckout.objects.document_checkout_info(
                document
            )
        )
        Document.add_to_class(
            'checkout_state',
            lambda document: DocumentCheckout.objects.document_checkout_state(
                document
            )
        )
        Document.add_to_class(
            'is_checked_out',
            lambda document: DocumentCheckout.objects.is_document_checked_out(
                document
            )
        )

        ModelEventType.register(
            model=Document, event_types=(
                event_document_auto_check_in, event_document_check_in,
                event_document_check_out, event_document_forceful_check_in
            )
        )

        ModelPermission.register(
            model=Document, permissions=(
                permission_document_checkout,
                permission_document_checkin,
                permission_document_checkin_override,
                permission_document_checkout_detail_view
            )
        )

        app.conf.CELERYBEAT_SCHEDULE.update(
            {
                'task_check_expired_check_outs': {
                    'task': 'checkouts.tasks.task_check_expired_check_outs',
                    'schedule': timedelta(
                        seconds=CHECK_EXPIRED_CHECK_OUTS_INTERVAL
                    ),
                },
            }
        )

        app.conf.CELERY_QUEUES.append(
            Queue(
                'checkouts_periodic', Exchange('checkouts_periodic'),
                routing_key='checkouts_periodic', delivery_mode=1
            ),
        )

        app.conf.CELERY_ROUTES.update(
            {
                'checkouts.tasks.task_check_expired_check_outs': {
                    'queue': 'checkouts_periodic'
                },
            }
        )

        dashboard_main.add_widget(
            widget=DashboardWidgetTotalCheckouts, order=-1
        )

        menu_facet.bind_links(links=(link_checkout_info,), sources=(Document,))
        menu_main.bind_links(links=(link_checkout_list,), position=98)
        menu_sidebar.bind_links(
            links=(link_checkout_document, link_checkin_document),
            sources=(
                'checkouts:checkout_info', 'checkouts:checkout_document',
                'checkouts:checkin_document'
            )
        )

        pre_save.connect(
            check_new_version_creation,
            dispatch_uid='check_new_version_creation',
            sender=DocumentVersion
        )
Beispiel #14
0
    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')
        DocumentPageResult = self.get_model('DocumentPageResult')
        DocumentType = self.get_model('DocumentType')
        DocumentTypeFilename = self.get_model('DocumentTypeFilename')
        DocumentVersion = self.get_model('DocumentVersion')
        DuplicatedDocument = self.get_model('DuplicatedDocument')

        DynamicSerializerField.add_serializer(
            klass=Document,
            serializer_class='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=DocumentPageResult, related='document_version__document',
        )
        ModelPermission.register_inheritance(
            model=DocumentTypeFilename, related='document_type',
        )
        ModelPermission.register_inheritance(
            model=DocumentVersion, related='document',
        )

        # Document and document page thumbnail widget
        document_page_thumbnail_widget = DocumentPageThumbnailWidget()

        # Document
        SourceColumn(
            source=Document, label=_('Thumbnail'),
            func=lambda context: document_page_thumbnail_widget.render(
                instance=context['object']
            )
        )
        SourceColumn(
            source=Document, attribute='document_type'
        )
        SourceColumn(
            source=Document, label=_('Pages'),
            func=lambda context: widget_document_page_number(
                document=context['object']
            )
        )

        # DocumentPage
        SourceColumn(
            source=DocumentPage, label=_('Thumbnail'),
            func=lambda context: document_page_thumbnail_widget.render(
                instance=context['object']
            )
        )

        SourceColumn(
            source=DocumentPageResult, label=_('Thumbnail'),
            func=lambda context: document_page_thumbnail_widget.render(
                instance=context['object']
            )
        )

        SourceColumn(
            source=DocumentPageResult, label=_('Type'),
            attribute='document_version.document.document_type'
        )

        # DocumentType
        SourceColumn(
            source=DocumentType, label=_('Documents'),
            func=lambda context: context['object'].get_document_count(
                user=context['request'].user
            )
        )

        SourceColumn(
            source=DocumentTypeFilename, label=_('Enabled'),
            func=lambda context: TwoStateWidget(
                state=context['object'].enabled
            ).render()
        )

        # DeletedDocument
        SourceColumn(
            source=DeletedDocument, label=_('Thumbnail'),
            func=lambda context: document_page_thumbnail_widget.render(
                instance=context['object']
            )
        )

        SourceColumn(
            source=DeletedDocument, attribute='document_type'
        )
        SourceColumn(
            source=DeletedDocument, attribute='deleted_date_time'
        )

        # DocumentVersion
        SourceColumn(
            source=DocumentVersion, label=_('Thumbnail'),
            func=lambda context: document_page_thumbnail_widget.render(
                instance=context['object']
            )
        )
        SourceColumn(
            source=DocumentVersion, attribute='timestamp'
        )
        SourceColumn(
            source=DocumentVersion, label=_('Pages'),
            func=lambda context: widget_document_version_page_number(
                document_version=context['object']
            )
        )
        SourceColumn(
            source=DocumentVersion, attribute='mimetype'
        )
        SourceColumn(
            source=DocumentVersion, attribute='encoding'
        )
        SourceColumn(
            source=DocumentVersion, attribute='comment'
        )

        # DuplicatedDocument
        SourceColumn(
            source=DuplicatedDocument, label=_('Thumbnail'),
            func=lambda context: document_page_thumbnail_widget.render(
                instance=context['object'].document
            )
        )
        SourceColumn(
            source=DuplicatedDocument, label=_('Duplicates'),
            func=lambda context: context['object'].documents.count()
        )

        app.conf.CELERYBEAT_SCHEDULE.update(
            {
                'task_check_delete_periods': {
                    'task': 'documents.tasks.task_check_delete_periods',
                    'schedule': timedelta(
                        seconds=CHECK_DELETE_PERIOD_INTERVAL
                    ),
                },
                'task_check_trash_periods': {
                    'task': 'documents.tasks.task_check_trash_periods',
                    'schedule': timedelta(seconds=CHECK_TRASH_PERIOD_INTERVAL),
                },
                'task_delete_stubs': {
                    'task': 'documents.tasks.task_delete_stubs',
                    'schedule': timedelta(seconds=DELETE_STALE_STUBS_INTERVAL),
                },
            }
        )

        app.conf.CELERY_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.CELERY_ROUTES.update(
            {
                'documents.tasks.task_check_delete_periods': {
                    'queue': 'documents_periodic'
                },
                'documents.tasks.task_check_trash_periods': {
                    'queue': 'documents_periodic'
                },
                'documents.tasks.task_clean_empty_duplicate_lists': {
                    'queue': 'documents'
                },
                'documents.tasks.task_clear_image_cache': {
                    'queue': 'tools'
                },
                'documents.tasks.task_delete_document': {
                    'queue': 'documents'
                },
                'documents.tasks.task_delete_stubs': {
                    'queue': 'documents_periodic'
                },
                'documents.tasks.task_generate_document_page_image': {
                    'queue': 'converter'
                },
                'documents.tasks.task_scan_duplicates_all': {
                    'queue': 'tools'
                },
                'documents.tasks.task_scan_duplicates_for': {
                    'queue': 'uploads'
                },
                'documents.tasks.task_update_page_count': {
                    'queue': 'uploads'
                },
                '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_object.bind_links(
            links=(
                link_document_type_edit, link_document_type_filename_list,
                link_acl_list, link_object_event_types_user_subcriptions_list,
                link_document_type_delete,
                link_events_for_object,
            ), 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,)
        )

        post_delete.connect(
            dispatch_uid='handler_remove_empty_duplicates_lists',
            receiver=handler_remove_empty_duplicates_lists,
            sender=Document,
        )
        post_initial_setup.connect(
            create_default_document_type,
            dispatch_uid='create_default_document_type'
        )
        post_version_upload.connect(
            handler_scan_duplicates_for,
            dispatch_uid='handler_scan_duplicates_for',
        )

        registry.register(DeletedDocument)
        registry.register(Document)
        registry.register(DocumentType)
        registry.register(DocumentVersion)
Beispiel #15
0
    def ready(self):
        super(TagsApp, self).ready()
        from actstream import registry

        Document = apps.get_model(
            app_label='documents', model_name='Document'
        )

        DocumentPageResult = apps.get_model(
            app_label='documents', model_name='DocumentPageResult'
        )

        DocumentTag = self.get_model('DocumentTag')
        Tag = self.get_model('Tag')

        APIEndPoint(app=self, version_string='1')

        Document.add_to_class(
            'attached_tags',
            lambda document: DocumentTag.objects.filter(documents=document)
        )

        ModelPermission.register(
            model=Document, permissions=(
                permission_tag_attach, permission_tag_remove,
                permission_tag_view
            )
        )

        ModelPermission.register(
            model=Tag, permissions=(
                permission_acl_edit, permission_acl_view,
                permission_tag_attach, permission_tag_delete,
                permission_tag_edit, permission_tag_remove,
                permission_tag_view
            )
        )

        SourceColumn(
            source=DocumentTag, label=_('Preview'),
            func=lambda context: widget_single_tag(context['object'])
        )

        SourceColumn(
            source=Document, label=_('Tags'),
            func=lambda context: widget_document_tags(
                document=context['object'], user=context['request'].user
            )
        )

        SourceColumn(
            source=DocumentPageResult, label=_('Tags'),
            func=lambda context: widget_document_tags(
                document=context['object'].document,
                user=context['request'].user
            )
        )

        SourceColumn(
            source=Tag, label=_('Preview'),
            func=lambda context: widget_single_tag(context['object'])
        )
        SourceColumn(
            source=Tag, label=_('Documents'),
            func=lambda context: context['object'].get_document_count(
                user=context['request'].user
            )
        )

        document_page_search.add_model_field(
            field='document_version__document__tags__label', label=_('Tags')
        )
        document_search.add_model_field(field='tags__label', label=_('Tags'))

        menu_facet.bind_links(
            links=(link_tag_document_list,), sources=(Document,)
        )

        menu_tags.bind_links(
            links=(
                link_tag_list, link_tag_create
            )
        )

        menu_main.bind_links(links=(menu_tags,), position=98)

        menu_multi_item.bind_links(
            links=(
                link_multiple_documents_attach_tag,
                link_multiple_documents_tag_remove
            ),
            sources=(Document,)
        )
        menu_multi_item.bind_links(
            links=(link_tag_multiple_delete,), sources=(Tag,)
        )
        menu_object.bind_links(
            links=(
                link_tag_tagged_item_list, link_tag_edit, link_acl_list,
                link_tag_delete
            ),
            sources=(Tag,)
        )
        menu_sidebar.bind_links(
            links=(link_tag_attach, link_single_document_multiple_tag_remove),
            sources=(
                'tags:tag_attach', 'tags:document_tags',
                'tags:single_document_multiple_tag_remove'
            )
        )
        registry.register(Tag)
Beispiel #16
0
    def ready(self):
        super(TagsApp, self).ready()
        from actstream import registry

        from .wizard_steps import WizardStepTags  # NOQA

        Document = apps.get_model(
            app_label='documents', model_name='Document'
        )

        DocumentPageResult = apps.get_model(
            app_label='documents', model_name='DocumentPageResult'
        )

        DocumentTag = self.get_model('DocumentTag')
        Tag = self.get_model('Tag')

        Document.add_to_class(
            'attached_tags',
            lambda document: DocumentTag.objects.filter(documents=document)
        )

        ModelEventType.register(
            model=Tag, event_types=(
                event_tag_attach, event_tag_created, event_tag_edited,
                event_tag_remove
            )
        )

        ModelField(
            Document, name='tags__label'
        )
        ModelField(
            Document, name='tags__color'
        )

        ModelPermission.register(
            model=Document, permissions=(
                permission_tag_attach, permission_tag_remove,
                permission_tag_view
            )
        )

        ModelPermission.register(
            model=Tag, permissions=(
                permission_acl_edit, permission_acl_view,
                permission_events_view, permission_tag_attach,
                permission_tag_delete, permission_tag_edit,
                permission_tag_remove, permission_tag_view,
            )
        )

        SourceColumn(
            source=DocumentTag, attribute='label'
        )
        SourceColumn(
            source=DocumentTag, attribute='get_preview_widget'
        )

        SourceColumn(
            source=Document, label=_('Tags'),
            func=lambda context: widget_document_tags(
                document=context['object'], user=context['request'].user
            )
        )

        SourceColumn(
            source=DocumentPageResult, label=_('Tags'),
            func=lambda context: widget_document_tags(
                document=context['object'].document,
                user=context['request'].user
            )
        )

        SourceColumn(
            source=Tag, attribute='label'
        )
        SourceColumn(
            source=Tag, attribute='get_preview_widget'
        )
        SourceColumn(
            source=Tag, label=_('Documents'),
            func=lambda context: context['object'].get_document_count(
                user=context['request'].user
            )
        )

        document_page_search.add_model_field(
            field='document_version__document__tags__label', label=_('Tags')
        )
        document_search.add_model_field(field='tags__label', label=_('Tags'))

        menu_facet.bind_links(
            links=(link_tag_document_list,), sources=(Document,)
        )

        menu_tags.bind_links(
            links=(
                link_tag_list, link_tag_create
            )
        )

        menu_main.bind_links(links=(menu_tags,), position=98)

        menu_multi_item.bind_links(
            links=(
                link_multiple_documents_attach_tag,
                link_multiple_documents_tag_remove
            ),
            sources=(Document,)
        )
        menu_multi_item.bind_links(
            links=(link_tag_multiple_delete,), sources=(Tag,)
        )
        menu_object.bind_links(
            links=(
                link_tag_tagged_item_list, link_tag_edit, link_acl_list,
                link_events_for_object,
                link_object_event_types_user_subcriptions_list,
                link_tag_delete
            ),
            sources=(Tag,)
        )
        menu_sidebar.bind_links(
            links=(link_tag_attach, link_single_document_multiple_tag_remove),
            sources=(
                'tags:tag_attach', 'tags:document_tags',
                'tags:single_document_multiple_tag_remove'
            )
        )
        registry.register(Tag)

        # Index update

        m2m_changed.connect(
            handler_index_document,
            dispatch_uid='tags_handler_index_document',
            sender=Tag.documents.through
        )

        pre_delete.connect(
            handler_tag_pre_delete,
            dispatch_uid='tags_handler_tag_pre_delete',
            sender=Tag
        )
Beispiel #17
0
    def ready(self):
        super(DocumentStatesApp, self).ready()

        Action = apps.get_model(app_label='actstream', model_name='Action')
        Document = apps.get_model(app_label='documents', model_name='Document')
        ErrorLogEntry = apps.get_model(app_label='common',
                                       model_name='ErrorLogEntry')

        Workflow = self.get_model('Workflow')
        WorkflowInstance = self.get_model('WorkflowInstance')
        WorkflowInstanceLogEntry = self.get_model('WorkflowInstanceLogEntry')
        WorkflowRuntimeProxy = self.get_model('WorkflowRuntimeProxy')
        WorkflowState = self.get_model('WorkflowState')
        WorkflowStateAction = self.get_model('WorkflowStateAction')
        WorkflowStateRuntimeProxy = self.get_model('WorkflowStateRuntimeProxy')
        WorkflowTransition = self.get_model('WorkflowTransition')
        WorkflowTransitionTriggerEvent = self.get_model(
            'WorkflowTransitionTriggerEvent')

        Document.add_to_class('workflow', DocumentStateHelper.constructor)

        ErrorLogEntry.objects.register(model=WorkflowStateAction)

        WorkflowAction.initialize()

        ModelAttribute(
            model=Document,
            name='workflow.< workflow internal name >.get_current_state',
            label=_('Current state of a workflow'),
            description=_('Return the current state of the selected workflow'))
        ModelAttribute(
            model=Document,
            name=
            'workflow.< workflow internal name >.get_current_state.completion',
            label=_('Current state of a workflow'),
            description=_(
                'Return the completion value of the current state of the '
                'selected workflow'))

        ModelPermission.register(model=Document,
                                 permissions=(permission_workflow_view, ))
        ModelPermission.register(model=Workflow,
                                 permissions=(
                                     permission_error_log_view,
                                     permission_workflow_delete,
                                     permission_workflow_edit,
                                     permission_workflow_transition,
                                     permission_workflow_view,
                                 ))

        ModelPermission.register_inheritance(
            model=WorkflowInstance,
            related='workflow',
        )
        ModelPermission.register_inheritance(
            model=WorkflowInstanceLogEntry,
            related='workflow_instance__workflow',
        )
        ModelPermission.register(
            model=WorkflowTransition,
            permissions=(permission_workflow_transition, ))

        ModelPermission.register_inheritance(
            model=WorkflowState,
            related='workflow',
        )
        ModelPermission.register_inheritance(
            model=WorkflowStateAction,
            related='state__workflow',
        )
        ModelPermission.register_inheritance(
            model=WorkflowTransition,
            related='workflow',
        )
        ModelPermission.register_inheritance(
            model=WorkflowTransitionTriggerEvent,
            related='transition__workflow',
        )

        SourceColumn(source=Workflow, label=_('Label'), attribute='label')
        SourceColumn(source=Workflow,
                     label=_('Internal name'),
                     attribute='internal_name')
        SourceColumn(source=Workflow,
                     label=_('Initial state'),
                     func=lambda context: context['object'].get_initial_state(
                     ) or _('None'))

        SourceColumn(source=WorkflowInstance,
                     label=_('Current state'),
                     attribute='get_current_state')
        SourceColumn(
            source=WorkflowInstance,
            label=_('User'),
            func=lambda context: getattr(
                context['object'].get_last_log_entry(), 'user', _('None')))
        SourceColumn(source=WorkflowInstance,
                     label=_('Last transition'),
                     attribute='get_last_transition')
        SourceColumn(
            source=WorkflowInstance,
            label=_('Date and time'),
            func=lambda context: getattr(
                context['object'].get_last_log_entry(), 'datetime', _('None')))
        SourceColumn(
            source=WorkflowInstance,
            label=_('Completion'),
            func=lambda context: getattr(context['object'].get_current_state(),
                                         'completion', _('None')))

        SourceColumn(source=WorkflowInstanceLogEntry,
                     label=_('Date and time'),
                     attribute='datetime')
        SourceColumn(source=WorkflowInstanceLogEntry,
                     label=_('User'),
                     attribute='user')
        SourceColumn(source=WorkflowInstanceLogEntry,
                     label=_('Transition'),
                     attribute='transition')
        SourceColumn(source=WorkflowInstanceLogEntry,
                     label=_('Comment'),
                     attribute='comment')

        SourceColumn(source=WorkflowState,
                     label=_('Is initial state?'),
                     func=lambda context: TwoStateWidget(state=context[
                         'object'].initial).render())
        SourceColumn(source=WorkflowState,
                     label=_('Completion'),
                     attribute='completion')

        SourceColumn(source=WorkflowStateAction,
                     label=_('Label'),
                     attribute='label')
        SourceColumn(source=WorkflowStateAction,
                     label=_('Enabled?'),
                     func=lambda context: TwoStateWidget(state=context[
                         'object'].enabled).render())
        SourceColumn(source=WorkflowStateAction,
                     label=_('When?'),
                     attribute='get_when_display')
        SourceColumn(source=WorkflowStateAction,
                     label=_('Action type'),
                     attribute='get_class_label')

        SourceColumn(source=WorkflowTransition,
                     label=_('Origin state'),
                     attribute='origin_state')
        SourceColumn(source=WorkflowTransition,
                     label=_('Destination state'),
                     attribute='destination_state')
        SourceColumn(source=WorkflowTransition,
                     label=_('Triggers'),
                     func=lambda context: widget_transition_events(
                         transition=context['object']))

        app.conf.CELERY_QUEUES.extend((Queue('document_states',
                                             Exchange('document_states'),
                                             routing_key='document_states'), ))

        app.conf.CELERY_ROUTES.update({
            'document_states.tasks.task_launch_all_workflows': {
                'queue': 'document_states'
            },
        })

        menu_facet.bind_links(links=(link_document_workflow_instance_list, ),
                              sources=(Document, ))
        menu_main.bind_links(links=(link_workflow_list, ), position=10)
        menu_object.bind_links(
            links=(link_setup_workflow_states, link_setup_workflow_transitions,
                   link_setup_workflow_document_types,
                   link_setup_workflow_edit, link_acl_list,
                   link_workflow_preview, link_setup_workflow_delete),
            sources=(Workflow, ))
        menu_object.bind_links(links=(link_setup_workflow_state_edit,
                                      link_setup_workflow_state_action_list,
                                      link_setup_workflow_state_delete),
                               sources=(WorkflowState, ))
        menu_object.bind_links(links=(link_setup_workflow_transition_edit,
                                      link_workflow_instance_transition_events,
                                      link_acl_list,
                                      link_setup_workflow_transition_delete),
                               sources=(WorkflowTransition, ))
        menu_object.bind_links(links=(link_workflow_instance_detail,
                                      link_workflow_instance_transition),
                               sources=(WorkflowInstance, ))
        menu_object.bind_links(links=(
            link_workflow_document_list,
            link_workflow_state_list,
        ),
                               sources=(WorkflowRuntimeProxy, ))
        menu_object.bind_links(links=(link_workflow_state_document_list, ),
                               sources=(WorkflowStateRuntimeProxy, ))
        menu_object.bind_links(links=(
            link_setup_workflow_state_action_edit,
            link_object_error_list,
            link_setup_workflow_state_action_delete,
        ),
                               sources=(WorkflowStateAction, ))

        menu_secondary.bind_links(
            links=(link_setup_workflow_list, link_setup_workflow_create),
            sources=(Workflow, 'document_states:setup_workflow_create',
                     'document_states:setup_workflow_list'))
        menu_secondary.bind_links(links=(link_workflow_list, ),
                                  sources=(WorkflowRuntimeProxy, ))
        menu_secondary.bind_links(
            links=(link_setup_workflow_state_action_selection, ),
            sources=(WorkflowState, ))
        menu_setup.bind_links(links=(link_setup_workflow_list, ))
        menu_sidebar.bind_links(links=(link_setup_workflow_state_create,
                                       link_setup_workflow_transition_create),
                                sources=(Workflow, ))
        menu_tools.bind_links(links=(link_tool_launch_all_workflows, ))

        post_save.connect(launch_workflow,
                          dispatch_uid='launch_workflow',
                          sender=Document)

        # Index updating

        post_save.connect(handler_index_document,
                          dispatch_uid='handler_index_document_save',
                          sender=WorkflowInstanceLogEntry)
        post_save.connect(
            handler_trigger_transition,
            dispatch_uid='document_states_handler_trigger_transition',
            sender=Action)
Beispiel #18
0
    def ready(self):
        super(DocumentIndexingApp, self).ready()

        APIEndPoint(app=self, version_string='1')

        Package(label='Django MPTT', license_text='''
Django MPTT
-----------

Copyright (c) 2007, Jonathan Buchanan

Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
the Software, and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
        ''')

        Package(label='djangorestframework-recursive', license_text='''
Copyright (c) 2015, Warren Jin <*****@*****.**>

Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted, provided that the above
copyright notice and this permission notice appear in all copies.

THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
        ''')

        SourceColumn(source=Index, label=_('Label'), attribute='label')
        SourceColumn(source=Index, label=_('Slug'), attribute='slug')
        SourceColumn(
            source=Index, label=_('Enabled'),
            func=lambda context: two_state_template(context['object'].enabled)
        )

        SourceColumn(
            source=IndexInstance, label=_('Items'),
            func=lambda context: context['object'].get_items_count(
                user=context['request'].user
            )
        )
        SourceColumn(
            source=IndexInstance, label=_('Document types'),
            attribute='get_document_types_names'
        )

        SourceColumn(
            source=IndexTemplateNode, label=_('Level'),
            func=lambda context: node_level(context['object'])
        )
        SourceColumn(
            source=IndexTemplateNode, label=_('Enabled'),
            func=lambda context: two_state_template(context['object'].enabled)
        )
        SourceColumn(
            source=IndexTemplateNode, label=_('Has document links?'),
            func=lambda context: two_state_template(
                context['object'].link_documents
            )
        )

        SourceColumn(
            source=IndexInstanceNode, label=_('Node'),
            func=lambda context: index_instance_item_link(context['object'])
        )
        SourceColumn(
            source=IndexInstanceNode, label=_('Items'),
            func=lambda context: context['object'].get_item_count(
                user=context['request'].user
            )
        )

        SourceColumn(
            source=DocumentIndexInstanceNode, label=_('Node'),
            func=lambda context: get_breadcrumbs(
                index_instance_node=context['object'], single_link=True,
            )
        )
        SourceColumn(
            source=DocumentIndexInstanceNode, label=_('Items'),
            func=lambda context: context['object'].get_item_count(
                user=context['request'].user
            )
        )

        app.conf.CELERY_QUEUES.append(
            Queue('indexing', Exchange('indexing'), routing_key='indexing'),
        )

        app.conf.CELERY_ROUTES.update(
            {
                'document_indexing.tasks.task_delete_empty_index_nodes': {
                    'queue': 'indexing'
                },
                'document_indexing.tasks.task_index_document': {
                    'queue': 'indexing'
                },
                'document_indexing.tasks.task_do_rebuild_all_indexes': {
                    'queue': 'tools'
                },
            }
        )

        menu_facet.bind_links(
            links=(link_document_index_list,), sources=(Document,)
        )
        menu_object.bind_links(
            links=(
                link_index_setup_edit, link_index_setup_view,
                link_index_setup_document_types, link_index_setup_delete
            ), sources=(Index,)
        )
        menu_object.bind_links(
            links=(
                link_template_node_create, link_template_node_edit,
                link_template_node_delete
            ), sources=(IndexTemplateNode,)
        )
        menu_main.bind_links(links=(link_index_main_menu,))
        menu_secondary.bind_links(
            links=(link_index_setup_list, link_index_setup_create),
            sources=(
                Index, 'indexing:index_setup_list',
                'indexing:index_setup_create'
            )
        )
        menu_setup.bind_links(links=(link_index_setup,))
        menu_tools.bind_links(links=(link_rebuild_index_instances,))

        post_delete.connect(
            document_index_delete, dispatch_uid='document_index_delete',
            sender=Document
        )
        post_delete.connect(
            document_metadata_index_post_delete,
            dispatch_uid='document_metadata_index_post_delete',
            sender=DocumentMetadata
        )
        post_document_created.connect(
            document_created_index_update,
            dispatch_uid='document_created_index_update', sender=Document
        )
        post_save.connect(
            document_metadata_index_update,
            dispatch_uid='document_metadata_index_update',
            sender=DocumentMetadata
        )
Beispiel #19
0
    def ready(self):
        super(FoldersApp, self).ready()

        APIEndPoint(app=self, version_string='1')

        Document.add_to_class(
            'document_folders',
            lambda document: DocumentFolder.objects.filter(documents=document)
        )

        ModelPermission.register(
            model=Document, permissions=(
                permission_folder_add_document,
                permission_folder_remove_document
            )
        )

        ModelPermission.register(
            model=Folder, permissions=(
                permission_acl_edit, permission_acl_view,
                permission_folder_delete, permission_folder_edit,
                permission_folder_view
            )
        )

        SourceColumn(
            source=Folder, label=_('Created'), attribute='datetime_created'
        )
        SourceColumn(source=Folder, label=_('User'), attribute='user')
        SourceColumn(
            source=Folder, label=_('Documents'),
            func=lambda context: context['object'].get_document_count(
                user=context['request'].user
            )
        )

        menu_facet.bind_links(
            links=(link_document_folder_list,), sources=(Document,)
        )
        menu_main.bind_links(links=(link_folder_list,))
        menu_multi_item.bind_links(
            links=(link_folder_add_multiple_documents,), sources=(Document,)
        )
        menu_multi_item.bind_links(
            links=(link_folder_document_multiple_remove,),
            sources=('folders:folder_view',)
        )
        menu_object.bind_links(
            links=(
                link_folder_view,
            ), sources=(DocumentFolder, )
        )
        menu_object.bind_links(
            links=(
                link_folder_view, link_folder_edit, link_acl_list,
                link_folder_delete
            ), sources=(Folder,)
        )
        menu_secondary.bind_links(
            links=(link_folder_list, link_folder_create),
            sources=(Folder, 'folders:folder_list', 'folders:folder_create')
        )
        menu_sidebar.bind_links(
            links=(link_folder_add_document,),
            sources=(
                'folders:document_folder_list', 'folders:folder_add_document'
            )
        )
Beispiel #20
0
    def ready(self):
        super(CabinetsApp, self).ready()
        from actstream import registry

        Document = apps.get_model(app_label='documents', model_name='Document')

        DocumentCabinet = self.get_model('DocumentCabinet')
        Cabinet = self.get_model('Cabinet')

        APIEndPoint(app=self, version_string='1')

        # Add explicit order_by as DocumentCabinet ordering Meta option has no
        # effect.
        Document.add_to_class(
            'document_cabinets', lambda document: DocumentCabinet.objects.
            filter(documents=document).order_by('parent__label', 'label'))

        ModelPermission.register(
            model=Document,
            permissions=(permission_cabinet_add_document,
                         permission_cabinet_remove_document))

        ModelPermission.register(
            model=Cabinet,
            permissions=(permission_acl_edit, permission_acl_view,
                         permission_cabinet_delete, permission_cabinet_edit,
                         permission_cabinet_view,
                         permission_cabinet_add_document,
                         permission_cabinet_remove_document))
        ModelPermission.register_inheritance(
            model=Cabinet,
            related='get_root',
        )

        SourceColumn(
            source=Document,
            label=_('Cabinets'),
            func=lambda context: widget_document_cabinets(
                document=context['object'], user=context['request'].user),
            order=1)

        document_page_search.add_model_field(
            field='document_version__document__cabinets__label',
            label=_('Cabinets'))
        document_search.add_model_field(field='cabinets__label',
                                        label=_('Cabinets'))

        menu_facet.bind_links(links=(link_document_cabinet_list, ),
                              sources=(Document, ))

        menu_cabinets.bind_links(links=(link_cabinet_list,
                                        link_cabinet_create))

        menu_main.bind_links(links=(menu_cabinets, ), position=98)

        menu_multi_item.bind_links(
            links=(link_cabinet_add_multiple_documents,
                   link_multiple_document_cabinet_remove),
            sources=(Document, ))
        menu_object.bind_links(links=(link_cabinet_view, ),
                               sources=(DocumentCabinet, ))
        menu_object.bind_links(links=(link_cabinet_view, link_cabinet_edit,
                                      link_custom_acl_list,
                                      link_cabinet_delete),
                               sources=(Cabinet, ))
        menu_sidebar.bind_links(links=(link_cabinet_child_add, ),
                                sources=(Cabinet, ))
        menu_sidebar.bind_links(links=(link_cabinet_add_document,
                                       link_document_cabinet_remove),
                                sources=('cabinets:document_cabinet_list',
                                         'cabinets:cabinet_add_document',
                                         'cabinets:document_cabinet_remove'))

        registry.register(Cabinet)
Beispiel #21
0
    def ready(self):
        super(TagsApp, self).ready()
        from actstream import registry

        from .wizard_steps import WizardStepTags  # NOQA

        Document = apps.get_model(app_label='documents', model_name='Document')

        DocumentPageResult = apps.get_model(app_label='documents',
                                            model_name='DocumentPageResult')

        DocumentTag = self.get_model('DocumentTag')
        Tag = self.get_model('Tag')

        Document.add_to_class(
            'attached_tags',
            lambda document: DocumentTag.objects.filter(documents=document))

        ModelPermission.register(model=Document,
                                 permissions=(permission_tag_attach,
                                              permission_tag_remove,
                                              permission_tag_view))

        ModelPermission.register(
            model=Tag,
            permissions=(permission_acl_edit, permission_acl_view,
                         permission_tag_attach, permission_tag_delete,
                         permission_tag_edit, permission_tag_remove,
                         permission_tag_view))

        SourceColumn(source=DocumentTag, attribute='label')
        SourceColumn(source=DocumentTag, attribute='get_preview_widget')

        SourceColumn(
            source=Document,
            label=_('Tags'),
            func=lambda context: widget_document_tags(
                document=context['object'], user=context['request'].user))

        SourceColumn(source=DocumentPageResult,
                     label=_('Tags'),
                     func=lambda context: widget_document_tags(
                         document=context['object'].document,
                         user=context['request'].user))

        SourceColumn(source=Tag, attribute='label')
        SourceColumn(source=Tag, attribute='get_preview_widget')
        SourceColumn(source=Tag,
                     label=_('Documents'),
                     func=lambda context: context['object'].get_document_count(
                         user=context['request'].user))

        document_page_search.add_model_field(
            field='document_version__document__tags__label', label=_('Tags'))
        document_search.add_model_field(field='tags__label', label=_('Tags'))

        menu_facet.bind_links(links=(link_tag_document_list, ),
                              sources=(Document, ))

        menu_tags.bind_links(links=(link_tag_list, link_tag_create))

        menu_main.bind_links(links=(menu_tags, ), position=98)

        menu_multi_item.bind_links(links=(link_multiple_documents_attach_tag,
                                          link_multiple_documents_tag_remove),
                                   sources=(Document, ))
        menu_multi_item.bind_links(links=(link_tag_multiple_delete, ),
                                   sources=(Tag, ))
        menu_object.bind_links(links=(link_tag_tagged_item_list, link_tag_edit,
                                      link_acl_list, link_tag_delete),
                               sources=(Tag, ))
        menu_sidebar.bind_links(
            links=(link_tag_attach, link_single_document_multiple_tag_remove),
            sources=('tags:tag_attach', 'tags:document_tags',
                     'tags:single_document_multiple_tag_remove'))
        registry.register(Tag)

        # Index update

        m2m_changed.connect(handler_index_document,
                            dispatch_uid='tags_handler_index_document',
                            sender=Tag.documents.through)

        pre_delete.connect(handler_tag_pre_delete,
                           dispatch_uid='tags_handler_tag_pre_delete',
                           sender=Tag)
Beispiel #22
0
    def ready(self):
        super(DocumentIndexingApp, self).ready()

        APIEndPoint(app=self, version_string='1')

        Document = apps.get_model(
            app_label='documents', model_name='Document'
        )

        DocumentType = apps.get_model(
            app_label='documents', model_name='DocumentType'
        )

        DocumentIndexInstanceNode = self.get_model('DocumentIndexInstanceNode')

        Index = self.get_model('Index')
        IndexInstance = self.get_model('IndexInstance')
        IndexInstanceNode = self.get_model('IndexInstanceNode')
        IndexTemplateNode = self.get_model('IndexTemplateNode')

        ModelPermission.register(
            model=Index, permissions=(
                permission_acl_edit, permission_acl_view,
                permission_document_indexing_create,
                permission_document_indexing_delete,
                permission_document_indexing_edit,
                permission_document_indexing_view,
            )
        )

        SourceColumn(source=Index, label=_('Label'), attribute='label')
        SourceColumn(source=Index, label=_('Slug'), attribute='slug')
        SourceColumn(
            source=Index, label=_('Enabled'),
            func=lambda context: two_state_template(context['object'].enabled)
        )

        SourceColumn(
            source=IndexInstance, label=_('Total levels'),
            func=lambda context: context[
                'object'
            ].instance_root.get_descendants_count()
        )
        SourceColumn(
            source=IndexInstance, label=_('Total documents'),
            func=lambda context: context[
                'object'
            ].instance_root.get_descendants_document_count(
                user=context['request'].user
            )
        )
        SourceColumn(
            source=IndexInstance, label=_('Document types'),
            attribute='get_document_types_names'
        )

        SourceColumn(
            source=IndexTemplateNode, label=_('Level'),
            func=lambda context: node_level(context['object'])
        )
        SourceColumn(
            source=IndexTemplateNode, label=_('Enabled'),
            func=lambda context: two_state_template(context['object'].enabled)
        )
        SourceColumn(
            source=IndexTemplateNode, label=_('Has document links?'),
            func=lambda context: two_state_template(
                context['object'].link_documents
            )
        )

        SourceColumn(
            source=IndexInstanceNode, label=_('Level'),
            func=lambda context: index_instance_item_link(context['object'])
        )
        SourceColumn(
            source=IndexInstanceNode, label=_('Levels'),
            func=lambda context: context['object'].get_descendants_count()
        )
        SourceColumn(
            source=IndexInstanceNode, label=_('Documents'),
            func=lambda context: context[
                'object'
            ].get_descendants_document_count(
                user=context['request'].user
            )
        )

        SourceColumn(
            source=DocumentIndexInstanceNode, label=_('Level'),
            func=lambda context: get_instance_link(
                index_instance_node=context['object'],
            )
        )
        SourceColumn(
            source=DocumentIndexInstanceNode, label=_('Levels'),
            func=lambda context: context['object'].get_descendants_count()
        )
        SourceColumn(
            source=DocumentIndexInstanceNode, label=_('Documents'),
            func=lambda context: context[
                'object'
            ].get_descendants_document_count(
                user=context['request'].user
            )
        )

        app.conf.CELERY_QUEUES.append(
            Queue('indexing', Exchange('indexing'), routing_key='indexing'),
        )

        app.conf.CELERY_ROUTES.update(
            {
                'document_indexing.tasks.task_delete_empty': {
                    'queue': 'indexing'
                },
                'document_indexing.tasks.task_remove_document': {
                    'queue': 'indexing'
                },
                'document_indexing.tasks.task_index_document': {
                    'queue': 'indexing'
                },
                'document_indexing.tasks.task_rebuild_index': {
                    'queue': 'tools'
                },
            }
        )

        menu_facet.bind_links(
            links=(link_document_index_list,), sources=(Document,)
        )
        menu_object.bind_links(
            links=(
                link_index_setup_edit, link_index_setup_view,
                link_index_setup_document_types, link_acl_list,
                link_index_setup_delete
            ), sources=(Index,)
        )
        menu_object.bind_links(
            links=(
                link_template_node_create, link_template_node_edit,
                link_template_node_delete
            ), sources=(IndexTemplateNode,)
        )
        menu_main.bind_links(links=(link_index_main_menu,), position=98)
        menu_secondary.bind_links(
            links=(link_index_setup_list, link_index_setup_create),
            sources=(
                Index, 'indexing:index_setup_list',
                'indexing:index_setup_create'
            )
        )
        menu_setup.bind_links(links=(link_index_setup,))
        menu_tools.bind_links(links=(link_rebuild_index_instances,))

        post_delete.connect(
            handler_delete_empty, dispatch_uid='handler_delete_empty',
            sender=Document
        )
        pre_delete.connect(
            handler_remove_document, dispatch_uid='handler_remove_document',
            sender=Document
        )
        post_document_created.connect(
            handler_index_document,
            dispatch_uid='handler_index_document', sender=Document
        )
        post_initial_document_type.connect(
            create_default_document_index,
            dispatch_uid='create_default_document_index', sender=DocumentType
        )
Beispiel #23
0
    def ready(self):
        super(TagsApp, self).ready()

        APIEndPoint(app=self, version_string='1')

        Document.add_to_class(
            'attached_tags',
            lambda document: DocumentTag.objects.filter(documents=document)
        )

        ModelPermission.register(
            model=Document, permissions=(
                permission_tag_attach, permission_tag_remove,
                permission_tag_view
            )
        )

        ModelPermission.register(
            model=Tag, permissions=(
                permission_acl_edit, permission_acl_view,
                permission_tag_delete, permission_tag_edit,
                permission_tag_view,
            )
        )

        SourceColumn(
            source=DocumentTag, label=_('Preview'),
            func=lambda context: widget_single_tag(context['object'])
        )

        SourceColumn(
            source=Document, label=_('Tags'),
            func=lambda context: widget_document_tags(
                document=context['object'], user=context['request'].user
            )
        )

        SourceColumn(
            source=Tag, label=_('Preview'),
            func=lambda context: widget_single_tag(context['object'])
        )
        SourceColumn(
            source=Tag, label=_('Documents'),
            func=lambda context: context['object'].get_document_count(
                user=context['request'].user
            )
        )

        document_search.add_model_field(field='tags__label', label=_('Tags'))

        menu_facet.bind_links(
            links=(link_tag_document_list,), sources=(Document,)
        )
        menu_main.bind_links(links=(link_tag_list,))
        menu_multi_item.bind_links(
            links=(
                link_multiple_documents_attach_tag,
                link_multiple_documents_tag_remove
            ),
            sources=(Document,)
        )
        menu_multi_item.bind_links(
            links=(link_tag_multiple_delete,), sources=(Tag,)
        )
        menu_multi_item.bind_links(
            links=(link_single_document_multiple_tag_remove,),
            sources=(DocumentTag,)
        )
        menu_object.bind_links(
            links=(
                link_tag_tagged_item_list, link_tag_edit, link_acl_list,
                link_tag_delete
            ),
            sources=(Tag,)
        )
        menu_secondary.bind_links(
            links=(link_tag_list, link_tag_create),
            sources=(Tag, 'tags:tag_list', 'tags:tag_create')
        )
        menu_sidebar.bind_links(
            links=(link_tag_attach,),
            sources=(
                'tags:document_tags', 'tags:tag_remove',
                'tags:tag_multiple_remove', 'tags:tag_attach'
            )
        )
Beispiel #24
0
    def ready(self):
        super(DocumentsApp, self).ready()
        from actstream import registry

        APIEndPoint(app=self, version_string='1')

        DeletedDocument = self.get_model('DeletedDocument')
        Document = self.get_model('Document')
        DocumentPage = self.get_model('DocumentPage')
        DocumentPageResult = self.get_model('DocumentPageResult')
        DocumentType = self.get_model('DocumentType')
        DocumentTypeFilename = self.get_model('DocumentTypeFilename')
        DocumentVersion = self.get_model('DocumentVersion')

        DynamicSerializerField.add_serializer(
            klass=Document,
            serializer_class='documents.serializers.DocumentSerializer'
        )

        DashboardWidget(
            func=new_document_pages_this_month, icon='fa fa-calendar',
            label=_('New pages this month'),
            link=reverse_lazy(
                'statistics:statistic_detail',
                args=('new-document-pages-per-month',)
            )
        )

        DashboardWidget(
            func=new_documents_this_month, icon='fa fa-calendar',
            label=_('New documents this month'),
            link=reverse_lazy(
                'statistics:statistic_detail',
                args=('new-documents-per-month',)
            )
        )

        DashboardWidget(
            icon='fa fa-file', queryset=Document.objects.all(),
            label=_('Total documents'),
            link=reverse_lazy('documents:document_list')
        )

        DashboardWidget(
            icon='fa fa-book', queryset=DocumentType.objects.all(),
            label=_('Document types'),
            link=reverse_lazy('documents:document_type_list')
        )

        DashboardWidget(
            icon='fa fa-trash', queryset=DeletedDocument.objects.all(),
            label=_('Documents in trash'),
            link=reverse_lazy('documents:document_list_deleted')
        )

        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'
        )

        ModelAttribute(
            Document, label=_('Label'), name='label', type_name='field'
        )

        ModelAttribute(
            Document,
            description=_('The MIME type of any of the versions of a document'),
            label=_('MIME type'), name='versions__mimetype', type_name='field'
        )

        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_view,
                permission_events_view, permission_transformation_create,
                permission_transformation_delete,
                permission_transformation_edit, permission_transformation_view,
            )
        )

        ModelPermission.register(
            model=DocumentType, permissions=(permission_document_create,)
        )

        ModelPermission.register_proxy(
            source=Document, model=DocumentType,
        )

        ModelPermission.register_inheritance(
            model=Document, related='document_type',
        )

        ModelPermission.register_inheritance(
            model=DocumentVersion, related='document',
        )

        ModelPermission.register_inheritance(
            model=DocumentPage, related='document',
        )

        # Document and document page thumbnail widget
        document_thumbnail_widget = DocumentThumbnailWidget()
        document_page_thumbnail_widget = DocumentPageThumbnailWidget()

        SourceColumn(
            source=Document, label=_('Thumbnail'),
            func=lambda context: document_thumbnail_widget.render(
                instance=context['object']
            )
        )
        SourceColumn(
            source=Document, label=_('Type'), attribute='document_type'
        )

        SourceColumn(
            source=DocumentPage, label=_('Thumbnail'),
            func=lambda context: document_page_thumbnail_widget.render(
                instance=context['object']
            )
        )

        SourceColumn(
            source=DocumentPageResult, label=_('Thumbnail'),
            func=lambda context: document_page_thumbnail_widget.render(
                instance=context['object']
            )
        )

        SourceColumn(
            source=DocumentPageResult, label=_('Type'),
            attribute='document_version.document.document_type'
        )

        SourceColumn(
            source=DocumentType, label=_('Documents'),
            func=lambda context: context['object'].get_document_count(
                user=context['request'].user
            )
        )

        SourceColumn(
            source=DocumentTypeFilename, label=_('Enabled'),
            func=lambda context: two_state_template(context['object'].enabled)
        )

        SourceColumn(
            source=DeletedDocument, label=_('Thumbnail'),
            func=lambda context: document_thumbnail_widget.render(
                instance=context['object']
            )
        )

        SourceColumn(
            source=DeletedDocument, label=_('Type'), attribute='document_type'
        )
        SourceColumn(
            source=DeletedDocument, label=_('Date time trashed'),
            attribute='deleted_date_time'
        )

        SourceColumn(
            source=DocumentVersion, label=_('Time and date'),
            attribute='timestamp'
        )
        SourceColumn(
            source=DocumentVersion, label=_('MIME type'),
            attribute='mimetype'
        )
        SourceColumn(
            source=DocumentVersion, label=_('Encoding'),
            attribute='encoding'
        )
        SourceColumn(
            source=DocumentVersion, label=_('Comment'),
            attribute='comment'
        )

        app.conf.CELERYBEAT_SCHEDULE.update(
            {
                'task_check_delete_periods': {
                    'task': 'documents.tasks.task_check_delete_periods',
                    'schedule': timedelta(
                        seconds=CHECK_DELETE_PERIOD_INTERVAL
                    ),
                },
                'task_check_trash_periods': {
                    'task': 'documents.tasks.task_check_trash_periods',
                    'schedule': timedelta(seconds=CHECK_TRASH_PERIOD_INTERVAL),
                },
                'task_delete_stubs': {
                    'task': 'documents.tasks.task_delete_stubs',
                    'schedule': timedelta(seconds=DELETE_STALE_STUBS_INTERVAL),
                },
            }
        )

        app.conf.CELERY_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'),
            )
        )

        app.conf.CELERY_ROUTES.update(
            {
                'documents.tasks.task_check_delete_periods': {
                    'queue': 'documents_periodic'
                },
                'documents.tasks.task_check_trash_periods': {
                    'queue': 'documents_periodic'
                },
                'documents.tasks.task_delete_stubs': {
                    'queue': 'documents_periodic'
                },
                'documents.tasks.task_clear_image_cache': {
                    'queue': 'tools'
                },
                'documents.tasks.task_generate_document_page_image': {
                    'queue': 'converter'
                },
                'documents.tasks.task_update_page_count': {
                    'queue': 'uploads'
                },
                'documents.tasks.task_upload_new_version': {
                    'queue': 'uploads'
                },
            }
        )

        menu_documents.bind_links(
            links=(
                link_document_list_recent, link_document_list,
                link_document_list_deleted
            )
        )

        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,))

        # Document type links
        menu_object.bind_links(
            links=(
                link_document_type_edit, link_document_type_filename_list,
                link_acl_list, 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_edit, link_document_document_type_edit,
                link_document_print, link_document_trash,
                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_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_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_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.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,)
        )

        namespace = StatisticNamespace(slug='documents', label=_('Documents'))
        namespace.add_statistic(
            slug='new-documents-per-month',
            label=_('New documents per month'),
            func=new_documents_per_month,
            renderer=CharJSLine,
            minute='0'
        )
        namespace.add_statistic(
            slug='new-document-versions-per-month',
            label=_('New document versions per month'),
            func=new_document_versions_per_month,
            renderer=CharJSLine,
            minute='0'
        )
        namespace.add_statistic(
            slug='new-document-pages-per-month',
            label=_('New document pages per month'),
            func=new_document_pages_per_month,
            renderer=CharJSLine,
            minute='0'
        )
        namespace.add_statistic(
            slug='total-documents-at-each-month',
            label=_('Total documents at each month'),
            func=total_document_per_month,
            renderer=CharJSLine,
            minute='0'
        )
        namespace.add_statistic(
            slug='total-document-versions-at-each-month',
            label=_('Total document versions at each month'),
            func=total_document_version_per_month,
            renderer=CharJSLine,
            minute='0'
        )
        namespace.add_statistic(
            slug='total-document-pages-at-each-month',
            label=_('Total document pages at each month'),
            func=total_document_page_per_month,
            renderer=CharJSLine,
            minute='0'
        )

        post_initial_setup.connect(
            create_default_document_type,
            dispatch_uid='create_default_document_type'
        )

        registry.register(DeletedDocument)
        registry.register(Document)
Beispiel #25
0
    def ready(self):
        super(CheckoutsApp, self).ready()

        APIEndPoint(app=self, version_string='1')

        Document.add_to_class(
            'check_in',
            lambda document, user=None: DocumentCheckout.objects.check_in_document(document, user)
        )
        Document.add_to_class(
            'checkout_info',
            lambda document: DocumentCheckout.objects.document_checkout_info(
                document
            )
        )
        Document.add_to_class(
            'checkout_state',
            lambda document: DocumentCheckout.objects.document_checkout_state(
                document
            )
        )
        Document.add_to_class(
            'is_checked_out',
            lambda document: DocumentCheckout.objects.is_document_checked_out(
                document
            )
        )

        ModelPermission.register(
            model=Document, permissions=(
                permission_document_checkout,
                permission_document_checkin,
                permission_document_checkin_override,
            )
        )

        app.conf.CELERYBEAT_SCHEDULE.update(
            {
                'task_check_expired_check_outs': {
                    'task': 'checkouts.tasks.task_check_expired_check_outs',
                    'schedule': timedelta(
                        seconds=CHECK_EXPIRED_CHECK_OUTS_INTERVAL
                    ),
                },
            }
        )

        app.conf.CELERY_QUEUES.append(
            Queue(
                'checkouts_periodic', Exchange('checkouts_periodic'),
                routing_key='checkouts_periodic', delivery_mode=1
            ),
        )

        app.conf.CELERY_ROUTES.update(
            {
                'checkouts.tasks.task_check_expired_check_outs': {
                    'queue': 'checkouts_periodic'
                },
            }
        )

        menu_facet.bind_links(links=(link_checkout_info,), sources=(Document,))
        menu_main.bind_links(links=(link_checkout_list,))
        menu_sidebar.bind_links(
            links=(link_checkout_document, link_checkin_document),
            sources=(
                'checkouts:checkout_info', 'checkouts:checkout_document',
                'checkouts:checkin_document'
            )
        )