This repository has been archived on 2023-02-21. You can view files and clone it, but cannot push or open issues or pull requests.
collective.task/src/collective/task/indexers.py

60 lines
1.6 KiB
Python

from Acquisition import aq_parent
from five import grok
from plone.indexer.decorator import indexer
from Products.CMFCore.utils import getToolByName
from zope.lifecycleevent.interfaces import IObjectModifiedEvent
from zope.container.contained import ContainerModifiedEvent
from collective.dms.basecontent.dmsdocument import IDmsDocument
from collective.task.interfaces import IBaseTask
def get_document(obj):
parent = obj
while not IDmsDocument.providedBy(parent):
parent = aq_parent(parent)
if parent is None:
return obj
return parent
@indexer(IBaseTask)
def enquirer(obj, **kw):
return obj.enquirer and obj.enquirer[0] or ''
@indexer(IBaseTask)
def responsible(obj, **kw):
return obj.responsible and obj.responsible[0] or ''
@indexer(IBaseTask)
def deadline(obj, **kw):
return obj.deadline or obj.modified()
@indexer(IBaseTask)
def document_path(obj, **kw):
doc = get_document(obj)
return '/'.join(doc.getPhysicalPath())
@indexer(IBaseTask)
def document_title(obj, **kw):
doc = get_document(obj)
return doc.Title()
@grok.subscribe(IDmsDocument, IObjectModifiedEvent)
def reindex_brain_metadata_on_basetask(doc, event):
if isinstance(event, ContainerModifiedEvent):
return
catalog = getToolByName(doc, 'portal_catalog')
tasks = catalog.unrestrictedSearchResults({
'object_provides': IBaseTask.__identifier__,
'path': '/'.join(doc.getPhysicalPath())})
for b in tasks:
# reindex id index just to trigger the update of metadata on brain
b.getObject().reindexObject(idxs=['id'])