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.
pfwbged.policy/src/pfwbged/policy/browser/multi_attribute_task.py

83 lines
2.8 KiB
Python

# -*- coding: utf-8 -*-
from copy import deepcopy
import z3c.form
from z3c.form import button
import zope.event
from zope.i18nmessageid.message import MessageFactory
from Products.CMFCore.utils import getToolByName
from plone import api
from plone.dexterity.browser.add import DefaultAddForm
from plone.dexterity.utils import createContentInContainer
from plone.stringinterp.adapters import _recursiveGetMembersFromIds
from collective.task import _
from collective.task.content.task import ITask
from collective.task.browser.attribute_task import find_nontask
class AttributeTasks(DefaultAddForm):
"Attribute multiple tasks"
portal_type = "task"
@property
def label(self):
return u"Attribuer les tâches"
@property
def action(self):
return self.request.getURL() + '?documents=' + self.request.documents
def updateWidgets(self):
"""Update widgets then add workflow_action value to workflow_action field"""
super(AttributeTasks, self).updateWidgets()
for obj_id in self.request.documents.split(','):
base_obj = api.content.get(str(obj_id))
if ITask.providedBy(base_obj):
self.widgets['title'].value = base_obj.title
break
else:
tasks = base_obj.listFolderContents({"portal_type": "task"})
if tasks:
self.widgets['title'].value = tasks[0].title
break
@button.buttonAndHandler(_('Add'), name='add')
def handleAdd(self, action):
data, errors = self.extractData()
if errors:
self.status = self.formErrorsMessage
return
for task_id in self.request.documents.split(','):
base_task = api.content.get(str(task_id))
self.attribute_task(base_task, data)
self._finishedAdd = True
return
def attribute_task(self, base_task, data):
seen = {}
nontask = find_nontask(base_task)
portal_workflow = getToolByName(nontask, 'portal_workflow')
transitions = portal_workflow.getTransitionsFor(nontask)
transition_ids = [t['id'] for t in transitions]
for responsible in data['responsible']:
if responsible in seen:
continue
_data = deepcopy(data)
_data['responsible'] = [responsible]
new_task = createContentInContainer(base_task, 'task', **_data)
seen[responsible] = True
for responsible in data['responsible']:
nontask.manage_addLocalRoles(responsible, ['Editor',])
if 'attribute' in transition_ids:
portal_workflow.doActionFor(nontask, 'attribute')
nontask.reindexObjectSecurity()
nontask.reindexObject(idxs=['allowedRolesAndUsers'])