Skip to content

Commit

Permalink
Merge 952deb5 into 3c567e0
Browse files Browse the repository at this point in the history
  • Loading branch information
thomasmassmann committed Nov 25, 2019
2 parents 3c567e0 + 952deb5 commit f8d0cb6
Show file tree
Hide file tree
Showing 3 changed files with 75 additions and 74 deletions.
126 changes: 57 additions & 69 deletions src/Products/EasyNewsletter/behaviors/plone_user_group_recipients.py
Expand Up @@ -5,7 +5,6 @@
from plone.autoform.interfaces import IFormFieldProvider
from plone.supermodel import model
from Products.EasyNewsletter import _
from Products.EasyNewsletter.config import EMAIL_RE
from Products.EasyNewsletter.interfaces import IReceiversPostSendingFilter
from zope.component import adapter
from zope.component import subscribers
Expand Down Expand Up @@ -85,102 +84,91 @@ class IPloneUserGroupRecipients(model.Schema):
@implementer(IPloneUserGroupRecipients)
@adapter(IPloneUserGroupRecipientsMarker)
class PloneUserGroupRecipients(object):

def __init__(self, context):
self.context = context

@property
def plone_receiver_members(self):
if hasattr(self.context, 'plone_receiver_members'):
return self.context.plone_receiver_members
return set()
return getattr(self.context, 'plone_receiver_members', set())

@plone_receiver_members.setter
def plone_receiver_members(self, value):
self.context.plone_receiver_members = value

@property
def plone_receiver_groups(self):
if hasattr(self.context, 'plone_receiver_groups'):
return self.context.plone_receiver_groups
return set()
return getattr(self.context, 'plone_receiver_groups', set())

@plone_receiver_groups.setter
def plone_receiver_groups(self, value):
self.context.plone_receiver_groups = value

def _get_salutation_mappings(self):
"""
returns mapping of salutations. Each salutation itself is a dict
with key as language. (prepared for multilingual newsletter)
"""
enl = self.context.get_newsletter()
result = {}
lang = self.context.language or 'en'

for line in enl.salutations:
if "|" not in line:
continue
key, value = line.split('|')
result[key.strip()] = {lang: value.strip()}
return result

def get_plone_subscribers(self):
""" Search for all selected Members and Groups
and return a filtered list of subscribers as dicts.
"""
enl = self.get_newsletter()
enl = self.context.get_newsletter()
plone_subscribers = []
if self.send_to_all_plone_members:
log.info(
"send_to_all_plone_members is true, so we add all existing"
" members to receiver_member_list!"
)
receiver_member_list = enl.plone_receiver_members
# if all members are receivers we don't need group relations:
receiver_group_list = []
else:
receiver_member_list = self.plone_receiver_members
receiver_group_list = self.plone_receiver_groups
gtool = api.portal.get_tool(name="portal_groups")
acl_userfolder = api.portal.get_tool(self, "acl_users")
member_objs = acl_userfolder.getUsers()
member_properties = {}
for member in member_objs:
probdict = {}
probdict["id"] = member.getUserId()
probdict["email"] = member.getProperty("email")
# probdict["gender"] = member.getProperty("nl_gender", "default")
# try last name first
probdict["fullname"] = member.getProperty(
"last_name", member.getProperty("fullname")
)
probdict["language"] = member.getProperty("language")
# fallback for default plone users without a enl language
if not probdict["language"]:
probdict["language"] = self.language
member_properties[probdict["id"]] = probdict
if not member_properties:
return []
selected_group_members = []
receiver_list = set()
receiver_member_list = self.plone_receiver_members
receiver_group_list = self.plone_receiver_groups

for member_id in receiver_member_list:
try:
member = api.user.get(userid=member_id)
except (AttributeError, api.exc.PloneApiError):
continue
else:
receiver_list.add(member)

for group in receiver_group_list:
selected_group_members.extend(gtool.getGroupMembers(group))
receiver_member_list = receiver_member_list + tuple(selected_group_members)
try:
members = api.user.get_users(groupname=group)
except (AttributeError, api.exc.PloneApiError):
continue
else:
receiver_list.update(members)

# get salutation mappings
salutation_mappings = self._get_salutation_mappings()

# get all selected member properties
for receiver_id in set(receiver_member_list):
if receiver_id not in member_properties:
log.debug(
'Ignore reveiver "%s", because we have '
"no properties for this member!" % receiver_id
)
for member in receiver_list:
email = member.getProperty("email")
if not email:
continue
member_property = member_properties[receiver_id]
if EMAIL_RE.findall(member_property["email"]):
salutation = salutation_mappings[
member_property.get("gender", "default")
]
plone_subscribers.append(
{
"fullname": member_property["fullname"],
"email": member_property["email"],
"salutation": salutation.get(
member_property.get("language", ""),
salutation.get(self.language or "en", "unset"),
),
"nl_language": member_property.get("language", ""),
}
)
else:
log.debug(
"Skip '%s' because \"%s\" is not a real email!"
% (receiver_id, member_property["email"])
)
salutation = salutation_mappings[
member.getProperty("nl_gender", "default")
]
language = member.getProperty("language") or self.context.language
plone_subscribers.append(
{
"fullname": member.getProperty("fullname"),
"email": email,
"salutation": salutation.get(
language,
salutation.get(self.context.language or "en", "unset"),
),
"nl_language": language,
}
)
# run registered receivers post sending filters:
for subscriber in subscribers([enl], IReceiversPostSendingFilter):
plone_subscribers = subscriber.filter(plone_subscribers)
Expand Down
2 changes: 1 addition & 1 deletion src/Products/EasyNewsletter/content/newsletter_issue.py
Expand Up @@ -28,7 +28,7 @@ def get_default_prologue(parent):
""" get prologue from parent Newsletter
"""
prologue_output = u""
if INewsletter.providedBy(parent) and parent.__parent__:
if INewsletter.providedBy(parent) and parent.__parent__ and parent.default_prologue:
prologue_output = parent.default_prologue.raw
default_prologue = textfield.RichTextValue(
raw=prologue_output,
Expand Down
21 changes: 17 additions & 4 deletions src/Products/EasyNewsletter/views/newsletter_issue_send.py
Expand Up @@ -3,6 +3,7 @@
from plone import api
from plone.protect import PostOnly
from Products.EasyNewsletter import EasyNewsletterMessageFactory as _ # noqa
from Products.EasyNewsletter.behaviors.plone_user_group_recipients import IPloneUserGroupRecipients # noqa: E501
from Products.EasyNewsletter.interfaces import IIssueDataFetcher
from Products.Five.browser import BrowserView
from Products.MailHost.interfaces import IMailHost
Expand Down Expand Up @@ -233,13 +234,25 @@ def _get_recipients(self):

enl_receivers.append(enl_receiver)

receivers_raw = enl_receivers

# get subscribers over selected plone members anpid groups
# plone_receivers = self.context.plone_subscribers
plone_receivers = []
try:
plone_receivers_adapter = IPloneUserGroupRecipients(self.context)
except TypeError:
plone_receivers_adapter = None
if not plone_receivers_adapter:
try:
plone_receivers_adapter = IPloneUserGroupRecipients(enl)
except TypeError:
plone_receivers_adapter = None
if plone_receivers_adapter:
plone_receivers = plone_receivers_adapter.get_plone_subscribers()
receivers_raw += plone_receivers
# XXX implement this with the behavior
# external_subscribers = self._get_external_source_subscribers(enl)
# receivers_raw = plone_receivers + enl_receivers # + \
# external_subscribers
receivers_raw = enl_receivers
# receivers_raw += external_subscribers
receivers = self._unique_receivers(receivers_raw)

return receivers

0 comments on commit f8d0cb6

Please sign in to comment.