def register(cls, app_name): logger.debug('Trying to import: %s' % app_name) try: app_module = import_module(app_name) except ImportError: logger.debug('Unable to import app: %s' % app_name) else: logger.debug('Trying to import registry from: %s' % app_name) try: registration = import_module('%s.registry' % app_name) except ImportError as e: logger.debug('Unable to import registry for app: %s; %s' % (app_name, e)) else: if not getattr(registration, 'disabled', False): app = App() app.name = app_name # If there are not error go ahead with the stored app instance app.label = getattr(registration, 'label', app_name) app.description = getattr(registration, 'description', u'') for link in getattr(registration, 'setup_links', []): logger.debug('setup link: %s' % link) register_setup(link) for link in getattr(registration, 'tool_links', []): logger.debug('tool link: %s' % link) register_tool(link) for index, link in enumerate(getattr(registration, 'menu_links', [])): logger.debug('menu_link: %s' % link) register_top_menu(name='%s.%s' % (app_name, index), link=link) for cleanup_function in getattr(registration, 'cleanup_functions', []): logger.debug('cleanup_function: %s' % cleanup_function) Cleanup(cleanup_function) for bootstrap_model in getattr(registration, 'bootstrap_models', []): logger.debug('bootstrap_model: %s' % bootstrap_model) BootstrapModel(model_name=bootstrap_model.get('name'), app_name=app_name, sanitize=bootstrap_model.get('sanitize', True), dependencies=bootstrap_model.get('dependencies')) version_0_api_services = getattr(registration, 'version_0_api_services', []) logger.debug('version_0_api_services: %s' % version_0_api_services) if version_0_api_services: api_endpoint = APIEndPoint(app_name) for service in version_0_api_services: api_endpoint.add_service(**service)
'documents', 'Document', permission=PERMISSION_DOCUMENT_VIEW, serializer_string='documents.serializers.DocumentSerializer') # TODO: move these to their respective apps # Moving these to other apps cause an ImportError; circular import? document_search.add_model_field('document_type__name', label=_('Document type')) document_search.add_model_field('versions__mimetype', label=_('MIME type')) document_search.add_model_field('label', label=_('Label')) document_search.add_model_field('metadata__metadata_type__name', label=_('Metadata type')) document_search.add_model_field('metadata__value', label=_('Metadata value')) document_search.add_model_field('versions__pages__content', label=_('Content')) document_search.add_model_field('description', label=_('Description')) document_search.add_model_field('tags__label', label=_('Tags')) namespace = StatisticNamespace(name='documents', label=_('Documents')) namespace.add_statistic( DocumentStatistics(name='document_stats', label=_('Document tendencies'))) namespace.add_statistic( DocumentUsageStatistics(name='document_usage', label=_('Document usage'))) APIEndPoint('documents') ModelAttribute(Document, label=_('Label'), name='label', type_name='field') FrontPageButton(link=document_list_recent) FrontPageButton(link=document_list)
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)) Package(label='python-gnupg', license_text=''' Copyright (c) 2008-2014 by Vinay Sajip. 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. * The name(s) of the copyright holder(s) may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) "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 HOLDER(S) 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=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))
register_links(['setup_web_form_list', 'setup_staging_folder_list', 'setup_watch_folder_list', 'setup_source_edit', 'setup_source_delete', 'setup_source_create'], [setup_sources, setup_source_create], menu_name='sidebar') register_links(StagingFolder, [setup_web_form_list, setup_staging_folder_list], menu_name='form_header') register_links(StagingFolder, [setup_source_transformation_list, setup_source_edit, setup_source_delete]) register_links(WatchFolder, [setup_web_form_list, setup_staging_folder_list, setup_watch_folder_list], menu_name='form_header') register_links(WatchFolder, [setup_source_transformation_list, setup_source_edit, setup_source_delete]) # Document version register_links(['document_version_list', 'upload_version', 'document_version_revert'], [upload_version], menu_name='sidebar') register_links(['setup_source_transformation_create', 'setup_source_transformation_edit', 'setup_source_transformation_delete', 'setup_source_transformation_list'], [setup_source_transformation_create], menu_name='sidebar') source_views = ['setup_web_form_list', 'setup_staging_folder_list', 'setup_watch_folder_list', 'setup_source_edit', 'setup_source_delete', 'setup_source_create', 'setup_source_transformation_list', 'setup_source_transformation_edit', 'setup_source_transformation_delete', 'setup_source_transformation_create'] register_model_list_columns(StagingFile, [ {'name': _(u'thumbnail'), 'attribute': encapsulate(lambda x: staging_file_thumbnail(x, gallery_name='staging_list', title=x.filename, size='100')) }, ]) register_setup(setup_sources) register_links([Document, 'document_list_recent', 'document_list', 'document_create', 'document_create_multiple', 'upload_interactive', 'staging_file_delete'], [document_create_multiple], menu_name='secondary_menu') register_links(Document, [document_create_siblings]) endpoint = APIEndPoint('sources') endpoint.register_urls(api_urls) endpoint.add_endpoint('stagingfolder-list')
def ready(self): super(TagsApp, self).ready() 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_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=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'))
class_permissions(Document, [ PERMISSION_DOCUMENT_PROPERTIES_EDIT, PERMISSION_DOCUMENT_EDIT, PERMISSION_DOCUMENT_VIEW, PERMISSION_DOCUMENT_DELETE, PERMISSION_DOCUMENT_DOWNLOAD, PERMISSION_DOCUMENT_TRANSFORM, PERMISSION_DOCUMENT_NEW_VERSION, PERMISSION_DOCUMENT_VERSION_REVERT, PERMISSION_HISTORY_VIEW ]) document_search = SearchModel('documents', 'Document') document_search.add_model_field('document_type__name', label=_(u'Document type')) document_search.add_model_field('versions__mimetype', label=_(u'MIME type')) document_search.add_model_field('versions__filename', label=_(u'Filename')) document_search.add_model_field('metadata__metadata_type__name', label=_(u'Metadata type')) document_search.add_model_field('metadata__value', label=_(u'Metadata value')) document_search.add_model_field('versions__pages__content', label=_(u'Content')) document_search.add_model_field('description', label=_(u'Description')) document_search.add_model_field('tags__name', label=_(u'Tags')) document_search.add_related_field('comments', 'Comment', 'comment', 'object_pk', label=_(u'Comments')) namespace = StatisticNamespace(name='documents', label=_(u'Documents')) namespace.add_statistic(DocumentStatistics(name='document_stats', label=_(u'Document tendencies'))) namespace.add_statistic(DocumentUsageStatistics(name='document_usage', label=_(u'Document usage'))) endpoint = APIEndPoint('documents') endpoint.register_urls(api_urls) endpoint.add_endpoint('document-list')
from __future__ import unicode_literals from django.contrib.auth.models import User, Group from navigation.api import register_links from project_setup.api import register_setup from rest_api.classes import APIEndPoint from .links import ( group_add, group_delete, group_edit, group_list, group_members, group_multiple_delete, group_setup, user_add, user_delete, user_edit, user_groups, user_list, user_multiple_delete, user_multiple_set_password, user_set_password, user_setup ) register_links(User, [user_edit, user_set_password, user_groups, user_delete]) register_links([User, 'user_management:user_multiple_set_password', 'user_management:user_multiple_delete', 'user_management:user_list', 'user_management:user_add'], [user_list, user_add], menu_name='secondary_menu') register_links(['user_management:user_list'], [user_multiple_set_password, user_multiple_delete], menu_name='multi_item_links') register_links(Group, [group_edit, group_members, group_delete]) register_links(['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'], [group_list, group_add], menu_name='secondary_menu') register_links(['user_management:group_list'], [group_multiple_delete], menu_name='multi_item_links') register_setup(user_setup) register_setup(group_setup) APIEndPoint('users', app_name='user_management')
'setup_source_create', 'setup_source_transformation_list', 'setup_source_transformation_edit', 'setup_source_transformation_delete', 'setup_source_transformation_create' ] register_model_list_columns(StagingFile, [ { 'name': _(u'thumbnail'), 'attribute': encapsulate(lambda x: staging_file_thumbnail( x, gallery_name='staging_list', title=x.filename, size='100')) }, ]) register_setup(setup_sources) register_links([ Document, 'document_list_recent', 'document_list', 'document_create', 'document_create_multiple', 'upload_interactive', 'staging_file_delete' ], [document_create_multiple], menu_name='secondary_menu') register_links(Document, [document_create_siblings]) endpoint = APIEndPoint('sources') endpoint.register_urls(api_urls) endpoint.add_endpoint( 'stagingfolder-list', _(u'Returns a list of all the staging folders and the files they contain.') )
def ready(self): super(MetadataApp, self).ready() Document = apps.get_model(app_label='documents', model_name='Document') DocumentPageResult = apps.get_model(app_label='documents', model_name='DocumentPageResult') DocumentType = apps.get_model(app_label='documents', model_name='DocumentType') DocumentMetadata = self.get_model('DocumentMetadata') DocumentTypeMetadataType = self.get_model('DocumentTypeMetadataType') MetadataType = self.get_model('MetadataType') APIEndPoint(app=self, version_string='2') Document.add_to_class('metadata_value_of', DocumentMetadataHelper.constructor) Filter(label=_('Documents missing required metadata'), slug='documents-no-required-metadata', filter_kwargs=[{ 'document_type__metadata__required': True, }, { 'metadata__value__isnull': True }, { 'is_stub': False }], model=Document, object_permission=permission_document_view, hide_links=True) Filter(label=_('Documents missing optional metadata'), slug='documents-no-optional-metadata', filter_kwargs=[{ 'document_type__metadata__required': False, }, { 'metadata__value__isnull': True }, { 'is_stub': False }], model=Document, object_permission=permission_document_view, hide_links=True) ModelAttribute( Document, 'metadata', type_name='related', description=_( 'Queryset containing a MetadataType instance reference and a ' 'value for that metadata type')) ModelAttribute(Document, 'metadata__metadata_type__name', label=_('Metadata type name'), type_name='query') ModelAttribute(Document, 'metadata__value', label=_('Metadata type value'), type_name='query') ModelAttribute( Document, 'metadata_value_of', label=_('Value of a metadata'), description=_('Return the value of a specific document metadata'), type_name=['property', 'indexing']) ModelPermission.register(model=Document, permissions=( permission_metadata_document_add, permission_metadata_document_edit, permission_metadata_document_remove, permission_metadata_document_view, )) SourceColumn( source=Document, label=_('Metadata'), func=lambda context: get_metadata_string(context['object'])) SourceColumn(source=DocumentPageResult, label=_('Metadata'), func=lambda context: get_metadata_string(context['object'] .document)) SourceColumn(source=DocumentMetadata, label=_('Value'), attribute='value') SourceColumn(source=DocumentMetadata, label=_('Required'), func=lambda context: two_state_template(context['object']. is_required)) app.conf.CELERY_QUEUES.append( Queue('metadata', Exchange('metadata'), routing_key='metadata'), ) app.conf.CELERY_ROUTES.update({ 'metadata.tasks.task_remove_metadata_type': { 'queue': 'metadata' }, 'metadata.tasks.task_add_required_metadata_type': { 'queue': 'metadata' }, }) document_search.add_model_field(field='metadata__metadata_type__name', label=_('Metadata type')) document_search.add_model_field(field='metadata__value', label=_('Metadata value')) document_page_search.add_model_field( field='document_version__document__metadata__metadata_type__name', label=_('Metadata type')) document_page_search.add_model_field( field='document_version__document__metadata__value', label=_('Metadata value')) menu_facet.bind_links(links=(link_metadata_view, ), sources=(Document, )) menu_multi_item.bind_links(links=(link_metadata_multiple_add, link_metadata_multiple_edit, link_metadata_multiple_remove), sources=(Document, )) menu_object.bind_links( links=(link_setup_document_type_metadata_types, ), sources=(DocumentType, )) menu_object.bind_links(links=(link_setup_metadata_type_edit, link_setup_metadata_type_document_types, link_setup_metadata_type_delete), sources=(MetadataType, )) menu_secondary.bind_links( links=(link_setup_metadata_type_list, link_setup_metadata_type_create), sources=(MetadataType, 'metadata:setup_metadata_type_list', 'metadata:setup_metadata_type_create')) menu_setup.bind_links(links=(link_setup_metadata_type_list, )) menu_sidebar.bind_links( links=(link_metadata_add, link_metadata_edit, link_metadata_remove), sources=('metadata:metadata_add', 'metadata:metadata_edit', 'metadata:metadata_remove', 'metadata:metadata_view')) post_delete.connect( post_document_type_metadata_type_delete, dispatch_uid='metadata_post_document_type_metadata_type_delete', sender=DocumentTypeMetadataType) post_document_type_change.connect( post_document_type_change_metadata, dispatch_uid='metadata_post_document_type_change_metadata', sender=Document) post_save.connect( post_document_type_metadata_type_add, dispatch_uid='metadata_post_document_type_metadata_type_add', sender=DocumentTypeMetadataType) # Index updating post_delete.connect( handler_index_document, dispatch_uid='metadata_handler_index_document_delete', sender=DocumentMetadata) post_save.connect(handler_index_document, dispatch_uid='metadata_handler_index_document_save', sender=DocumentMetadata)
is_document_new_versions_allowed(document, user)) app.conf.CELERYBEAT_SCHEDULE.update({ 'check_expired_check_outs': { 'task': 'checkouts.tasks.task_check_expired_check_outs', 'schedule': timedelta(seconds=CHECK_EXPIRED_CHECK_OUTS_INTERVAL), 'options': { 'queue': 'checkouts' } }, }) class_permissions(Document, [ PERMISSION_DOCUMENT_CHECKOUT, PERMISSION_DOCUMENT_CHECKIN, PERMISSION_DOCUMENT_CHECKIN_OVERRIDE, PERMISSION_DOCUMENT_RESTRICTIONS_OVERRIDE ]) initialize_document_checkout_extra_methods() register_links(Document, [checkout_info], menu_name='form_header') register_links([ 'checkouts:checkout_info', 'checkouts:checkout_document', 'checkouts:checkin_document' ], [checkout_document, checkin_document], menu_name="sidebar") register_top_menu(name='checkouts', link=checkout_list) APIEndPoint('checkouts')
def ready(self): super(CommonApp, self).ready() APIEndPoint(app=self, version_string='1') app.conf.CELERYBEAT_SCHEDULE.update({ 'task_delete_stale_uploads': { 'task': 'common.tasks.task_delete_stale_uploads', 'schedule': timedelta(seconds=DELETE_STALE_UPLOADS_INTERVAL), }, }) app.conf.CELERY_QUEUES.extend(( Queue('default', Exchange('default'), routing_key='default'), Queue('tools', Exchange('tools'), routing_key='tools'), Queue('common_periodic', Exchange('common_periodic'), routing_key='common_periodic', delivery_mode=1), )) app.conf.CELERY_DEFAULT_QUEUE = 'default' app.conf.CELERY_ROUTES.update({ 'common.tasks.task_delete_stale_uploads': { 'queue': 'common_periodic' }, }) menu_user.bind_links(links=(Text(text=CommonApp.get_user_label_text), Separator(), link_current_user_details, link_current_user_edit, link_current_user_locale_profile_edit, Separator())) menu_about.bind_links(links=( link_tools, link_setup, link_about, # link_support, #link_documentation, link_forum, link_code, link_license, link_packages_licenses #, link_check_version )) menu_main.bind_links(links=( menu_about, menu_user, ), position=99) menu_secondary.bind_links(links=(link_object_error_list_clear, ), sources=('common:object_error_list', )) #menu_tools.bind_links( # links=(link_filters,) #) post_save.connect(user_locale_profile_create, dispatch_uid='user_locale_profile_create', sender=settings.AUTH_USER_MODEL) pre_initial_setup.connect( handler_pre_initial_setup, dispatch_uid='common_handler_pre_initial_setup') pre_upgrade.connect( handler_pre_upgrade, dispatch_uid='common_handler_pre_upgrade', ) user_logged_in.connect( user_locale_profile_session_config, dispatch_uid='user_locale_profile_session_config') self.setup_auto_logging()
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, )) 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, ), 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(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)
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') 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_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_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') 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' }, }) 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, ), 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') post_version_upload.connect( handler_scan_duplicates_for, dispatch_uid='handler_scan_duplicates_for', ) registry.register(DeletedDocument) registry.register(Document)
def ready(self): super(DocumentStatesApp, self).ready() APIEndPoint(app=self, version_string='1') Document = apps.get_model(app_label='documents', model_name='Document') 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') ModelPermission.register( model=Workflow, permissions=(permission_workflow_transition, )) ModelPermission.register( model=WorkflowTransition, permissions=(permission_workflow_transition, )) 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='converter'), )) 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)
}, ]) register_links(Tag, [tag_tagged_item_list, tag_edit, tag_delete, tag_acl_list]) register_multi_item_links(['tag_list'], [tag_multiple_delete]) register_links([Tag, 'tag_list', 'tag_create'], [tag_list, tag_create], menu_name='secondary_menu') register_top_menu('tags', link={'text': _(u'tags'), 'view': 'tag_list', 'famfam': 'tag_blue'}, children_view_regex=[r'^tag_(list|create|delete|edit|tagged|acl)']) register_links(Document, [tag_document_list], menu_name='form_header') register_links(['document_tags', 'tag_remove', 'tag_multiple_remove', 'tag_attach'], [tag_attach], menu_name='sidebar') register_multi_item_links(['document_tags'], [single_document_multiple_tag_remove]) register_multi_item_links(['document_find_duplicates', 'folder_view', 'index_instance_node_view', 'document_type_document_list', 'search', 'results', 'document_group_view', 'document_list', 'document_list_recent', 'tag_tagged_item_list'], [tag_multiple_attach, multiple_documents_selection_tag_remove]) class_permissions(Document, [ PERMISSION_TAG_ATTACH, PERMISSION_TAG_REMOVE, ]) class_permissions(Tag, [ PERMISSION_TAG_DELETE, PERMISSION_TAG_EDIT, PERMISSION_TAG_VIEW, ]) Document.add_to_class('tags', TaggableManager()) endpoint = APIEndPoint('tags') endpoint.register_urls(api_urls) endpoint.add_endpoint('tag-list', _(u'Returns a list of all the tags.'))
def ready(self): super(DocumentStatesApp, self).ready() APIEndPoint(app=self, version_string='1') Document = apps.get_model(app_label='documents', model_name='Document') Workflow = self.get_model('Workflow') WorkflowInstance = self.get_model('WorkflowInstance') WorkflowInstanceLogEntry = self.get_model('WorkflowInstanceLogEntry') WorkflowState = self.get_model('WorkflowState') WorkflowTransition = self.get_model('WorkflowTransition') 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') menu_facet.bind_links(links=(link_document_workflow_instance_list, ), sources=(Document, )) menu_object.bind_links( links=(link_setup_workflow_states, link_setup_workflow_transitions, link_setup_workflow_document_types, link_setup_workflow_edit, 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_setup_workflow_transition_delete), sources=(WorkflowTransition, )) menu_object.bind_links(links=(link_workflow_instance_detail, link_workflow_instance_transition), sources=(WorkflowInstance, )) 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_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, )) post_save.connect(launch_workflow, dispatch_uid='launch_workflow', sender=Document)
class_permissions(Document, [ PERMISSION_DOCUMENT_PROPERTIES_EDIT, PERMISSION_DOCUMENT_EDIT, PERMISSION_DOCUMENT_VIEW, PERMISSION_DOCUMENT_DELETE, PERMISSION_DOCUMENT_DOWNLOAD, PERMISSION_DOCUMENT_TRANSFORM, PERMISSION_DOCUMENT_NEW_VERSION, PERMISSION_DOCUMENT_VERSION_REVERT, PERMISSION_HISTORY_VIEW ]) document_search = SearchModel('documents', 'Document') document_search.add_model_field('document_type__name', label=_(u'Document type')) document_search.add_model_field('versions__mimetype', label=_(u'MIME type')) document_search.add_model_field('versions__filename', label=_(u'Filename')) document_search.add_model_field('metadata__metadata_type__name', label=_(u'Metadata type')) document_search.add_model_field('metadata__value', label=_(u'Metadata value')) document_search.add_model_field('versions__pages__content', label=_(u'Content')) document_search.add_model_field('description', label=_(u'Description')) document_search.add_model_field('tags__name', label=_(u'Tags')) document_search.add_related_field('comments', 'Comment', 'comment', 'object_pk', label=_(u'Comments')) namespace = StatisticNamespace(name='documents', label=_(u'Documents')) namespace.add_statistic(DocumentStatistics(name='document_stats', label=_(u'Document tendencies'))) namespace.add_statistic(DocumentUsageStatistics(name='document_usage', label=_(u'Document usage'))) endpoint = APIEndPoint('documents') endpoint.register_urls(api_urls) endpoint.add_endpoint('document-list', _(u'Returns a list of all the documents.'))
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' ) )
[ { "name": _(u"thumbnail"), "attribute": encapsulate( lambda x: staging_file_thumbnail(x, gallery_name="staging_list", title=x.filename, size="100") ), } ], ) register_setup(setup_sources) register_links( [ Document, "document_list_recent", "document_list", "document_create", "document_create_multiple", "upload_interactive", "staging_file_delete", ], [document_create_multiple], menu_name="secondary_menu", ) register_links(Document, [document_create_siblings]) endpoint = APIEndPoint("sources") endpoint.register_urls(api_urls) endpoint.add_endpoint("stagingfolder-list", _(u"Returns a list of all the staging folders and the files they contain."))
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') DashboardWidget(icon='fa fa-shopping-cart', queryset=DocumentCheckout.objects.all(), label=_('Checkedout documents'), link=reverse_lazy('checkouts:checkout_list')) 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, ), 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)