add multiaction support for "attribute task" action

This commit is contained in:
Frédéric Péters 2018-11-25 13:50:53 +01:00
parent 979f7c990c
commit 4a59ea5caa
2 changed files with 81 additions and 0 deletions

View File

@ -64,6 +64,13 @@
permission="cmf.AddPortalContent"
/>
<browser:page
name="multi_attribute_task"
for="*"
class=".multi_attribute_task.AttributeTasks"
permission="cmf.AddPortalContent"
/>
<!-- Custom comments viewlet for IBaseTask -->
<browser:viewlet
name="plone.comments"

View File

@ -0,0 +1,74 @@
# -*- 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.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 task_id in self.request.documents.split(','):
base_task = api.content.get(str(task_id))
self.widgets['title'].value = base_task.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',])
nontask.reindexObjectSecurity()
if 'attribute' in transition_ids:
portal_workflow.doActionFor(nontask, 'attribute')