Source code for adhocracy_core.catalog.subscriber

"""Reindex subscribers.

Read :mod:`substanced.catalog.subscribers` for default reindex subscribers.
"""

from pyramid.traversal import get_current_registry
from substanced.util import find_service

from adhocracy_core.utils import get_visibility_change
from adhocracy_core.interfaces import VisibilityChange
from adhocracy_core.interfaces import IResource
from adhocracy_core.interfaces import IResourceSheetModified
from adhocracy_core.interfaces import ISheetBackReferenceModified
from adhocracy_core.interfaces import ISheetBackReferenceRemoved
from adhocracy_core.interfaces import IItem
from adhocracy_core.sheets.metadata import IMetadata
from adhocracy_core.sheets.versions import IVersionable
from adhocracy_core.sheets.rate import IRateable
from adhocracy_core.sheets.comment import IComment
from adhocracy_core.sheets.comment import ICommentable
from adhocracy_core.sheets.badge import IBadgeAssignment
from adhocracy_core.sheets.badge import IBadgeable
from adhocracy_core.sheets.principal import IEmailNew
from adhocracy_core.sheets.principal import IUserBasic
from adhocracy_core.sheets.principal import IUserExtended
from adhocracy_core.sheets.principal import IServiceKonto
from adhocracy_core.sheets.workflow import IWorkflowAssignment
from adhocracy_core.utils import list_resource_with_descendants


[docs]def reindex_tag(event): """Reindex tag index if a tag backreference is modified.""" catalogs = find_service(event.object, 'catalogs') catalogs.reindex_index(event.object, 'tag')
[docs]def reindex_rates(event): """Reindex the rates index if a rate backreference is modified.""" catalogs = find_service(event.object, 'catalogs') catalogs.reindex_index(event.object, 'rates')
[docs]def reindex_controversiality(event): """Reindex the controversiality index if backreference is modified.""" catalogs = find_service(event.object, 'catalogs') catalogs.reindex_index(event.object, 'controversiality')
[docs]def reindex_user_name(event): """Reindex indexes `user_name`.""" catalogs = find_service(event.object, 'catalogs') catalogs.reindex_index(event.object, 'user_name')
[docs]def reindex_user_email(event): """Reindex indexes `private_user_email`.""" catalogs = find_service(event.object, 'catalogs') catalogs.reindex_index(event.object, 'private_user_email')
[docs]def reindex_user_activation_path(event): """Reindex indexes `private_user_activation_path`.""" catalogs = find_service(event.object, 'catalogs') catalogs.reindex_index(event.object, 'private_user_activation_path')
[docs]def reindex_badge(event): """Reindex badge index if a backreference is modified/created.""" catalogs = find_service(event.object, 'catalogs') catalogs.reindex_index(event.object, 'badge')
[docs]def reindex_visibility(event): """Reindex the private_visibility index for all descendants if modified.""" visibility = get_visibility_change(event) if visibility in (VisibilityChange.concealed, VisibilityChange.revealed): _reindex_resource_and_descendants(event.object)
def _reindex_resource_and_descendants(resource: IResource): catalogs = find_service(resource, 'catalogs') if catalogs is None: # ease testing return resource_and_descendants = list_resource_with_descendants(resource) for res in resource_and_descendants: catalogs.reindex_index(res, 'private_visibility')
[docs]def reindex_item_badge(event): """Reindex `item_badge` for all item versions of èvent.object.""" catalogs = find_service(event.object, 'catalogs') children = event.object.values() versionables = (c for c in children if IVersionable.providedBy(c)) for versionable in versionables: catalogs.reindex_index(versionable, 'item_badge')
[docs]def reindex_workflow_state(event): """Reindex the workflow_state index for item and its versions.""" catalogs = find_service(event.object, 'catalogs') catalogs.reindex_index(event.object, 'workflow_state') children = event.object.values() versionables = (c for c in children if IVersionable.providedBy(c)) for versionable in versionables: catalogs.reindex_index(versionable, 'workflow_state')
[docs]def reindex_comments(event): """Reindex comments index if a backreference is modified/created.""" catalogs = find_service(event.object, 'catalogs') commentables = _get_affected_commentables(event.object) for commentable in commentables: catalogs.reindex_index(commentable, 'comments')
def _get_affected_commentables(commentable): registry = get_current_registry(commentable) commentables = [commentable] while IComment.providedBy(commentable): commentable = registry.content.get_sheet_field(commentable, IComment, 'refers_to') if commentable: commentables.append(commentable) return commentables
[docs]def reindex_user_text(event): """Reindex indexes `text`.""" catalogs = find_service(event.object, 'catalogs') catalogs.reindex_index(event.object, 'text')
[docs]def reindex_service_konto_userid(event): """Reindex indexes `private_service_konto_userid`.""" catalogs = find_service(event.object, 'catalogs') catalogs.reindex_index(event.object, 'private_service_konto_userid')
[docs]def includeme(config): """Register index subscribers.""" config.add_subscriber(reindex_tag, ISheetBackReferenceModified, object_iface=IVersionable) config.add_subscriber(reindex_visibility, IResourceSheetModified, event_isheet=IMetadata) config.add_subscriber(reindex_rates, ISheetBackReferenceModified, event_isheet=IRateable) config.add_subscriber(reindex_controversiality, ISheetBackReferenceModified, event_isheet=IRateable) config.add_subscriber(reindex_controversiality, ISheetBackReferenceModified, event_isheet=ICommentable) config.add_subscriber(reindex_badge, ISheetBackReferenceModified, event_isheet=IBadgeable) config.add_subscriber(reindex_badge, ISheetBackReferenceRemoved, event_isheet=IBadgeAssignment) config.add_subscriber(reindex_item_badge, ISheetBackReferenceModified, object_iface=IItem, event_isheet=IBadgeable) config.add_subscriber(reindex_workflow_state, IResourceSheetModified, event_isheet=IWorkflowAssignment) config.add_subscriber(reindex_user_name, IResourceSheetModified, event_isheet=IUserBasic) config.add_subscriber(reindex_user_email, IResourceSheetModified, event_isheet=IUserExtended) config.add_subscriber(reindex_user_activation_path, IResourceSheetModified, event_isheet=IUserBasic) config.add_subscriber(reindex_user_activation_path, IResourceSheetModified, event_isheet=IEmailNew) config.add_subscriber(reindex_comments, ISheetBackReferenceModified, event_isheet=ICommentable) config.add_subscriber(reindex_user_text, IResourceSheetModified, event_isheet=IUserBasic) config.add_subscriber(reindex_user_text, IResourceSheetModified, event_isheet=IUserExtended) config.add_subscriber(reindex_service_konto_userid, IResourceSheetModified, event_isheet=IServiceKonto) # add subscriber to updated allowed index config.scan('substanced.objectmap.subscribers')