Skip to content

Commit 99eb021

Browse files
committed
Added validator on person's userid
1 parent ea4c8d3 commit 99eb021

File tree

5 files changed

+69
-1
lines changed

5 files changed

+69
-1
lines changed

CHANGES.rst

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ Changelog
2020
[sgeulette]
2121
- Added 'imio.annex' and iconified categories to dms files and dms appendix files.
2222
[sgeulette, chris-adam]
23+
- Added validator on person's userid.
24+
[chris-adam]
2325

2426
3.0 (2021-09-30)
2527
----------------

imio/dms/mail/content/behaviors.py

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
# -*- coding: utf-8 -*-
22
from collective.contact.plonegroup import _ as _ccp
3+
from collective.contact.plonegroup.behaviors import IPlonegroupUserLink
34
from collective.z3cform.datagridfield import DataGridFieldFactory
45
from collective.z3cform.datagridfield.registry import DictRow
56
from dexterity.localrolesfield.field import LocalRoleField
@@ -10,6 +11,7 @@
1011
from imio.dms.mail.utils import vocabularyname_to_terms
1112
from imio.helpers.content import uuidToObject
1213
from operator import itemgetter
14+
from plone import api
1315
from plone.autoform import directives as form
1416
from plone.autoform.interfaces import IFormFieldProvider
1517
from plone.supermodel import directives
@@ -208,3 +210,50 @@ def validate_signing(data):
208210
raise Invalid(_(u"You cannot have empty and defined approvings at the same time !"))
209211
if data.seal and not data.esign:
210212
raise Invalid(_(u"You cannot have a seal without electronic signature !"))
213+
214+
215+
@provider(IFormFieldProvider)
216+
class IImioPlonegroupUserLink(IPlonegroupUserLink):
217+
@invariant
218+
def validate_userid(data):
219+
context = data.__context__
220+
if not hasattr(context, 'userid') or getattr(context, 'userid', None) is None:
221+
return
222+
223+
# Raise if trying to remove an existing userid
224+
if data.userid is None:
225+
raise Invalid(_(u"You cannot remove a userid once it is set."))
226+
227+
# Raise if changing userid but user has pending esign approvals
228+
if data.userid != context.userid:
229+
catalog = api.portal.get_tool('portal_catalog')
230+
231+
# Get person(s) with approving held positions for the user
232+
hps = catalog.unrestrictedSearchResults(
233+
portal_type='held_position',
234+
userid=context.userid,
235+
)
236+
approving_persons = set()
237+
for b in hps:
238+
hp = b.getObject()
239+
if 'signer'in hp.usages or 'approving' in hp.usages:
240+
approving_persons.add(hp.get_person().UID())
241+
242+
# Get all persons with pending esign approvals
243+
mails = catalog.unrestrictedSearchResults(
244+
portal_type='dmsoutgoingmail',
245+
review_state='to_approve',
246+
)
247+
pending_approvings = set()
248+
for b in mails:
249+
mail = b.getObject()
250+
signers = mail.signers
251+
for signer in signers:
252+
for approving in signer.get('approvings', []):
253+
if approving == "_themself_":
254+
pending_approvings.add(uuidToObject(signer.get('signer'), unrestricted=True).get_person().UID())
255+
else:
256+
pending_approvings.add(approving)
257+
258+
if approving_persons.intersection(pending_approvings):
259+
raise Invalid(_(u"You cannot change the userid because the user has pending esign approvals."))

imio/dms/mail/content/configure.zcml

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
xmlns:zcml="http://namespaces.zope.org/zcml"
55
i18n_domain="imio.dms.mail">
66

7+
<include package="z3c.unconfigure" file="meta.zcml" />
8+
79
<include package="plone.behavior" file="meta.zcml" />
810

911
<include package="plone.directives.form" file="meta.zcml" />
@@ -40,4 +42,18 @@
4042
provides=".behaviors.ISigningBehavior"
4143
/>
4244

45+
<unconfigure package="collective.contact.plonegroup">
46+
<plone:behavior
47+
title="Plonegroup user link"
48+
description="Adds user related fields"
49+
provides="collective.contact.plonegroup.behaviors.IPlonegroupUserLink"
50+
/>
51+
</unconfigure>
52+
53+
<plone:behavior
54+
title="Plonegroup user link"
55+
description="Adds user related fields"
56+
provides=".behaviors.IImioPlonegroupUserLink"
57+
/>
58+
4359
</configure>

imio/dms/mail/migrations/migrate_to_3_1.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@ def run(self):
8686

8787
# signing
8888
self.runProfileSteps("imio.dms.mail", steps=["catalog", "plone.app.registry"])
89+
load_type_from_package("person", "imio.dms.mail:default") # behavior
8990
load_type_from_package("dmsoutgoingmail", "profile-imio.dms.mail:default") # behavior
9091
load_type_from_package("held_position", "profile-imio.dms.mail:default") # behavior
9192
load_type_from_package("dmsappendixfile", "profile-imio.dms.mail:default") # iconified

imio/dms/mail/profiles/default/types/person.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,6 @@
33
<property name="global_allow">True</property>
44
<property name="behaviors" purge="False">
55
<element value="plone.app.lockingbehavior.behaviors.ILocking" />
6-
<element value="collective.contact.plonegroup.behaviors.IPlonegroupUserLink" />
6+
<element value="imio.dms.mail.content.behaviors.IImioPlonegroupUserLink" />
77
</property>
88
</object>

0 commit comments

Comments
 (0)