From 475bbc7463ca16d3ba3edcc6861c5ee1a578dae5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20P=C3=A9ters?= Date: Wed, 12 Feb 2014 11:48:51 +0100 Subject: [PATCH] handle informing more than one person or group (#3825) --- .../task/browser/add_information.py | 47 +++++++++++-------- src/collective/task/content/information.py | 16 +++++++ 2 files changed, 44 insertions(+), 19 deletions(-) diff --git a/src/collective/task/browser/add_information.py b/src/collective/task/browser/add_information.py index aea75a5..bbce6e0 100644 --- a/src/collective/task/browser/add_information.py +++ b/src/collective/task/browser/add_information.py @@ -22,26 +22,35 @@ class AddInformation(DefaultAddForm): self.status = self.formErrorsMessage return - responsible = data['responsible'][0] - group = api.group.get(responsible) - if group is not None: - # responsible is a group, create an Information by user in this group - groupname = group.getId() - users = _recursiveGetMembersFromIds(portal, [groupname]) - objs = [] - for user in users: - username = user.getId() + objs = [] + seen = {} + for responsible in data['responsible']: + group = api.group.get(responsible) + if group is not None: + # responsible is a group, create an Information by user in this group + groupname = group.getId() + users = _recursiveGetMembersFromIds(portal, [groupname]) + for user in users: + username = user.getId() + if username in seen: + continue + _data = deepcopy(data) + _data['responsible'] = [username] + obj = self.createAndAdd(_data) + if obj is not None: + objs.append(obj) + seen[username] = True + else: + # responsible is a user + if responsible in seen: + continue _data = deepcopy(data) - _data['responsible'] = [username] + _data['responsible'] = [responsible] obj = self.createAndAdd(_data) if obj is not None: objs.append(obj) - if objs: - # mark only as finished if we get the new object - self._finishedAdd = True - else: - # responsible is a user - obj = self.createAndAdd(data) - if obj is not None: - # mark only as finished if we get the new object - self._finishedAdd = True + seen[responsible] = True + + if objs: + # mark only as finished if we get the new object + self._finishedAdd = True diff --git a/src/collective/task/content/information.py b/src/collective/task/content/information.py index 0373479..37bc587 100644 --- a/src/collective/task/content/information.py +++ b/src/collective/task/content/information.py @@ -1,4 +1,5 @@ from zope.interface import implements +from zope import schema from plone.autoform import directives as form from plone.dexterity.content import Item @@ -6,11 +7,26 @@ from plone.directives.form import default_value from collective.task.interfaces import IBaseTask +from collective.z3cform.rolefield.field import LocalRolesToPrincipals +from collective.dms.basecontent.widget import AjaxChosenMultiFieldWidget + +from collective.task import _ class IInformation(IBaseTask): """Schema for information""" form.mode(title='hidden') + responsible = LocalRolesToPrincipals( + title=_(u"Addressees"), + roles_to_assign=('Editor',), + value_type=schema.Choice( + vocabulary="dms.principals" + ), + min_length=1, + required=True, + ) + form.widget(responsible=AjaxChosenMultiFieldWidget) + class Information(Item): """Information content type"""