Пример #1
0
    def ready(self):
        super(LinkingApp, self).ready()

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

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

        ResolvedSmartLink = self.get_model('ResolvedSmartLink')
        SmartLink = self.get_model('SmartLink')
        SmartLinkCondition = self.get_model('SmartLinkCondition')

        ModelPermission.register(model=SmartLink,
                                 permissions=(permission_acl_edit,
                                              permission_acl_view,
                                              permission_smart_link_delete,
                                              permission_smart_link_edit,
                                              permission_smart_link_view))

        SourceColumn(source=ResolvedSmartLink,
                     label=_('Label'),
                     func=lambda context: context['object'].get_dynamic_label(
                         context['document']))

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

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

        menu_facet.bind_links(links=(link_smart_link_instances_for_document, ),
                              sources=(Document, ))
        menu_object.bind_links(links=(link_smart_link_condition_edit,
                                      link_smart_link_condition_delete),
                               sources=(SmartLinkCondition, ))
        menu_object.bind_links(links=(link_smart_link_edit,
                                      link_smart_link_document_types,
                                      link_smart_link_condition_list,
                                      link_acl_list, link_smart_link_delete),
                               sources=(SmartLink, ))
        menu_object.bind_links(links=(link_smart_link_instance_view, ),
                               sources=(ResolvedSmartLink, ))
        menu_secondary.bind_links(links=(link_smart_link_list,
                                         link_smart_link_create),
                                  sources=(SmartLink,
                                           'linking:smart_link_list',
                                           'linking:smart_link_create'))
        menu_setup.bind_links(links=(link_smart_link_setup, ))
        menu_sidebar.bind_links(
            links=(link_smart_link_condition_create, ),
            sources=('linking:smart_link_condition_list',
                     'linking:smart_link_condition_create',
                     'linking:smart_link_condition_edit',
                     'linking:smart_link_condition_delete'))
Пример #2
0
    def ready(self):
        super(SmartSettingsApp, self).ready()

        Namespace.initialize()

        SourceColumn(source=Namespace,
                     label=_('Setting count'),
                     func=lambda context: len(context['object'].settings))
        SourceColumn(source=Setting,
                     label=_('Name'),
                     func=lambda context: setting_widget(context['object']))
        SourceColumn(source=Setting,
                     label=_('Value'),
                     attribute='serialized_value')
        SourceColumn(source=Setting,
                     label=_('Overrided by environment variable?'),
                     func=lambda context: _('Yes')
                     if context['object'].environment_variable else _('No'))

        menu_object.bind_links(links=(link_namespace_detail, ),
                               sources=(Namespace, ))
        menu_object.bind_links(links=(link_setting_edit, ),
                               sources=(Setting, ))
        menu_sidebar.bind_links(links=(link_namespace_root_list, ),
                                sources=(
                                    Namespace,
                                    Setting,
                                    'settings:namespace_list',
                                ))
        menu_setup.bind_links(links=(link_namespace_list, ))

        Setting.save_last_known_good()
Пример #3
0
    def ready(self):
        super(DocumentCommentsApp, self).ready()

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

        Comment = self.get_model('Comment')

        ModelPermission.register(model=Document,
                                 permissions=(permission_comment_create,
                                              permission_comment_delete,
                                              permission_comment_view))

        SourceColumn(source=Comment, label=_('Date'), attribute='submit_date')
        SourceColumn(
            source=Comment,
            label=_('User'),
            func=lambda context: context['object'].user.get_full_name()
            if context['object'].user.get_full_name() else context['object'
                                                                   ].user)
        SourceColumn(source=Comment, label=_('Comment'), attribute='comment')

        menu_sidebar.bind_links(links=(link_comment_add, ),
                                sources=('comments:comments_for_document',
                                         'comments:comment_add',
                                         'comments:comment_delete',
                                         'comments:comment_multiple_delete'))
        menu_object.bind_links(links=(link_comment_delete, ),
                               sources=(Comment, ))
        menu_facet.bind_links(links=(link_comments_for_document, ),
                              sources=(Document, ))
Пример #4
0
    def ready(self):
        super(MailerApp, self).ready()

        SourceColumn(source=LogEntry,
                     label=_('Date and time'),
                     attribute='datetime')

        SourceColumn(source=LogEntry, label=_('Message'), attribute='message')

        ModelPermission.register(
            model=Document,
            permissions=(permission_mailing_link,
                         permission_mailing_send_document))

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

        app.conf.CELERY_ROUTES.update({
            'mailer.tasks.task_send_document': {
                'queue': 'mailing'
            },
        })

        menu_object.bind_links(links=(link_send_document_link,
                                      link_send_document),
                               sources=(Document, ))

        menu_tools.bind_links(links=(link_document_mailing_error_log, ))
Пример #5
0
    def ready(self):
        super(ConverterApp, self).ready()

        Package(label='Pillow',
                license_text='''
The Python Imaging Library (PIL) is

    Copyright (c) 1997-2011 by Secret Labs AB
    Copyright (c) 1995-2011 by Fredrik Lundh

By obtaining, using, and/or copying this software and/or its associated documentation, you agree that you have read, understood, and will comply with the following terms and conditions:

Permission to use, copy, modify, and distribute this software and its associated documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appears in all copies, and that both that copyright notice and this permission notice appear in supporting documentation, and that the name of Secret Labs AB or the author not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission.

SECRET LABS AB AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL SECRET LABS AB OR THE AUTHOR BE LIABLE FOR ANY SPECIAL, 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=Transformation,
                     label=_('Order'),
                     attribute='order')
        SourceColumn(source=Transformation,
                     label=_('Transformation'),
                     func=lambda context: unicode(context['object']))
        SourceColumn(source=Transformation,
                     label=_('Arguments'),
                     attribute='arguments')

        menu_object.bind_links(links=(link_transformation_edit,
                                      link_transformation_delete),
                               sources=(Transformation, ))
        menu_sidebar.bind_links(links=(link_transformation_create, ),
                                sources=(Transformation, ))
        menu_sidebar.bind_links(links=(link_transformation_create, ),
                                sources=('converter:transformation_create',
                                         'converter:transformation_list'))
Пример #6
0
    def ready(self):
        super(MOTDApp, self).ready()

        Message = self.get_model('Message')
        ModelPermission.register(
            model=Message, permissions=(
                permission_message_delete, permission_message_edit,
                permission_message_view
            )
        )
        SourceColumn(
            source=Message, label=_('Enabled'), attribute='enabled'
        )
        SourceColumn(
            source=Message, label=_('Start date time'),
            func=lambda context: context['object'].start_datetime or _('None')
        )
        SourceColumn(
            source=Message, label=_('End date time'),
            func=lambda context: context['object'].end_datetime or _('None')
        )

        menu_object.bind_links(
            links=(
                link_message_edit, link_message_delete
            ), sources=(Message,)
        )
        menu_secondary.bind_links(
            links=(link_message_create,),
            sources=(Message, 'motd:message_list', 'motd:message_create')
        )
        menu_setup.bind_links(
            links=(link_message_list,)
        )
Пример #7
0
    def ready(self):
        super(InstallationApp, self).ready()

        SourceColumn(source=PropertyNamespace,
                     label=_('Label'),
                     attribute='label')
        SourceColumn(
            source=PropertyNamespace,
            label=_('Items'),
            func=lambda context: len(context['object'].get_properties()))

        SourceColumn(source=Property, label=_('Label'), attribute='label')
        SourceColumn(source=Property, label=_('Value'), attribute='value')

        menu_object.bind_links(links=(link_namespace_details, ),
                               sources=(PropertyNamespace, ))
        menu_secondary.bind_links(links=(link_namespace_list, ),
                                  sources=('installation:namespace_list',
                                           PropertyNamespace))
        menu_tools.bind_links(links=(link_menu_link, ))

        namespace = PropertyNamespace('venv', _('VirtualEnv'))
        try:
            venv = VirtualEnv()
        except PIPNotFound:
            namespace.add_property('pip',
                                   'pip',
                                   _('pip not found.'),
                                   report=True)
        else:
            for item, version, result in venv.get_results():
                namespace.add_property(item,
                                       '%s (%s)' % (item, version),
                                       result,
                                       report=True)
Пример #8
0
    def ready(self):
        super(UserManagementApp, self).ready()

        User = get_user_model()

        APIEndPoint(app=self, version_string='1')
        DynamicSerializerField.add_serializer(
            klass=get_user_model(),
            serializer_class='user_management.serializers.UserSerializer')

        MetadataLookup(description=_('All the groups.'),
                       name='groups',
                       value=get_groups)
        MetadataLookup(description=_('All the users.'),
                       name='users',
                       value=get_users)

        SourceColumn(source=Group,
                     label=_('Members'),
                     attribute='user_set.count')

        SourceColumn(source=User,
                     label=_('Full name'),
                     attribute='get_full_name')
        SourceColumn(source=User, label=_('Email'), attribute='email')
        SourceColumn(source=User,
                     label=_('Active'),
                     func=lambda context: two_state_template(context['object'].
                                                             is_active))
        SourceColumn(source=User,
                     label=_('Has usable password?'),
                     func=lambda context: two_state_template(context[
                         'object'].has_usable_password()))

        menu_multi_item.bind_links(links=(link_user_multiple_set_password,
                                          link_user_multiple_delete),
                                   sources=('user_management:user_list', ))
        menu_object.bind_links(links=(link_group_edit, link_group_members,
                                      link_group_delete),
                               sources=(Group, ))
        menu_object.bind_links(links=(link_user_edit, link_user_set_password,
                                      link_user_groups, link_user_delete),
                               sources=(User, ))
        menu_secondary.bind_links(
            links=(link_group_list, link_group_add),
            sources=('user_management:group_multiple_delete',
                     'user_management:group_delete',
                     'user_management:group_edit',
                     'user_management:group_list', 'user_management:group_add',
                     'user_management:group_members'))
        menu_secondary.bind_links(
            links=(link_user_list, link_user_add),
            sources=(User, 'user_management:user_multiple_set_password',
                     'user_management:user_multiple_delete',
                     'user_management:user_list', 'user_management:user_add'))
        menu_setup.bind_links(links=(link_user_setup, link_group_setup))

        registry.register(Group)
        registry.register(User)
    def ready(self, *args, **kwargs):
        super(QuotasApp, self).ready(*args, **kwargs)
        Quota = self.get_model('Quota')

        QuotaBackend.initialize()

        try:
            for quota in Quota.objects.all():
                quota.update_receiver()
        except (OperationalError, ProgrammingError):
            # Ignore errors during migration
            pass

        ModelPermission.register(
            model=Quota,
            permissions=(permission_acl_edit, permission_acl_view,
                         permission_quota_delete, permission_quota_edit,
                         permission_quota_view))

        SourceColumn(source=Quota,
                     label=_('Backend'),
                     attribute='backend_label')
        SourceColumn(source=Quota,
                     label=_('Display'),
                     attribute='backend_display')
        SourceColumn(source=Quota, label=_('Usage'), attribute='backend_usage')
        SourceColumn(
            source=Quota,
            label=_('Enabled?'),
            func=lambda context: two_state_template(context['object'].enabled))
        SourceColumn(source=Quota,
                     label=_('Editable?'),
                     func=lambda context: two_state_template(context['object'].
                                                             editable))

        menu_object.bind_links(links=(
            link_quota_edit,
            link_acl_list,
            link_quota_delete,
        ),
                               sources=(Quota, ))

        menu_secondary.bind_links(links=(
            link_quota_list,
            link_quota_create,
        ),
                                  sources=(
                                      Quota,
                                      'quotas:quota_backend_selection',
                                      'quotas:quota_create',
                                      'quotas:quota_list',
                                  ))

        menu_setup.bind_links(links=(link_quota_setup, ))
Пример #10
0
    def ready(self):
        super(DocumentCommentsApp, self).ready()

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

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

        Comment = self.get_model('Comment')

        ModelEventType.register(
            model=Document, event_types=(
                event_document_comment_create, event_document_comment_delete
            )
        )

        ModelPermission.register(
            model=Document, permissions=(
                permission_comment_create, permission_comment_delete,
                permission_comment_view
            )
        )

        SourceColumn(source=Comment, label=_('Date'), attribute='submit_date')
        SourceColumn(
            source=Comment, label=_('User'),
            func=lambda context: context['object'].user.get_full_name() if context['object'].user.get_full_name() else context['object'].user
        )
        SourceColumn(source=Comment, label=_('Comment'), attribute='comment')

        document_page_search.add_model_field(
            field='document_version__document__comments__comment',
            label=_('Comments')
        )
        document_search.add_model_field(
            field='comments__comment',
            label=_('Comments')
        )

        menu_sidebar.bind_links(
            links=(link_comment_add,),
            sources=(
                'comments:comments_for_document', 'comments:comment_add',
                'comments:comment_delete', 'comments:comment_multiple_delete'
            )
        )
        menu_object.bind_links(
            links=(link_comment_delete,), sources=(Comment,)
        )
        menu_facet.bind_links(
            links=(link_comments_for_document,), sources=(Document,)
        )
Пример #11
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'))
Пример #12
0
    def ready(self):
        super(ACLsApp, self).ready()

        SourceColumn(source=AccessControlList,
                     label=_('Permissions'),
                     attribute='get_permission_titles')
        SourceColumn(source=AccessControlList,
                     label=_('Role'),
                     attribute='role')

        menu_object.bind_links(links=(link_acl_permissions, link_acl_delete),
                               sources=(AccessControlList, ))
        menu_sidebar.bind_links(links=(link_acl_new, ),
                                sources=('acls:acl_list', ))
Пример #13
0
    def ready(self):
        super(EventsApp, self).ready()
        Action = apps.get_model(app_label='actstream', model_name='Action')

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

        SourceColumn(source=Action,
                     label=_('Timestamp'),
                     attribute='timestamp')
        SourceColumn(source=Action, label=_('Actor'), attribute='actor')
        SourceColumn(source=Action,
                     label=_('Verb'),
                     func=lambda context: event_type_link(context['object']))

        menu_tools.bind_links(links=(link_events_list, ))
Пример #14
0
    def ready(self):
        super(StatisticsApp, self).ready()

        SourceColumn(
            source=StatisticLineChart,
            # Translators: Schedule here is a verb, the 'schedule' at
            # which the statistic will be updated
            label=_('Schedule'),
            attribute='schedule',
        )

        app.conf.CELERY_QUEUES.extend((Queue('statistics',
                                             Exchange('statistics'),
                                             routing_key='statistics',
                                             delivery_mode=1), ))

        app.conf.CELERY_ROUTES.update({
            'mayan_statistics.tasks.task_execute_statistic': {
                'queue': 'statistics'
            },
        })

        menu_object.bind_links(links=(link_execute, link_view),
                               sources=(StatisticLineChart, ))
        menu_object.bind_links(links=(link_namespace_details, ),
                               sources=(StatisticNamespace, ))
        menu_secondary.bind_links(links=(link_namespace_list, ),
                                  sources=(StatisticNamespace,
                                           'statistics:namespace_list'))
        menu_tools.bind_links(links=(link_statistics, ))
Пример #15
0
    def ready(self):
        super(DjangoGPGApp, self).ready()

        APIEndPoint(app=self, version_string='1')
        Key = self.get_model('Key')

        ModelPermission.register(
            model=Key, permissions=(
                permission_acl_edit, permission_acl_view,
                permission_key_delete, permission_key_download,
                permission_key_sign, permission_key_view
            )
        )

        SourceColumn(source=Key, label=_('Key ID'), attribute='key_id')
        SourceColumn(source=Key, label=_('User ID'), attribute='user_id')

        SourceColumn(source=KeyStub, label=_('Key ID'), attribute='key_id')
        SourceColumn(source=KeyStub, label=_('Type'), attribute='key_type')
        SourceColumn(
            source=KeyStub, label=_('Creation date'), attribute='date'
        )
        SourceColumn(
            source=KeyStub, label=_('Expiration date'),
            func=lambda context: context['object'].expires or _('No expiration')
        )
        SourceColumn(source=KeyStub, label=_('Length'), attribute='length')
        SourceColumn(
            source=KeyStub, label=_('User ID'),
            func=lambda context: ', '.join(context['object'].user_id)
        )

        menu_object.bind_links(links=(link_key_detail,), sources=(Key,))
        menu_object.bind_links(links=(link_key_receive,), sources=(KeyStub,))

        menu_object.bind_links(
            links=(link_acl_list, link_key_delete, link_key_download,),
            sources=(Key,)
        )
        menu_setup.bind_links(links=(link_key_setup,))
        menu_facet.bind_links(
            links=(link_private_keys, link_public_keys),
            sources=(
                'django_gpg:key_public_list', 'django_gpg:key_private_list',
                'django_gpg:key_query', 'django_gpg:key_query_results', Key,
                KeyStub
            )
        )
        menu_sidebar.bind_links(
            links=(link_key_query, link_key_upload),
            sources=(
                'django_gpg:key_public_list', 'django_gpg:key_private_list',
                'django_gpg:key_query', 'django_gpg:key_query_results', Key,
                KeyStub
            )
        )
Пример #16
0
    def ready(self):
        super(EventsApp, self).ready()

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

        Package(label='django-activity-stream', license_text='''
Copyright (c) 2010-2015, Justin Quick
All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:

    * Redistributions of source code must retain the above copyright
      notice, this list of conditions and the following disclaimer.
    * Redistributions in binary form must reproduce the above
      copyright notice, this list of conditions and the following
      disclaimer in the documentation and/or other materials provided
      with the distribution.
    * Neither the name of the author nor the names of other
      contributors may be used to endorse or promote products derived
      from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
        ''')

        SourceColumn(
            source=Action, label=_('Timestamp'), attribute='timestamp'
        )
        SourceColumn(source=Action, label=_('Actor'), attribute='actor')
        SourceColumn(
            source=Action, label=_('Verb'),
            func=lambda context: event_type_link(context['object'])
        )

        menu_tools.bind_links(links=(link_events_list,))
Пример #17
0
    def ready(self):
        super(ACLsApp, self).ready()

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

        AccessControlList = self.get_model('AccessControlList')

        SourceColumn(source=AccessControlList,
                     label=_('Permissions'),
                     attribute='get_permission_titles')
        SourceColumn(source=AccessControlList,
                     label=_('Role'),
                     attribute='role')

        menu_object.bind_links(links=(link_acl_permissions, link_acl_delete),
                               sources=(AccessControlList, ))
        menu_sidebar.bind_links(links=(link_acl_create, ),
                                sources=('acls:acl_list', ))
Пример #18
0
    def ready(self):
        super(SmartSettingsApp, self).ready()

        Namespace.initialize()

        SourceColumn(
            source=Namespace, label=_('Setting count'),
            func=lambda context: len(context['object'].settings)
        )
        SourceColumn(
            source=Setting, label=_('Name'),
            func=lambda context: setting_widget(context['object'])
        )
        SourceColumn(
            source=Setting, label=_('Value'), attribute='serialized_value'
        )

        menu_object.bind_links(
            links=(link_namespace_detail,), sources=(Namespace,)
        )
        menu_setup.bind_links(links=(link_namespace_list,))
Пример #19
0
    def ready(self):
        super(ConverterApp, self).ready()

        Transformation = self.get_model('Transformation')

        SourceColumn(source=Transformation,
                     label=_('Order'),
                     attribute='order')
        SourceColumn(source=Transformation,
                     label=_('Transformation'),
                     func=lambda context: unicode(context['object']))
        SourceColumn(source=Transformation,
                     label=_('Arguments'),
                     attribute='arguments')

        menu_object.bind_links(links=(link_transformation_edit,
                                      link_transformation_delete),
                               sources=(Transformation, ))
        menu_sidebar.bind_links(links=(link_transformation_create, ),
                                sources=(Transformation, ))
        menu_sidebar.bind_links(links=(link_transformation_create, ),
                                sources=('converter:transformation_create',
                                         'converter:transformation_list'))
Пример #20
0
    def ready(self):
        super(StatisticsApp, self).ready()

        Package(label='Chart.js', license_text='''
Copyright (c) 2013-2015 Nick Downie

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

        SourceColumn(
            source=Statistic,
            # Translators: Schedule here is a verb, the 'schedule' at which the
            # statistic will be updated
            label=_('Schedule'),
            attribute='schedule',
        )

        app.conf.CELERY_QUEUES.extend(
            (
                Queue(
                    'statistics', Exchange('statistics'),
                    routing_key='statistics', delivery_mode=1
                ),
            )
        )

        app.conf.CELERY_ROUTES.update(
            {
                'statistics.tasks.task_execute_statistic': {
                    'queue': 'statistics'
                },
            }
        )

        menu_object.bind_links(
            links=(link_execute, link_view), sources=(Statistic,)
        )
        menu_object.bind_links(
            links=(link_namespace_details,), sources=(StatisticNamespace,)
        )
        menu_secondary.bind_links(
            links=(link_namespace_list,),
            sources=(StatisticNamespace, 'statistics:namespace_list')
        )
        menu_tools.bind_links(links=(link_statistics,))
Пример #21
0
    def ready(self):
        super(DocumentsApp, self).ready()

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

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

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

        SourceColumn(
            source=Document, label=_('Thumbnail'),
            func=lambda context: document_thumbnail(
                context['object'], gallery_name='documents:document_list',
                size=setting_thumbnail_size.value,
                title=getattr(context['object'], 'label', None),
            )
        )
        SourceColumn(
            source=Document, label=_('Type'), attribute='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(
                context['object'],
                gallery_name='documents:delete_document_list',
                size=setting_thumbnail_size.value,
                title=getattr(context['object'], 'label', None),
                disable_title_link=True
            )
        )
        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_get_document_page_image': {
                    'queue': 'converter'
                },
                'documents.tasks.task_update_page_count': {
                    'queue': 'uploads'
                },
                'documents.tasks.task_upload_new_version': {
                    'queue': 'uploads'
                },
            }
        )

        menu_front_page.bind_links(
            links=(
                link_document_list_recent, link_document_list,
                link_document_list_deleted
            )
        )
        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_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)
Пример #22
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'))
Пример #23
0
    def ready(self):
        super(SourcesApp, self).ready()

        POP3Email = self.get_model('POP3Email')
        IMAPEmail = self.get_model('IMAPEmail')
        Source = self.get_model('Source')
        SourceLog = self.get_model('SourceLog')
        SaneScanner = self.get_model('SaneScanner')
        StagingFolderSource = self.get_model('StagingFolderSource')
        WatchFolderSource = self.get_model('WatchFolderSource')
        WebFormSource = self.get_model('WebFormSource')

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

        MissingItem(
            label=_('Create a document source'),
            description=_(
                'Document sources are the way in which new documents are '
                'feed to Mayan EDMS, create at least a web form source to '
                'be able to upload documents from a browser.'),
            condition=lambda: not Source.objects.exists(),
            view='sources:setup_source_list')

        SourceColumn(
            source=StagingFile,
            label=_('Created'),
            func=lambda context: context['object'].get_date_time_created())

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

        SourceColumn(source=SourceLog,
                     label=_('Date time'),
                     func=lambda context: context['object'].datetime)
        SourceColumn(source=SourceLog,
                     label=_('Message'),
                     func=lambda context: context['object'].message)

        app.conf.CELERY_QUEUES.extend((
            Queue('sources', Exchange('sources'), routing_key='sources'),
            Queue('sources_periodic',
                  Exchange('sources_periodic'),
                  routing_key='sources_periodic',
                  delivery_mode=1),
        ))

        app.conf.CELERY_ROUTES.update({
            'sources.tasks.task_check_interval_source': {
                'queue': 'sources_periodic'
            },
            'sources.tasks.task_source_handle_upload': {
                'queue': 'sources'
            },
            'sources.tasks.task_upload_document': {
                'queue': 'sources'
            },
        })
        menu_documents.bind_links(links=(link_document_create_multiple, ))

        menu_object.bind_links(
            links=(link_setup_source_edit, link_setup_source_delete,
                   link_transformation_list, link_setup_source_logs),
            sources=(POP3Email, IMAPEmail, SaneScanner, StagingFolderSource,
                     WatchFolderSource, WebFormSource))
        menu_object.bind_links(links=(link_staging_file_delete, ),
                               sources=(StagingFile, ))
        menu_object.bind_links(links=(link_setup_source_check_now, ),
                               sources=(
                                   IMAPEmail,
                                   POP3Email,
                                   WatchFolderSource,
                               ))
        menu_secondary.bind_links(
            links=(link_setup_sources, link_setup_source_create_webform,
                   link_setup_source_create_sane_scanner,
                   link_setup_source_create_staging_folder,
                   link_setup_source_create_pop3_email,
                   link_setup_source_create_imap_email,
                   link_setup_source_create_watch_folder),
            sources=(POP3Email, IMAPEmail, StagingFolderSource,
                     WatchFolderSource, WebFormSource,
                     'sources:setup_source_list',
                     'sources:setup_source_create'))
        menu_setup.bind_links(links=(link_setup_sources, ))
        menu_sidebar.bind_links(links=(link_upload_version, ),
                                sources=('documents:document_version_list',
                                         'documents:upload_version',
                                         'documents:document_version_revert'))

        post_upgrade.connect(initialize_periodic_tasks,
                             dispatch_uid='initialize_periodic_tasks')
        post_initial_setup.connect(
            create_default_document_source,
            dispatch_uid='create_default_document_source')
        post_version_upload.connect(
            copy_transformations_to_version,
            dispatch_uid='copy_transformations_to_version')
Пример #24
0
    def ready(self):
        super(DocumentParsingApp, 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'
        )

        DocumentVersionParseError = self.get_model('DocumentVersionParseError')

        Document.add_to_class('submit_for_parsing', document_parsing_submit)
        DocumentVersion.add_to_class(
            'content', get_document_content
        )
        DocumentVersion.add_to_class(
            'submit_for_parsing', document_version_parsing_submit
        )

        ModelPermission.register(
            model=Document, permissions=(permission_content_view,)
        )

        SourceColumn(
            source=DocumentVersionParseError, label=_('Document'),
            func=lambda context: document_link(context['object'].document_version.document)
        )
        SourceColumn(
            source=DocumentVersionParseError, label=_('Added'),
            attribute='datetime_submitted'
        )
        SourceColumn(
            source=DocumentVersionParseError, label=_('Result'),
            attribute='result'
        )

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

        app.conf.CELERY_ROUTES.update(
            {
                'document_parsing.tasks.task_parse_document_version': {
                    'queue': 'parsing'
                },
            }
        )

        document_search.add_model_field(
            field='versions__pages__content__content', label=_('Content')
        )

        document_page_search.add_model_field(
            field='content__content', label=_('Content')
        )

        menu_facet.bind_links(
            links=(link_document_content,), sources=(Document,)
        )
        menu_multi_item.bind_links(
            links=(link_document_submit_multiple,), sources=(Document,)
        )
        menu_object.bind_links(
            links=(link_document_submit,), sources=(Document,)
        )
        menu_secondary.bind_links(
            links=(
                link_document_content, link_document_parsing_errors_list,
                link_document_content_download
            ),
            sources=(
                'document_parsing:document_content',
                'document_parsing:document_content_download',
                'document_parsing:document_parsing_error_list',
            )
        )
        menu_tools.bind_links(
            links=(
                link_document_type_submit, link_error_list,
            )
        )

        post_version_upload.connect(
            dispatch_uid='document_parsing_handler_parse_document_version',
            receiver=handler_parse_document_version,
            sender=DocumentVersion
        )
Пример #25
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
        )
Пример #26
0
    def ready(self):
        super(OCRApp, self).ready()

        Document = apps.get_model(app_label='documents', model_name='Document')
        DocumentPage = apps.get_model(app_label='documents',
                                      model_name='DocumentPage')
        DocumentType = apps.get_model(app_label='documents',
                                      model_name='DocumentType')
        DocumentTypeSettings = self.get_model(
            model_name='DocumentTypeSettings')
        DocumentVersion = apps.get_model(app_label='documents',
                                         model_name='DocumentVersion')

        DocumentVersionOCRError = self.get_model('DocumentVersionOCRError')

        Document.add_to_class('submit_for_ocr', document_ocr_submit)
        DocumentVersion.add_to_class('ocr_content', get_document_ocr_content)
        DocumentVersion.add_to_class('submit_for_ocr',
                                     document_version_ocr_submit)

        ModelField(Document, name='versions__pages__ocr_content__content')

        ModelPermission.register(model=Document,
                                 permissions=(permission_ocr_document,
                                              permission_ocr_content_view))
        ModelPermission.register(
            model=DocumentType,
            permissions=(permission_document_type_ocr_setup, ))
        ModelPermission.register_inheritance(
            model=DocumentTypeSettings,
            related='document_type',
        )

        SourceColumn(source=DocumentVersionOCRError,
                     label=_('Document'),
                     func=lambda context: document_link(context[
                         'object'].document_version.document))
        SourceColumn(source=DocumentVersionOCRError,
                     label=_('Added'),
                     attribute='datetime_submitted')
        SourceColumn(source=DocumentVersionOCRError,
                     label=_('Result'),
                     attribute='result')

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

        app.conf.CELERY_ROUTES.update({
            'ocr.tasks.task_do_ocr': {
                'queue': 'ocr'
            },
        })

        document_search.add_model_field(
            field='versions__pages__ocr_content__content', label=_('OCR'))

        document_page_search.add_model_field(field='ocr_content__content',
                                             label=_('OCR'))

        menu_facet.bind_links(links=(link_document_ocr_content, ),
                              sources=(Document, ))
        menu_facet.bind_links(links=(link_document_page_ocr_content, ),
                              sources=(DocumentPage, ))
        menu_multi_item.bind_links(links=(link_document_submit_multiple, ),
                                   sources=(Document, ))
        menu_object.bind_links(links=(link_document_submit, ),
                               sources=(Document, ))
        menu_object.bind_links(links=(link_document_page_ocr_content, ),
                               sources=(DocumentPage, ))
        menu_object.bind_links(links=(link_document_type_ocr_settings, ),
                               sources=(DocumentType, ))
        menu_secondary.bind_links(links=(link_document_ocr_content,
                                         link_document_ocr_errors_list,
                                         link_document_ocr_download),
                                  sources=(
                                      'ocr:document_content',
                                      'ocr:document_ocr_error_list',
                                      'ocr:document_ocr_download',
                                  ))
        menu_secondary.bind_links(
            links=(link_entry_list, ),
            sources=('ocr:entry_list', 'ocr:entry_delete_multiple',
                     'ocr:entry_re_queue_multiple', DocumentVersionOCRError))
        menu_tools.bind_links(links=(link_document_type_submit,
                                     link_entry_list))

        post_save.connect(
            dispatch_uid='ocr_handler_initialize_new_ocr_settings',
            receiver=handler_initialize_new_ocr_settings,
            sender=DocumentType)
        post_version_upload.connect(
            dispatch_uid='ocr_handler_ocr_document_version',
            receiver=handler_ocr_document_version,
            sender=DocumentVersion)
Пример #27
0
    def ready(self):
        super(DocumentSignaturesApp, self).ready()

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

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

        Key = apps.get_model(app_label='django_gpg', model_name='Key')

        EmbeddedSignature = self.get_model('EmbeddedSignature')

        SignatureBaseModel = self.get_model('SignatureBaseModel')

        DocumentVersion.register_post_save_hook(
            order=1, func=EmbeddedSignature.objects.create)
        DocumentVersion.register_pre_open_hook(
            order=1, func=EmbeddedSignature.objects.open_signed)

        ModelPermission.register(
            model=Document,
            permissions=(
                permission_document_version_sign_detached,
                permission_document_version_sign_embedded,
                permission_document_version_signature_delete,
                permission_document_version_signature_download,
                permission_document_version_signature_view,
                permission_document_version_signature_upload,
            ))

        SourceColumn(source=SignatureBaseModel,
                     label=_('Date'),
                     attribute='date')
        SourceColumn(source=SignatureBaseModel,
                     label=_('Key ID'),
                     attribute='get_key_id')
        SourceColumn(
            source=SignatureBaseModel,
            label=_('Signature ID'),
            func=lambda context: context['object'].signature_id or _('None'))
        SourceColumn(
            source=SignatureBaseModel,
            label=_('Type'),
            func=lambda context: SignatureBaseModel.objects.get_subclass(
                pk=context['object'].pk).get_signature_type_display())

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

        app.conf.CELERY_ROUTES.update({
            'document_signatures.tasks.task_verify_key_signatures': {
                'queue': 'signatures'
            },
            'document_signatures.tasks.task_unverify_key_signatures': {
                'queue': 'signatures'
            },
            'document_signatures.tasks.task_verify_document_version': {
                'queue': 'signatures'
            },
            'document_signatures.tasks.task_verify_missing_embedded_signature':
            {
                'queue': 'tools'
            },
        })

        menu_facet.bind_links(links=(link_document_signature_list, ),
                              sources=(Document, ))
        menu_object.bind_links(
            links=(link_document_version_signature_list,
                   link_document_version_signature_detached_create,
                   link_document_version_signature_embedded_create),
            sources=(DocumentVersion, ))
        menu_object.bind_links(links=(
            link_document_version_signature_details,
            link_document_version_signature_download,
            link_document_version_signature_delete,
        ),
                               sources=(SignatureBaseModel, ))
        menu_sidebar.bind_links(
            links=(link_document_version_signature_upload, ),
            sources=(DocumentVersion, ))
        menu_tools.bind_links(
            links=(link_all_document_version_signature_verify, ))

        post_delete.connect(unverify_key_signatures,
                            dispatch_uid='unverify_key_signatures',
                            sender=Key)
        post_upgrade.connect(
            verify_missing_embedded_signature,
            dispatch_uid='verify_missing_embedded_signature',
        )
        post_save.connect(verify_key_signatures,
                          dispatch_uid='verify_key_signatures',
                          sender=Key)
Пример #28
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)
Пример #29
0
    def ready(self):
        super(MailerApp, self).ready()

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

        LogEntry = self.get_model('LogEntry')
        UserMailer = self.get_model('UserMailer')

        MailerBackend.initialize()

        SourceColumn(
            source=LogEntry, label=_('Date and time'), attribute='datetime'
        )
        SourceColumn(
            source=LogEntry, label=_('Message'), attribute='message'
        )
        SourceColumn(
            source=UserMailer, label=_('Label'), attribute='label'
        )
        SourceColumn(
            source=UserMailer, label=_('Default?'),
            func=lambda context: TwoStateWidget(
                state=context['object'].default
            ).render()
        )
        SourceColumn(
            source=UserMailer, label=_('Enabled?'),
            func=lambda context: TwoStateWidget(
                state=context['object'].enabled
            ).render()
        )
        SourceColumn(
            source=UserMailer, label=_('Label'), attribute='backend_label'
        )

        ModelPermission.register(
            model=Document, permissions=(
                permission_mailing_link, permission_mailing_send_document
            )
        )

        ModelPermission.register(
            model=UserMailer, permissions=(
                permission_acl_edit, permission_acl_view,
                permission_user_mailer_delete, permission_user_mailer_edit,
                permission_user_mailer_view, permission_user_mailer_use
            )
        )

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

        app.conf.CELERY_ROUTES.update(
            {
                'mailer.tasks.task_send_document': {
                    'queue': 'mailing'
                },
            }
        )

        menu_multi_item.bind_links(
            links=(
                link_send_multiple_document, link_send_multiple_document_link
            ), sources=(Document,)
        )

        menu_object.bind_links(
            links=(
                link_send_document_link, link_send_document
            ), sources=(Document,)
        )

        menu_object.bind_links(
            links=(
                link_user_mailer_edit, link_user_mailer_log_list,
                link_user_mailer_test, link_acl_list, link_user_mailer_delete,
            ), sources=(UserMailer,)
        )

        menu_secondary.bind_links(
            links=(
                link_user_mailer_list, link_user_mailer_create,
            ), sources=(
                UserMailer, 'mailer:user_mailer_list',
                'mailer:user_mailer_create'
            )
        )

        menu_tools.bind_links(links=(link_system_mailer_error_log,))

        menu_setup.bind_links(links=(link_user_mailer_setup,))
Пример #30
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, ))