From c96f873cbeefce4d610fd70115a721dd38f4d77d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jordi=20Puiggen=C3=A9?= Date: Thu, 23 Jan 2020 14:46:28 +0100 Subject: [PATCH 1/5] Support for ";" separator in CCEmails --- bika/lims/browser/publish/emailview.py | 3 ++- bika/lims/browser/publish/reports_listing.py | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/bika/lims/browser/publish/emailview.py b/bika/lims/browser/publish/emailview.py index 93bb984544..ca83eb4305 100644 --- a/bika/lims/browser/publish/emailview.py +++ b/bika/lims/browser/publish/emailview.py @@ -20,6 +20,7 @@ import inspect import itertools +import re from collections import OrderedDict from string import Template @@ -728,7 +729,7 @@ def recipient_from_email(email): # CC Contacts cc = filter(None, map(recipient_from_contact, ar.getCCContact())) # CC Emails - cc_emails = map(lambda x: x.strip(), ar.getCCEmails().split(",")) + cc_emails = map(lambda x: x.strip(), re.split("[;,]", ar.getCCEmails())) cc_emails = filter(None, map(recipient_from_email, cc_emails)) return to + cc + cc_emails diff --git a/bika/lims/browser/publish/reports_listing.py b/bika/lims/browser/publish/reports_listing.py index 018a3dcc89..b926cc20ad 100644 --- a/bika/lims/browser/publish/reports_listing.py +++ b/bika/lims/browser/publish/reports_listing.py @@ -19,6 +19,7 @@ # Some rights reserved, see README and LICENSE. import collections +import re from bika.lims import api from bika.lims import bikaMessageFactory as _BMF @@ -242,7 +243,7 @@ def recipient_from_email(email): # CC Contacts cc = filter(None, map(recipient_from_contact, ar.getCCContact())) # CC Emails - cc_emails = map(lambda x: x.strip(), ar.getCCEmails().split(",")) + cc_emails = map(lambda x: x.strip(), re.split("[;,]", ar.getCCEmails())) cc_emails = filter(None, map(recipient_from_email, cc_emails)) return to + cc + cc_emails From 5bc9fa36d58348456251904cc274d10c8d0aa761 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jordi=20Puiggen=C3=A9?= Date: Thu, 23 Jan 2020 14:52:16 +0100 Subject: [PATCH 2/5] Changelog --- CHANGES.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGES.rst b/CHANGES.rst index 6fcc088bda..806be3dc3e 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -7,6 +7,7 @@ Changelog **Added** +- #1507 Support for semi-colon character separator in CCEmails field - #1499 Moved navigation portlet into core - #1498 Moved all viewlets from senaite.lims to senaite.core - #1505 Display partition link in analyses listing From e20fa0d381ccb44d020f080e91c9034f3b5dcdf4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jordi=20Puiggen=C3=A9?= Date: Thu, 23 Jan 2020 15:28:22 +0100 Subject: [PATCH 3/5] Added EmailsField to set value properly --- bika/lims/browser/fields/__init__.py | 1 + bika/lims/browser/fields/emailsfield.py | 46 +++++++++++++++++++++++++ bika/lims/content/analysisrequest.py | 3 +- bika/lims/content/client.py | 3 +- 4 files changed, 51 insertions(+), 2 deletions(-) create mode 100644 bika/lims/browser/fields/emailsfield.py diff --git a/bika/lims/browser/fields/__init__.py b/bika/lims/browser/fields/__init__.py index 5c37b80e51..d366dca597 100644 --- a/bika/lims/browser/fields/__init__.py +++ b/bika/lims/browser/fields/__init__.py @@ -29,3 +29,4 @@ from .reflexrulefield import ReflexRuleField from .proxyfield import ProxyField from .uidreferencefield import UIDReferenceField +from .emailsfield import EmailsField diff --git a/bika/lims/browser/fields/emailsfield.py b/bika/lims/browser/fields/emailsfield.py new file mode 100644 index 0000000000..6a3f91137f --- /dev/null +++ b/bika/lims/browser/fields/emailsfield.py @@ -0,0 +1,46 @@ +# -*- coding: utf-8 -*- +# +# This file is part of SENAITE.CORE. +# +# SENAITE.CORE is free software: you can redistribute it and/or modify it under +# the terms of the GNU General Public License as published by the Free Software +# Foundation, version 2. +# +# This program is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more +# details. +# +# You should have received a copy of the GNU General Public License along with +# this program; if not, write to the Free Software Foundation, Inc., 51 +# Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +# +# Copyright 2018-2020 by it's authors. +# Some rights reserved, see README and LICENSE. + +import re + +from Products.Archetypes.Field import StringField +from Products.Archetypes.Registry import registerField + + +class EmailsField(StringField): + """Field for string representation of a list of emails + """ + _properties = StringField._properties.copy() + _properties.update({ + "type": "emails_field", + }) + + def set(self, instance, value, **kwargs): + if value: + # Standardize to comma-separated and remove duplicates + values = re.split("[;,]", value) + values = list(set(values)) + value = ", ".join(values) + super(EmailsField, self).set(instance, value, **kwargs) + + +registerField(EmailsField, + title="Emails", + description="Used for storing e-mail addresses in string format") diff --git a/bika/lims/content/analysisrequest.py b/bika/lims/content/analysisrequest.py index 53d5255680..8f97cc101c 100644 --- a/bika/lims/content/analysisrequest.py +++ b/bika/lims/content/analysisrequest.py @@ -33,6 +33,7 @@ from bika.lims.browser.fields import DateTimeField from bika.lims.browser.fields import DurationField from bika.lims.browser.fields import UIDReferenceField +from bika.lims.browser.fields import EmailsField from bika.lims.browser.fields.remarksfield import RemarksField from bika.lims.browser.widgets import DateTimeWidget from bika.lims.browser.widgets import DecimalWidget @@ -204,7 +205,7 @@ ), ), - StringField( + EmailsField( 'CCEmails', mode="rw", read_permission=View, diff --git a/bika/lims/content/client.py b/bika/lims/content/client.py index 79f9c650d5..1fb93c369a 100644 --- a/bika/lims/content/client.py +++ b/bika/lims/content/client.py @@ -36,6 +36,7 @@ from bika.lims import _ from bika.lims import api +from bika.lims.browser.fields import EmailsField from bika.lims.browser.widgets import ReferenceWidget from bika.lims.catalog.bikasetup_catalog import SETUP_CATALOG from bika.lims.config import ARIMPORT_OPTIONS @@ -73,7 +74,7 @@ ), ), - StringField( + EmailsField( "CCEmails", schemata="Preferences", mode="rw", From 68effdf5353f9d3abf26509bc105d72735e7fd11 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jordi=20Puiggen=C3=A9?= Date: Thu, 23 Jan 2020 15:32:03 +0100 Subject: [PATCH 4/5] getCCEmails returns a string --- bika/lims/browser/analysisrequest/add2.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bika/lims/browser/analysisrequest/add2.py b/bika/lims/browser/analysisrequest/add2.py index 00ab0d637c..460398c965 100644 --- a/bika/lims/browser/analysisrequest/add2.py +++ b/bika/lims/browser/analysisrequest/add2.py @@ -1064,7 +1064,7 @@ def get_primaryanalysisrequest_info(self, obj): "Client": self.to_field_value(client), "Contact": self.to_field_value(contact), "CCContact": map(self.to_field_value, cccontacts), - "CCEmails": obj.getCCEmails() or [], + "CCEmails": obj.getCCEmails(), "Batch": self.to_field_value(batch), "DateSampled": {"value": self.to_iso_date(obj.getDateSampled())}, "SamplingDate": {"value": self.to_iso_date(obj.getSamplingDate())}, From add16a00cd6ce52aacf4c4c8e0d9d4a33462db13 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jordi=20Puiggen=C3=A9?= Date: Thu, 23 Jan 2020 15:55:47 +0100 Subject: [PATCH 5/5] Add optional parameter as_list in EmailsField getter --- bika/lims/browser/fields/emailsfield.py | 23 +++++++++++++++++--- bika/lims/browser/publish/emailview.py | 2 +- bika/lims/browser/publish/reports_listing.py | 2 +- 3 files changed, 22 insertions(+), 5 deletions(-) diff --git a/bika/lims/browser/fields/emailsfield.py b/bika/lims/browser/fields/emailsfield.py index 6a3f91137f..3c394666fc 100644 --- a/bika/lims/browser/fields/emailsfield.py +++ b/bika/lims/browser/fields/emailsfield.py @@ -35,11 +35,28 @@ class EmailsField(StringField): def set(self, instance, value, **kwargs): if value: # Standardize to comma-separated and remove duplicates - values = re.split("[;,]", value) - values = list(set(values)) - value = ", ".join(values) + validator = instance.plone_utils.validateSingleEmailAddress + value = ", ".join(self.to_list(value, validator=validator)) super(EmailsField, self).set(instance, value, **kwargs) + def get(self, instance, **kwargs): + if kwargs.get("as_list", False): + # Return as a list + validator = instance.plone_utils.validateSingleEmailAddress + return self.to_list(self.get(instance), validator) + return super(EmailsField, self).get(instance, **kwargs) + + def to_list(self, value, validator=None): + """Transforms the value to a list of values + """ + if not value: + return [] + emails = map(lambda x: x.strip(), re.split("[;,]", value)) + emails = filter(None, emails) + if validator: + emails = filter(lambda email: validator(email), emails) + return emails + registerField(EmailsField, title="Emails", diff --git a/bika/lims/browser/publish/emailview.py b/bika/lims/browser/publish/emailview.py index ca83eb4305..22450b4a66 100644 --- a/bika/lims/browser/publish/emailview.py +++ b/bika/lims/browser/publish/emailview.py @@ -729,7 +729,7 @@ def recipient_from_email(email): # CC Contacts cc = filter(None, map(recipient_from_contact, ar.getCCContact())) # CC Emails - cc_emails = map(lambda x: x.strip(), re.split("[;,]", ar.getCCEmails())) + cc_emails = ar.getCCEmails(as_list=True) cc_emails = filter(None, map(recipient_from_email, cc_emails)) return to + cc + cc_emails diff --git a/bika/lims/browser/publish/reports_listing.py b/bika/lims/browser/publish/reports_listing.py index b926cc20ad..4519662559 100644 --- a/bika/lims/browser/publish/reports_listing.py +++ b/bika/lims/browser/publish/reports_listing.py @@ -243,7 +243,7 @@ def recipient_from_email(email): # CC Contacts cc = filter(None, map(recipient_from_contact, ar.getCCContact())) # CC Emails - cc_emails = map(lambda x: x.strip(), re.split("[;,]", ar.getCCEmails())) + cc_emails = ar.getCCEmails(as_list=True) cc_emails = filter(None, map(recipient_from_email, cc_emails)) return to + cc + cc_emails