From 884ec72de0cd2ee23b4c74f10345f23028ac7f22 Mon Sep 17 00:00:00 2001 From: Nicolas Demonte Date: Fri, 17 Jan 2020 17:35:34 +0100 Subject: [PATCH] Allow custom address in email selection #38844 --- setup.py | 1 + src/collective/dms/basecontent/configure.zcml | 11 +++++ src/collective/dms/basecontent/widget.py | 42 +++++++++++++++---- 3 files changed, 47 insertions(+), 7 deletions(-) diff --git a/setup.py b/setup.py index 77febb0..0326a8b 100755 --- a/setup.py +++ b/setup.py @@ -44,6 +44,7 @@ setup(name='collective.dms.basecontent', 'setuptools', 'five.grok', 'collective.documentviewer', + 'collective.select2', 'plone.api', 'plone.app.dexterity', 'plone.namedfile', diff --git a/src/collective/dms/basecontent/configure.zcml b/src/collective/dms/basecontent/configure.zcml index 4aacfb1..bc725ef 100644 --- a/src/collective/dms/basecontent/configure.zcml +++ b/src/collective/dms/basecontent/configure.zcml @@ -3,6 +3,7 @@ xmlns:grok="http://namespaces.zope.org/grok" xmlns:i18n="http://namespaces.zope.org/i18n" xmlns:genericsetup="http://namespaces.zope.org/genericsetup" + xmlns:browser="http://namespaces.zope.org/browser" i18n_domain="collective.dms.basecontent"> @@ -68,4 +69,14 @@ for=".dmsfile.IDmsFile" factory=".dmsfile.DmsFileWriteFile"/> + + + + diff --git a/src/collective/dms/basecontent/widget.py b/src/collective/dms/basecontent/widget.py index a226284..6990ea2 100644 --- a/src/collective/dms/basecontent/widget.py +++ b/src/collective/dms/basecontent/widget.py @@ -1,12 +1,12 @@ -import zope.component - -from zope.schema.interfaces import ISource, IContextSourceBinder -from zope.interface import implementer import z3c.form.interfaces - -from z3c.form import interfaces, util, value - +import zope.component +from collective.select2.browser import BaseSearch from collective.z3cform.chosen.widget import AjaxChosenMultiSelectionWidget +from z3c.form import interfaces +from zope.component import getUtility +from zope.interface import implementer +from zope.schema.interfaces import IVocabularyFactory + class CustomAjaxChosenMultiSelectionWidget(AjaxChosenMultiSelectionWidget): @property @@ -25,6 +25,7 @@ class CustomAjaxChosenMultiSelectionWidget(AjaxChosenMultiSelectionWidget): source.extra_default_values = adapter.get() return source + @implementer(z3c.form.interfaces.IFieldWidget) def AjaxChosenMultiFieldWidget(field, request): widget = z3c.form.widget.FieldWidget(field, @@ -32,3 +33,30 @@ def AjaxChosenMultiFieldWidget(field, request): widget.populate_select = True widget.ignoreMissing = True return widget + + +class LDAPEmailsSearch(BaseSearch): + """Search for LDAP emails, allow dynamic option selection""" + def results(self, search_term, add_terms=False): + factory = getUtility( + IVocabularyFactory, + 'collective.dms.basecontent.ldap_emails', + ) + vocabulary = factory(self.context) + found = False + + for term in vocabulary: + if search_term in term.token: + found = True + yield { + "text": term.value, + "id": term.value, + } + + # make the search term a selectable value + # if it doesn't match any existing email + if add_terms and not found: + yield { + "text": search_term, + "id": search_term + }