def ready(self): super(TagsApp, self).ready() from .wizard_steps import WizardStepTags # NOQA Document = apps.get_model(app_label='documents', model_name='Document') DocumentPageResult = apps.get_model(app_label='documents', model_name='DocumentPageResult') DocumentTag = self.get_model(model_name='DocumentTag') Tag = self.get_model(model_name='Tag') Document.add_to_class(name='get_tags', value=method_document_get_tags) EventModelRegistry.register(model=Tag) ModelCopy(model=Tag, bind_link=True, register_permission=True).add_fields(field_names=( 'label', 'color', 'documents', ), ) ModelEventType.register(model=Tag, event_types=(event_tag_attach, event_tag_edited, event_tag_removed)) ModelFieldRelated(model=Document, name='tags__label') ModelFieldRelated(model=Document, name='tags__color') ModelPermission.register(model=Document, permissions=(permission_tag_attach, permission_tag_remove, permission_tag_view)) ModelPermission.register(model=Tag, permissions=( permission_acl_edit, permission_acl_view, permission_events_view, permission_tag_attach, permission_tag_delete, permission_tag_edit, permission_tag_remove, permission_tag_view, )) model_query_fields_document = ModelQueryFields.get(model=Document) model_query_fields_document.add_prefetch_related_field( field_name='tags') model_query_fields_tag = ModelQueryFields.get(model=Tag) model_query_fields_tag.add_prefetch_related_field( field_name='documents') SourceColumn(attribute='label', is_identifier=True, is_sortable=True, source=DocumentTag) SourceColumn(func=lambda context: widget_document_tags( document=context['object'], user=context['request'].user), label=_('Tags'), source=Document) SourceColumn(func=lambda context: widget_document_tags( document=context['object'].document, user=context['request'].user), label=_('Tags'), source=DocumentPageResult) SourceColumn(attribute='label', is_identifier=True, is_sortable=True, source=Tag) SourceColumn(attribute='get_preview_widget', include_label=True, source=Tag) source_column_tag_document_count = SourceColumn( func=lambda context: context['object'].get_document_count( user=context['request'].user), include_label=True, label=_('Documents'), source=Tag) source_column_tag_document_count.add_exclude(source=DocumentTag) menu_facet.bind_links(links=(link_document_tag_list, ), sources=(Document, )) menu_list_facet.bind_links(links=( link_acl_list, link_events_for_object, link_object_event_types_user_subcriptions_list, link_tag_document_list, ), sources=(Tag, )) 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_document_multiple_attach_multiple_tag, link_document_multiple_tag_multiple_remove), sources=(Document, )) menu_multi_item.bind_links(links=(link_tag_multiple_delete, ), sources=(Tag, )) menu_object.bind_links(links=(link_tag_edit, link_tag_delete), sources=(Tag, )) menu_secondary.bind_links( links=(link_document_tag_multiple_attach, link_document_tag_multiple_remove), sources=('tags:tag_attach', 'tags:document_tag_list', 'tags:single_document_multiple_tag_remove')) # Index update m2m_changed.connect(dispatch_uid='tags_handler_index_document', receiver=handler_index_document, sender=Tag.documents.through) pre_delete.connect(dispatch_uid='tags_handler_tag_pre_delete', receiver=handler_tag_pre_delete, sender=Tag)
def get_source_queryset(self): queryset = ModelQueryFields.get(model=self.tag_model).get_queryset() return queryset.filter(pk__in=self.get_tag_queryset())
def get_document_queryset(self): queryset = ModelQueryFields.get(model=Document).get_queryset() return queryset.filter(pk__in=queryset.order_by('-date_added') [:setting_recent_added_count.value].values( 'pk')).order_by('-date_added')
def get_source_queryset(self): queryset = ModelQueryFields.get(model=Document).get_queryset() return self.get_document_queryset().filter(pk__in=queryset)
def get_source_queryset(self): queryset = ModelQueryFields.get(model=DocumentPage).get_queryset() return queryset.filter(pk__in=self.external_object.pages.all())
def ready(self): super(DocumentsApp, self).ready() DeletedDocument = self.get_model(model_name='DeletedDocument') Document = self.get_model(model_name='Document') DocumentPage = self.get_model(model_name='DocumentPage') DocumentPageResult = self.get_model(model_name='DocumentPageResult') DocumentType = self.get_model(model_name='DocumentType') DocumentTypeFilename = self.get_model( model_name='DocumentTypeFilename') DocumentVersion = self.get_model(model_name='DocumentVersion') DuplicatedDocument = self.get_model(model_name='DuplicatedDocument') link_decorations_list = link_transformation_list.copy( layer=layer_decorations) link_decorations_list.text = _('Decorations') DynamicSerializerField.add_serializer( klass=Document, serializer_class= 'mayan.apps.documents.serializers.DocumentSerializer') EventModelRegistry.register(model=DeletedDocument) EventModelRegistry.register(model=Document) EventModelRegistry.register(model=DocumentType) EventModelRegistry.register(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') ModelCopy(model=DocumentTypeFilename).add_fields( field_names=('document_type', 'filename', 'enabled')) ModelCopy(model=DocumentType, bind_link=True, register_permission=True).add_fields( field_names=('label', 'trash_time_period', 'trash_time_unit', 'delete_time_period', 'delete_time_unit', 'filenames')) ModelEventType.register(model=DocumentType, event_types=( event_document_create, event_document_type_created, event_document_type_edited, )) ModelEventType.register(model=Document, event_types=(event_document_download, event_document_properties_edit, event_document_type_changed, event_document_version_new, event_document_version_revert, event_document_view)) ModelField(model=Document, name='description') ModelField(model=Document, name='date_added') ModelField(model=Document, name='deleted_date_time') ModelField(model=Document, name='document_type') ModelField(model=Document, name='in_trash') ModelField(model=Document, name='is_stub') ModelField(model=Document, name='label') ModelField(model=Document, name='language') ModelField(model=Document, name='uuid') ModelFieldRelated(model=Document, name='document_type__label') ModelFieldRelated(model=Document, name='versions__checksum') ModelFieldRelated(model=Document, label=_('Versions comment'), name='versions__comment') ModelFieldRelated(model=Document, label=_('Versions encoding'), name='versions__encoding') ModelFieldRelated(model=Document, label=_('Versions mime type'), name='versions__mimetype') ModelFieldRelated(model=Document, label=_('Versions timestamp'), name='versions__timestamp') ModelField(model=DocumentPage, label=_('Document version'), name='document_version') ModelField(model=DocumentPage, label=_('Page number'), name='page_number') ModelProperty( description=_('Return the lastest version of the document.'), model=Document, label=_('Latest version'), name='latest_version') ModelProperty(description=_('Return the document instance.'), model=DocumentPage, label=_('Document'), name='document') 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_tools, 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, permission_acl_edit, permission_acl_view, permission_events_view, )) ModelPermission.register_inheritance( model=Document, related='document_type', ) ModelPermission.register_inheritance( model=DocumentPage, related='document_version__document', ) ModelPermission.register_inheritance( model=DocumentPageResult, related='document_version__document', ) ModelPermission.register_inheritance( model=DocumentTypeFilename, related='document_type', ) ModelPermission.register_inheritance( model=DocumentVersion, related='document', ) model_query_fields_document = ModelQueryFields(model=Document) model_query_fields_document.add_prefetch_related_field( field_name='versions') model_query_fields_document.add_prefetch_related_field( field_name='versions__version_pages') model_query_fields_document.add_select_related_field( field_name='document_type') model_query_fields_document_version = ModelQueryFields( model=DocumentVersion) model_query_fields_document_version.add_prefetch_related_field( field_name='version_pages') model_query_fields_document_version.add_select_related_field( field_name='document') model_query_fields_document_page = ModelQueryFields(model=DocumentPage) model_query_fields_document_page.add_select_related_field( field_name='document_version') # Document and document page thumbnail widget document_page_thumbnail_widget = DocumentPageThumbnailWidget() # Document SourceColumn(attribute='label', is_object_absolute_url=True, is_identifier=True, is_sortable=True, source=Document) SourceColumn(func=lambda context: document_page_thumbnail_widget. render(instance=context['object']), html_extra_classes='text-center document-thumbnail-list', label=_('Thumbnail'), source=Document) SourceColumn( attribute='document_type', is_sortable=True, source=Document, ) SourceColumn(func=lambda context: widget_document_page_number( document=context['object']), label=_('Pages'), source=Document) SourceColumn(attribute='date_added', include_label=True, is_sortable=True, source=Document, views=('documents:document_list_recent_added', )) SourceColumn(func=lambda context: DuplicatedDocument.objects.get( document=context['object']).documents.count(), include_label=True, label=_('Duplicates'), source=Document, views=('documents:duplicated_document_list', )) # DocumentPage SourceColumn(attribute='get_label', is_identifier=True, is_object_absolute_url=True, source=DocumentPage, widget_condition=is_document_page_enabled) SourceColumn(func=lambda context: document_page_thumbnail_widget. render(instance=context['object']), html_extra_classes='text-center document-thumbnail-list', label=_('Thumbnail'), source=DocumentPage) SourceColumn(attribute='enabled', include_label=True, source=DocumentPage, widget=TwoStateWidget) SourceColumn(attribute='page_number', include_label=True, source=DocumentPage) SourceColumn(attribute='get_label', is_identifier=True, is_object_absolute_url=True, source=DocumentPageResult) SourceColumn(func=lambda context: document_page_thumbnail_widget. render(instance=context['object']), html_extra_classes='text-center document-thumbnail-list', label=_('Thumbnail'), source=DocumentPageResult) SourceColumn(attribute='document_version.document.document_type', label=_('Type'), source=DocumentPageResult) # DocumentType SourceColumn(attribute='label', is_identifier=True, is_sortable=True, source=DocumentType) SourceColumn(func=lambda context: context['object'].get_document_count( user=context['request'].user), include_label=True, label=_('Documents'), source=DocumentType) SourceColumn(attribute='filename', is_identifier=True, is_sortable=True, source=DocumentTypeFilename) SourceColumn(attribute='enabled', include_label=True, is_sortable=True, source=DocumentTypeFilename, widget=TwoStateWidget) # DeletedDocument SourceColumn(attribute='label', is_identifier=True, is_sortable=True, source=DeletedDocument) SourceColumn(attribute='deleted_date_time', include_label=True, order=99, source=DeletedDocument) # DocumentVersion SourceColumn(source=DocumentVersion, attribute='timestamp', is_identifier=True, is_object_absolute_url=True) SourceColumn(func=lambda context: document_page_thumbnail_widget. render(instance=context['object']), html_extra_classes='text-center document-thumbnail-list', label=_('Thumbnail'), source=DocumentVersion) SourceColumn(func=lambda context: widget_document_version_page_number( document_version=context['object']), label=_('Pages'), source=DocumentVersion) SourceColumn(attribute='mimetype', is_sortable=True, source=DocumentVersion) SourceColumn(attribute='encoding', is_sortable=True, source=DocumentVersion) SourceColumn(attribute='comment', is_sortable=True, source=DocumentVersion) Template(name='invalid_document', template_name='documents/invalid_document.html') dashboard_main.add_widget(widget=DashboardWidgetDocumentsTotal, order=0) dashboard_main.add_widget(widget=DashboardWidgetDocumentPagesTotal, order=1) dashboard_main.add_widget(widget=DashboardWidgetDocumentsInTrash, order=2) dashboard_main.add_widget(widget=DashboardWidgetDocumentsTypesTotal, order=3) dashboard_main.add_widget(widget=DashboardWidgetDocumentsNewThisMonth, order=4) dashboard_main.add_widget( widget=DashboardWidgetDocumentsPagesNewThisMonth, order=5) menu_documents.bind_links(links=( link_document_list_recent_access, link_document_list_recent_added, link_document_list_favorites, link_document_list, link_document_list_deleted, link_duplicated_document_list, )) menu_main.bind_links(links=(menu_documents, ), position=0) menu_setup.bind_links(links=(link_document_type_setup, )) menu_tools.bind_links(links=(link_duplicated_document_scan, )) # Document type links menu_list_facet.bind_links(links=( link_document_type_filename_list, link_document_type_policies, link_document_type_filename_generator, link_acl_list, link_object_event_types_user_subcriptions_list, link_events_for_object, ), sources=(DocumentType, )) menu_object.bind_links(links=(link_document_type_delete, link_document_type_edit), 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_secondary.bind_links( links=(link_document_type_filename_create, ), sources=(DocumentTypeFilename, 'documents:document_type_filename_list', 'documents:document_type_filename_create')) menu_secondary.bind_links(links=(link_trash_can_empty, ), sources=('documents:document_list_deleted', 'documents:trash_can_empty')) # Document object links menu_object.bind_links(links=( link_document_favorites_add, link_document_favorites_remove, link_document_edit, link_document_document_type_edit, link_document_print, link_document_trash, link_document_quick_download, link_document_download, link_document_clear_transformations, link_document_clone_transformations, link_document_update_page_count, ), sources=(Document, )) menu_object.bind_links(links=(link_document_restore, link_document_delete), sources=(DeletedDocument, )) # Document facet links menu_facet.bind_links(links=( link_document_duplicates_list, link_acl_list, ), sources=(Document, )) menu_facet.bind_links(links=(link_document_preview, ), sources=(Document, ), position=0) menu_facet.bind_links(links=(link_document_properties, ), sources=(Document, ), position=2) menu_facet.bind_links(links=( link_events_for_object, link_object_event_types_user_subcriptions_list, link_document_version_list, ), sources=(Document, ), position=2) menu_facet.bind_links(links=(link_document_pages, ), sources=(Document, )) # Document actions menu_object.bind_links(links=(link_document_version_revert, link_document_version_download), sources=(DocumentVersion, )) menu_multi_item.bind_links(links=( link_document_multiple_favorites_add, link_document_multiple_favorites_remove, link_document_multiple_clear_transformations, link_document_multiple_trash, link_document_multiple_download, link_document_multiple_update_page_count, link_document_multiple_document_type_edit, ), sources=(Document, )) # Document pages menu_facet.add_unsorted_source(source=DocumentPage) menu_facet.bind_links( links=(link_document_page_rotate_left, link_document_page_rotate_right, link_document_page_zoom_in, link_document_page_zoom_out, link_document_page_view_reset), sources=('documents:document_page_view', )) menu_facet.bind_links(links=(link_document_page_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), sources=(DocumentPage, )) menu_list_facet.bind_links(links=(link_decorations_list, ), sources=(DocumentPage, )) menu_list_facet.bind_links(links=(link_transformation_list, ), sources=(DocumentPage, )) menu_multi_item.bind_links(links=(link_document_page_multiple_disable, link_document_page_multiple_enable), sources=(DocumentPage, )) menu_object.bind_links(links=(link_document_page_disable, link_document_page_enable), sources=(DocumentPage, )) menu_related.bind_links(links=(link_document_page_return, ), sources=(DocumentPage, )) # Document versions menu_list_facet.bind_links(links=(link_document_version_view, ), sources=(DocumentVersion, )) menu_related.bind_links( links=(link_document_version_return_document, ), sources=(DocumentVersion, )) menu_secondary.bind_links(links=(link_document_version_return_list, ), sources=(DocumentVersion, )) # Trashed documents menu_multi_item.add_proxy_exclusion(source=DeletedDocument) menu_multi_item.bind_links(links=(link_document_multiple_restore, link_document_multiple_delete), sources=(DeletedDocument, )) post_delete.connect( dispatch_uid='documents_handler_remove_empty_duplicates_lists', receiver=handler_remove_empty_duplicates_lists, sender=Document) post_migrate.connect( dispatch_uid='documents_handler_create_document_cache', receiver=handler_create_document_cache, ) signal_post_initial_setup.connect( dispatch_uid='documents_handler_create_default_document_type', receiver=handler_create_default_document_type) signal_post_version_upload.connect( dispatch_uid='documents_handler_scan_duplicates_for', receiver=handler_scan_duplicates_for)
def pages(self): DocumentPage = apps.get_model( app_label='documents', model_name='DocumentPage' ) queryset = ModelQueryFields.get(model=DocumentPage).get_queryset() return queryset.filter(pk__in=self.version_pages.all())
def ready(self): super(MetadataApp, self).ready() from .wizard_steps import WizardStepMetadata # NOQA 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(model_name='DocumentMetadata') DocumentTypeMetadataType = self.get_model( model_name='DocumentTypeMetadataType') MetadataType = self.get_model(model_name='MetadataType') Document.add_to_class(name='metadata_value_of', value=DocumentMetadataHelper.constructor) EventModelRegistry.register(model=MetadataType) EventModelRegistry.register(model=DocumentTypeMetadataType) ModelCopy(model=DocumentTypeMetadataType, ).add_fields( field_names=('document_type', 'metadata_type', 'required')) ModelCopy(model=MetadataType, bind_link=True, register_permission=True).add_fields( field_names=('name', 'label', 'default', 'lookup', 'validation', 'parser', 'document_types'), ) ModelProperty( model=Document, name='metadata_value_of.< metadata type name >', description=_('Return the value of a specific document metadata.'), label=_('Metadata value of')) ModelFieldRelated(model=Document, name='metadata__metadata_type__name', label=_('Metadata type name')) ModelFieldRelated(model=Document, name='metadata__value', label=_('Metadata type value')) ModelEventType.register(model=Document, event_types=( event_document_metadata_added, event_document_metadata_edited, event_document_metadata_removed, )) ModelEventType.register(model=MetadataType, event_types=(event_document_metadata_added, event_document_metadata_edited, event_document_metadata_removed, event_metadata_type_edited, event_metadata_type_relationship)) ModelEventType.register( model=DocumentType, event_types=(event_metadata_type_relationship, )) ModelPermission.register( model=Document, permissions=(permission_document_metadata_add, permission_document_metadata_edit, permission_document_metadata_remove, permission_document_metadata_view)) ModelPermission.register( model=MetadataType, permissions=(permission_acl_edit, permission_acl_view, permission_document_metadata_add, permission_document_metadata_edit, permission_document_metadata_remove, permission_document_metadata_view, permission_events_view, permission_metadata_type_delete, permission_metadata_type_edit, permission_metadata_type_view)) ModelPermission.register_inheritance( model=DocumentMetadata, related='metadata_type', ) model_query_fields_document = ModelQueryFields(model=Document) model_query_fields_document.add_prefetch_related_field( field_name='metadata') SourceColumn(source=Document, label=_('Metadata'), func=widget_document_metadata) SourceColumn(source=DocumentPageResult, label=_('Metadata'), func=widget_document_metadata) SourceColumn(attribute='metadata_type', is_identifier=True, is_sortable=True, source=DocumentMetadata) SourceColumn(attribute='value', include_label=True, is_sortable=True, source=DocumentMetadata) SourceColumn(attribute='is_required', include_label=True, source=DocumentMetadata, widget=TwoStateWidget) SourceColumn(attribute='label', is_identifier=True, is_sortable=True, source=MetadataType) SourceColumn(attribute='name', include_label=True, is_sortable=True, source=MetadataType) menu_facet.bind_links(links=(link_metadata_view, ), sources=(Document, )) menu_list_facet.bind_links( links=(link_setup_document_type_metadata_types, ), sources=(DocumentType, )) menu_multi_item.bind_links(links=(link_metadata_multiple_add, link_metadata_multiple_edit, link_metadata_multiple_remove), sources=(Document, )) menu_list_facet.bind_links(links=( link_acl_list, link_setup_metadata_type_document_types, link_object_event_types_user_subcriptions_list, link_events_for_object, ), sources=(MetadataType, )) menu_object.bind_links(links=(link_setup_metadata_type_delete, link_setup_metadata_type_edit), sources=(MetadataType, )) menu_related.bind_links(links=(link_setup_metadata_type_list, ), sources=(DocumentType, 'documents:document_type_list', 'documents:document_type_create')) menu_related.bind_links( links=(link_document_type_list, ), sources=(MetadataType, 'metadata:setup_metadata_type_list', 'metadata:setup_metadata_type_create')) 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_secondary.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( dispatch_uid= 'metadata_handler_post_document_type_metadata_type_delete', receiver=handler_post_document_type_metadata_type_delete, sender=DocumentTypeMetadataType) post_save.connect( dispatch_uid= 'metadata_handler_post_document_type_metadata_type_add', receiver=handler_post_document_type_metadata_type_add, sender=DocumentTypeMetadataType) signal_post_document_type_change.connect( dispatch_uid='metadata_handler_post_document_type_change_metadata', receiver=handler_post_document_type_change_metadata, sender=Document) # Index updating post_delete.connect( dispatch_uid='metadata_handler_index_document_delete', receiver=handler_index_document, sender=DocumentMetadata) post_save.connect(dispatch_uid='metadata_handler_index_document_save', receiver=handler_index_document, sender=DocumentMetadata)
def ready(self): super(CabinetsApp, self).ready() from .wizard_steps import WizardStepCabinets # NOQA Cabinet = self.get_model(model_name='Cabinet') CabinetSearchResult = self.get_model(model_name='CabinetSearchResult') Document = apps.get_model(app_label='documents', model_name='Document') DocumentCabinet = self.get_model(model_name='DocumentCabinet') DocumentPageResult = apps.get_model(app_label='documents', model_name='DocumentPageResult') # Add explicit order_by as DocumentCabinet ordering Meta option has no # effect. Document.add_to_class(name='get_cabinets', value=method_document_get_cabinets) EventModelRegistry.register(model=Cabinet) def cabinet_model_copy_condition(instance): return instance.is_root_node() def cabinet_unique_conditional(instance, new_instance_dictionary): if instance.parent: return instance.parent_id == new_instance_dictionary[ 'parent_id'] and instance.label == new_instance_dictionary[ 'label'] else: return not new_instance_dictionary[ 'parent_id'] and instance.label == new_instance_dictionary[ 'label'] ModelCopy(model=Cabinet, condition=cabinet_model_copy_condition, bind_link=True, register_permission=True).add_fields( field_names=('label', 'documents'), unique_conditional={'label': cabinet_unique_conditional}) ModelEventType.register(model=Cabinet, event_types=(event_cabinet_edited, event_cabinet_add_document, event_cabinet_remove_document)) ModelPermission.register( model=Document, permissions=(permission_cabinet_add_document, permission_cabinet_remove_document, permission_events_view)) ModelPermission.register( model=Cabinet, permissions=(permission_acl_edit, permission_acl_view, permission_cabinet_delete, permission_cabinet_edit, permission_cabinet_view, permission_cabinet_add_document, permission_cabinet_remove_document)) model_query_fields_document = ModelQueryFields(model=Document) model_query_fields_document.add_prefetch_related_field( field_name='cabinets') def get_root_filter(): return { 'acl_filter': { 'level': 0 }, 'acl_values': ('tree_id', ), 'field_lookup': 'tree_id__in' } ModelPermission.register_field_query_function(model=Cabinet, function=get_root_filter) SourceColumn(attribute='label', is_identifier=True, is_sortable=True, source=Cabinet) SourceColumn(attribute='label', is_identifier=True, is_sortable=True, source=CabinetSearchResult) SourceColumn(attribute='get_full_path', source=CabinetSearchResult) SourceColumn(func=lambda context: widget_document_cabinets( document=context['object'], user=context['request'].user), label=_('Cabinets'), order=1, source=Document) SourceColumn(func=lambda context: widget_document_cabinets( document=context['object'].document, user=context['request'].user), label=_('Cabinets'), order=1, source=DocumentPageResult) menu_facet.bind_links(links=(link_document_cabinet_list, ), sources=(Document, )) menu_cabinets.bind_links(links=(link_cabinet_list, link_cabinet_create)) menu_list_facet.bind_links(links=( link_cabinet_view, link_custom_acl_list, link_events_for_object, link_object_event_types_user_subcriptions_list, ), sources=(Cabinet, CabinetSearchResult)) menu_main.bind_links(links=(menu_cabinets, ), position=98) menu_multi_item.bind_links( links=(link_document_multiple_cabinet_add, link_multiple_document_cabinet_remove), sources=(Document, )) menu_object.bind_links(links=(link_cabinet_view, ), sources=(DocumentCabinet, )) menu_object.bind_links(links=(link_cabinet_delete, link_cabinet_edit, link_cabinet_child_add), sources=(Cabinet, CabinetSearchResult)) menu_object.unbind_links(links=(link_cabinet_delete, link_cabinet_edit, link_cabinet_child_add), sources=(DocumentCabinet, )) menu_secondary.bind_links(links=(link_document_cabinet_add, link_document_cabinet_remove), sources=('cabinets:document_cabinet_list', 'cabinets:document_cabinet_add', 'cabinets:document_cabinet_remove'))