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/browser/cancel_attribution.py

104 lines
3.4 KiB
Python

import z3c.form
from Products.CMFCore.utils import getToolByName
from attribute_task import find_nontask
from collective.task import _
from pfwbged.policy.subscribers.document import email_notification_of_canceled_subtask
from plone import api
from plone.supermodel import model
from z3c.form import button
from z3c.form.browser.checkbox import CheckBoxFieldWidget
from z3c.form.field import Fields
from z3c.form.interfaces import HIDDEN_MODE
from zope import schema
from zope.i18nmessageid import MessageFactory
from zope.interface import directlyProvides
from zope.interface import implements
from zope.schema.interfaces import IContextSourceBinder
from zope.schema.vocabulary import SimpleVocabulary
PMF = MessageFactory('plone')
def get_principal(principal_id):
principal = api.user.get(principal_id)
if not principal:
principal = api.group.get(principal_id)
return principal
def responsibles_vocabulary(context):
acl_users = getToolByName(context, 'acl_users')
terms = []
subtasks = context.listFolderContents()
responsible_ids = [subtask.responsible[0] for subtask in subtasks]
for responsible_id in responsible_ids:
group = acl_users.getGroupById(responsible_id)
user = acl_users.getUserById(responsible_id)
if group:
responsible_name = group.getProperty('title')
elif user:
responsible_name = user.getProperty('fullname')
else:
responsible_name = responsible_id
terms.append(SimpleVocabulary.createTerm(responsible_id, str(responsible_id), responsible_name))
return SimpleVocabulary(terms)
directlyProvides(responsibles_vocabulary, IContextSourceBinder)
class ITaskRecipients(model.Schema):
""""""
responsible = schema.List(
value_type=schema.Choice(
source=responsibles_vocabulary,
),
)
class CancelTaskAttribution(z3c.form.form.Form):
"""Cancel (delete) one or more subtasks
"""
implements(z3c.form.interfaces.IFieldsForm)
fields = Fields(ITaskRecipients)
fields["responsible"].widgetFactory = CheckBoxFieldWidget
label = _(u'Cancel attribution(s)')
description = _(u'Please select attributions to cancel. The responsibles will be notified by mail.')
ignoreContext = True
@button.buttonAndHandler(_('Apply'), name='apply')
def handleApply(self, action):
data, errors = self.extractData()
responsibles = data.get('responsible')
if not responsibles:
return
for subtask in self.context.listFolderContents():
responsible = subtask.responsible[0]
if responsible in responsibles:
# remove Editor on document
document = find_nontask(subtask)
local_roles = document.get_local_roles_for_userid(responsible)
leftover_roles = set(local_roles).difference(['Editor'])
if leftover_roles:
# set leftover roles
document.manage_setLocalRoles(responsible, leftover_roles)
else:
# delete local roles for user
document.manage_delLocalRoles([responsible])
# remove relevant subtask
self.context.manage_delObjects(subtask.id)
# notify responsible by mail it's removed
email_notification_of_canceled_subtask(subtask)
self.request.response.redirect(find_nontask(self.context).absolute_url())