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/subscribers.py

185 lines
7.4 KiB
Python
Raw Normal View History

2014-04-24 14:10:25 +02:00
import inspect
from logging import getLogger
from Acquisition import aq_parent
from five import grok
from OFS.interfaces import IObjectWillBeRemovedEvent
from zope.lifecycleevent.interfaces import IObjectAddedEvent, IObjectModifiedEvent
from zope.container.contained import ContainerModifiedEvent
from plone import api
2013-06-21 17:45:23 +02:00
from Products.DCWorkflow.interfaces import IAfterTransitionEvent
2013-06-24 14:08:03 +02:00
from collective.z3cform.rolefield.field import LocalRolesToPrincipalsDataManager
2013-06-25 15:51:08 +02:00
from collective.task.behaviors import ITarget
from collective.task.content.task import ITask
2013-06-24 14:08:03 +02:00
from collective.task.content.opinion import IOpinion
from collective.task.content.validation import IValidation
2013-06-25 15:51:08 +02:00
from collective.task.interfaces import IBaseTask
from collective.dms.basecontent.dmsdocument import IDmsDocument
2014-04-24 14:10:25 +02:00
log = getLogger(__name__)
def grant_local_role_to_responsible(context, role, target):
"""Grant local role to responsible on target"""
for responsible in context.responsible:
target.manage_addLocalRoles(responsible, [role])
2013-07-11 15:12:51 +02:00
target.reindexObject()
2013-06-21 17:45:23 +02:00
@grok.subscribe(ITask, IAfterTransitionEvent)
def task_changed_state(context, event):
"""When a task is abandoned or done, check if it is a subtask
and make the wanted transition to parent
"""
2014-04-24 14:10:25 +02:00
log.info(inspect.stack()[0][3])
2013-06-21 17:45:23 +02:00
parent = context.getParentNode()
if parent.portal_type == 'task':
with api.env.adopt_roles(['Reviewer']):
if event.new_state.id == 'done':
with api.env.adopt_user('admin'):
try:
api.content.transition(obj=parent, transition='subtask-done')
except api.exc.InvalidParameterError:
pass
2013-07-19 18:07:26 +02:00
parent.reindexObject(idxs=['review_state'])
2013-06-21 17:45:23 +02:00
elif event.new_state.id == 'abandoned':
# don't transition parent task if other subtasks are still live
sibling_subtasks = set(parent.listFolderContents()).difference([context])
if any([
task for task in sibling_subtasks
if api.content.get_state(task) not in ('abandoned', 'done')
]):
return
with api.env.adopt_user('admin'):
try:
api.content.transition(obj=parent, transition='subtask-abandoned')
except api.exc.InvalidParameterError:
pass
2013-07-19 18:07:26 +02:00
parent.reindexObject(idxs=['review_state'])
2013-06-21 17:45:23 +02:00
@grok.subscribe(ITask, IObjectWillBeRemovedEvent)
def reopen_parent_task(context, event):
"""When a task is deleted, reopen its parent task
"""
2014-04-24 14:10:25 +02:00
log.info(inspect.stack()[0][3])
parent = context.getParentNode()
parent_state = api.content.get_state(parent)
if parent.portal_type == 'task' and parent_state == 'attributed':
state = api.content.get_state(context)
if state == 'todo':
with api.env.adopt_roles(['Reviewer']):
api.content.transition(obj=context, transition='abandon')
context.reindexObject(idxs=['review_state'])
elif state == 'refusal-requested':
with api.env.adopt_roles(['Reviewer']):
api.content.transition(obj=context, transition='accept-refusal')
context.reindexObject(idxs=['review_state'])
elif state == 'in-progress':
with api.env.adopt_roles(['Editor']):
api.content.transition(obj=context, transition='ask-for-refusal')
context.reindexObject(idxs=['review_state'])
with api.env.adopt_roles(['Reviewer']):
api.content.transition(obj=context, transition='accept-refusal')
context.reindexObject(idxs=['review_state'])
2013-06-24 14:08:03 +02:00
@grok.subscribe(IBaseTask, IObjectAddedEvent)
def set_enquirer(context, event):
"""Set Enquirer field after task creation"""
2014-04-24 14:10:25 +02:00
log.info(inspect.stack()[0][3])
2013-06-24 14:08:03 +02:00
enquirer = api.user.get_current().id
enquirer_dm = LocalRolesToPrincipalsDataManager(context, IBaseTask['enquirer'])
2013-06-24 14:58:16 +02:00
enquirer_dm.set((enquirer,))
parent = aq_parent(context)
if IBaseTask.providedBy(parent):
# parent is also a task, we create Reader local role value on its own
# roles, unless parent enquirer is the greffier.
if not 'Greffier' in api.user.get_roles(parent.enquirer[0]):
for user_id, roles in parent.get_local_roles():
if 'Reader' in roles or 'Reviewer' in roles:
context.manage_addLocalRoles(user_id, ['Reader'])
context.reindexObjectSecurity()
context.reindexObject(idxs=['allowedRolesAndUsers', 'enquirer'])
2013-06-24 14:08:03 +02:00
2013-06-25 15:51:08 +02:00
@grok.subscribe(ITarget, IObjectAddedEvent)
def set_reader_on_target(context, event):
"""Set Reader role on target to responsible after opinion or validation creation"""
2014-04-24 14:10:25 +02:00
log.info(inspect.stack()[0][3])
if context.target:
target = context.target.to_object
grant_local_role_to_responsible(context, 'Reader', target)
2013-06-27 16:58:46 +02:00
@grok.subscribe(IValidation, IObjectAddedEvent)
def set_reviewer_on_target(context, event):
"""Set Reviewer role on target to responsible after validation creation"""
2014-04-24 14:10:25 +02:00
log.info(inspect.stack()[0][3])
if context.target:
target = context.target.to_object
grant_local_role_to_responsible(context, 'Reviewer', target)
@grok.subscribe(IValidation, IObjectAddedEvent)
@grok.subscribe(IOpinion, IObjectAddedEvent)
def set_contributor_on_document(context, event):
"""Set Contributor role on document to responsible after opinion and
validation creation. (Contributor can create a new version)
"""
2014-04-24 14:10:25 +02:00
log.info(inspect.stack()[0][3])
document = context.getParentNode()
grant_local_role_to_responsible(context, 'Contributor', document)
2014-03-26 10:42:00 +01:00
@grok.subscribe(IValidation, IObjectAddedEvent)
def set_editor_on_document(context, event):
"""Set Editor role on document to responsibile after validation
creation."""
2014-04-24 14:10:25 +02:00
log.info(inspect.stack()[0][3])
2014-03-26 10:42:00 +01:00
document = context.getParentNode()
grant_local_role_to_responsible(context, 'Editor', document)
@grok.subscribe(IDmsDocument, IObjectModifiedEvent)
def reindex_brain_metadata_on_basetask(doc, event):
2013-07-12 09:44:09 +02:00
"""Reindex brain metadatas when document is modified"""
2014-04-24 14:10:25 +02:00
log.info(inspect.stack()[0][3])
if isinstance(event, ContainerModifiedEvent):
return
catalog = api.portal.get_tool('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._unrestrictedGetObject().reindexObject(idxs=['id'])
@grok.subscribe(IOpinion, IAfterTransitionEvent)
def set_reader_on_versions(context, event):
2013-07-12 09:44:09 +02:00
"""Set Reader role on Opinion enquirer on all versions created by
the responsible when the Opinion is returned"""
2014-04-24 14:10:25 +02:00
log.info(inspect.stack()[0][3])
if event.new_state.id == 'done':
responsible = context.responsible[0]
enquirer = context.enquirer[0]
container_path = '/'.join(context.getParentNode().getPhysicalPath())
2013-08-30 19:08:37 +02:00
query = {'path': {'query': container_path},
'portal_type': 'dmsmainfile',
'Creator': responsible}
catalog = api.portal.get_tool('portal_catalog')
versions = catalog.searchResults(query)
for brain in versions:
version = brain.getObject()
version.manage_addLocalRoles(enquirer, ['Reader'])
version.reindexObject()