diff --git a/src/collective/task/browser/cancel_information.py b/src/collective/task/browser/cancel_information.py new file mode 100644 index 0000000..b5db9c5 --- /dev/null +++ b/src/collective/task/browser/cancel_information.py @@ -0,0 +1,88 @@ + +import z3c.form +from Products.CMFCore.utils import getToolByName +from collective.task import _ +from pfwbged.policy.subscribers.document import email_notification_of_canceled_information +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 responsibles_vocabulary(context): + acl_users = getToolByName(context, 'acl_users') + terms = [] + informations = context.listFolderContents(contentFilter={"portal_type": "information"}) + + for information in informations: + responsible_id = information.responsible[0] + user = acl_users.getUserById(responsible_id) + responsible_name = user.getProperty('fullname') or responsible_id + terms.append(SimpleVocabulary.createTerm(responsible_id, str(responsible_id), responsible_name)) + + return SimpleVocabulary(terms) + + +directlyProvides(responsibles_vocabulary, IContextSourceBinder) + + +class IInformationRecipients(model.Schema): + """""" + responsible = schema.List( + value_type=schema.Choice( + source=responsibles_vocabulary, + ), + ) + + +class CancelInformation(z3c.form.form.Form): + """Cancel (delete) one or more information + """ + + implements(z3c.form.interfaces.IFieldsForm) + fields = Fields(IInformationRecipients) + fields["responsible"].widgetFactory = CheckBoxFieldWidget + + label = _(u'Cancel information(s)') + description = _(u'Please select information notices 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 + + informations = self.context.listFolderContents(contentFilter={ + 'portal_type': 'information', + 'Creator': api.user.get_current().id, + }) + + for information in informations: + responsible_id = information.responsible[0] + if responsible_id in responsibles: + local_roles = self.context.get_local_roles_for_userid(responsible_id) + leftover_roles = set(local_roles).difference(['Editor']) + if leftover_roles: + # set leftover roles + self.context.manage_setLocalRoles(responsible_id, leftover_roles) + else: + # delete local roles for user + self.context.manage_delLocalRoles([responsible_id]) + + email_notification_of_canceled_information(information) + + self.context.manage_delObjects(information.id) + + self.request.response.redirect(self.context.absolute_url()) diff --git a/src/collective/task/browser/configure.zcml b/src/collective/task/browser/configure.zcml index 5186e5f..cdc68ef 100644 --- a/src/collective/task/browser/configure.zcml +++ b/src/collective/task/browser/configure.zcml @@ -27,6 +27,13 @@ permission="zope2.View" /> + +