def pending_status(self, user): annot = IAnnotations(self.context) listen_annot = annot.setdefault(PROJECTNAME, OOBTree()) subscribe_pending_list = getAdapter(self.context, IMembershipPendingList, 'pending_sub_email') unsubscribe_pending_list = getAdapter(self.context, IMembershipPendingList, 'pending_unsub_email') sub_mod_pending_list = getAdapter(self.context, IMembershipPendingList, 'pending_sub_mod_email') email_address = is_email(user) and user or lookup_email( user, self.context) inlist = lambda lst: lst.is_pending(email_address) status = lambda msg, lst: msg + lst.get_pending_time(email_address) status_msg = '' if inlist(subscribe_pending_list): status_msg += status( _(u'subscription pending user confirmation: '), subscribe_pending_list) if inlist(unsubscribe_pending_list): status_msg += status( _(u'unsubscription pending user confirmation: '), unsubscribe_pending_list) if inlist(sub_mod_pending_list): status_msg += status( _(u'subscription pending manager moderation: '), sub_mod_pending_list) return status_msg
def remove_allowed_sender(self, allowed_sender, send_notify=True): was_subscribed = False if is_email(allowed_sender): user_id = lookup_member_id(allowed_sender, self.context) if user_id: if user_id in self.members: record = self.members.pop(user_id) if record.get("subscriber") == True: was_subscribed = True if allowed_sender in self.emails: record = self.emails.pop(allowed_sender) if record.get("subscriber") == True: was_subscribed = True else: email = lookup_email(allowed_sender, self.context) if email in self.emails: record = self.email.pop(email) if record.get("subscriber") == True: was_subscribed = True if allowed_sender in self.members: record = self.members.pop(allowed_sender) if record.get("subscriber") == True: was_subscribed = True if send_notify: if was_subscribed: self._notify_removed_subscriber(allowed_sender) self._notify_removed_allowed_sender(allowed_sender)
def make_digest_subscriber(self, subscriber): if is_email(subscriber): user_id = lookup_member_id(subscriber, self.context) if user_id: # submitted email address, is connected to a user if user_id not in self.members: raise ValueError('%s (username: %s) is not a subscriber' % (subscriber, user_id)) if subscriber in self.digest_emails: # clean up lingering email digest sub del(self.digest_emails[subscriber]) if user_id not in self.digest_members: self.digest_members[user_id] = None else: # submitted email address, no connected user if subscriber not in self.emails: raise ValueError('%s is not a subscriber' % subscriber) if subscriber not in self.digest_emails: self.digest_emails[subscriber] = None else: # submitted user id email = lookup_email(subscriber, self.context) if subscriber not in self.members: raise ValueError('%s is not a subscriber' % subscriber) if email in self.digest_emails: # clean up lingering email digest sub del(self.digest_emails[email]) if subscriber not in self.digest_members: self.digest_members[subscriber] = None
def send_to_managers(self, subject, message, extra_headers={}): # create a list of valid manager emails manager_emails = [] for manager in self.context.managers: if not is_email(manager): manager = lookup_email(manager.encode('ascii'), self.context) if manager not in manager_emails and manager: manager_emails.append(manager) if not len(manager_emails): return False list_manager_emails = ', '.join(manager_emails) sender = '"%s" <%s>' % ('[' + self.context.title + '] List Manager', self.context.manager_email) try: message = translate(message) except UnicodeDecodeError: # Argh, a raw byte string. encoding = getSiteEncoding(self) message = translate(message.decode(encoding)) self.context.sendCommandRequestMail(list_manager_emails, subject, translate(message), sender, extra_headers=extra_headers)
def unmake_digest_subscriber(self, subscriber): if is_email(subscriber): user_id = lookup_member_id(subscriber, self.context) if user_id: # submitted email, but has user; check and clear both # digest_members and digest_emails to be safe if (user_id not in self.digest_members and subscriber not in self.digest_emails): raise ValueError('%s (username: %s) is not a digest' ' subscriber' % (subscriber, user_id)) if user_id in self.digest_members: del(self.digest_members[user_id]) if subscriber in self.digest_emails: del(self.digest_emails[subscriber]) else: # submitted email, no user if subscriber not in self.digest_emails: raise ValueError('%s is not a digest subscriber' % subscriber) del(self.digest_emails[subscriber]) else: # submitted user id; check and clear both digest_members # and digest_emails to be safe email = lookup_email(subscriber, self.context) if (subscriber not in self.digest_members and email not in self.digest_emails): raise ValueError('%s is not a digest subscriber' % subscriber) if subscriber in self.digest_members: del(self.digest_members[subscriber]) if email in self.digest_emails: del(self.digest_emails[email])
def _add_member(self, member_id): if member_id in self.members: return email = lookup_email(member_id, self.context) if email in self.emails: self.members[member_id] = self.emails[email] self.emails.pop(email) else: self.members[member_id] = OOBTree()
def __call__(self): sub_action = self.request.get('subscribe_member', None) unsub_action = self.request.get('unsubscribe_member', None) email_action = self.request.get('subscribe_email', None) self.request.set('enable_border', True) self.errors = errors = {} logged_in_mem = self._get_logged_in_user() self.user_logged_in = False if logged_in_mem: self.user_email = lookup_email(logged_in_mem.getId(), self.context) self.user_logged_in = True else: #XXX what should this be? self.user_email = '' self.mem_list = IWriteMembershipList(self.context) # the appropriate sub_policy needs to be instantiated # depending on list type self.sub_policy = getAdapter(self.context, IUserTTWMembershipPolicy) if sub_action: self.subscribe() elif unsub_action: self.unsubscribe() elif email_action: address = self.request.get('email_address', None) if not address: errors['email_address'] = _('An email address is required') elif EMAIL_RE.match(address) is None: errors['email_address'] = _('This email address is invalid') elif self.mem_list.is_subscribed(address): errors['email_address'] = \ _('This email address is already subscribed') else: # everything is OK, send a request mail the # appropriate sub_policy needs to be instantiated # depending on list type sub_policy_for_email = getAdapter(self.context, IUserEmailMembershipPolicy) ret = sub_policy_for_email.enforce({'email':address, 'subject':'subscribe'}) if ret == MEMBERSHIP_ALLOWED: # make user a subscriber self.mem_list.subscribe(address) self.request.set('portal_status_message', 'Email subscribed') elif ret == MEMBERSHIP_DEFERRED: self.request.set('portal_status_message', 'Subscription request sent') else: self.request.set('portal_status_message', 'Bad email address') # Blank the email field to avoid the postback self.request.set('email_address', '') self.request.set('subscribe_email', '') return self.index()
def is_digest_subscriber(self, subscriber): if is_email(subscriber): user_id = lookup_member_id(subscriber, self.context) if user_id: return (user_id in self.digest_members or subscriber in self.digest_emails) return subscriber in self.digest_emails email = lookup_email(subscriber, self.context) return (subscriber in self.digest_members or email in self.digest_emails)
def is_allowed_sender(self, allowed_sender): if is_email(allowed_sender): user_id = lookup_member_id(allowed_sender, self.context) if user_id: return user_id in self.members or allowed_sender in self.emails else: return allowed_sender in self.emails else: email = lookup_email(allowed_sender, self.context) return allowed_sender in self.members or email in self.emails
def is_subscribed(self, subscriber): if is_email(subscriber): user_id = lookup_member_id(subscriber, self.context) if user_id: return self.members.get(user_id, {}).get('subscriber', False) or self.emails.get(subscriber, {}).get('subscriber', False) else: return self.emails.get(subscriber, {}).get('subscriber', False) else: email = lookup_email(subscriber, self.context) return self.members.get(subscriber, {}).get('subscriber', False) or self.emails.get(email, {}).get('subscriber', False)
def is_subscribed(self, subscriber): if is_email(subscriber): user_id = lookup_member_id(subscriber, self.context) if user_id: return user_id in self.members or subscriber in self.emails else: return subscriber in self.emails else: email = lookup_email(subscriber, self.context) return subscriber in self.members or email in self.emails
def _add_member(self, member_id, send_notify): if member_id in self.members: return email = lookup_email(member_id, self.context) if email in self.emails: self.members[member_id] = self.emails[email] self.emails.pop(email) else: if member_id not in self.members: self.members[member_id] = {'subscriber':False} if send_notify: self._notify_added_a_s(member_id)
def unsubscribe(self, subscriber): if is_email(subscriber): user_id = lookup_member_id(subscriber, self.context) if user_id: if user_id in self.members: self.members.pop(user_id) if subscriber in self.emails: self.emails.pop(subscriber) else: email = lookup_email(subscriber, self.context) if email in self.emails: self.email.pop(email) if subscriber in self.members: self.members.pop(subscriber)
def enforce(self, request): action = request.get('action') user = request.get('email') if action is None or user is None: return MEMBERSHIP_ERROR user_email = is_email(user) and user or lookup_email(user, self.context) user_name = is_email(user) and lookup_member_id(user, self.context) or user if action == 'add_allowed_sender': self.a_s_mod_pending_list.add(user) elif action == 'subscribe': if self.mem_list.is_allowed_sender(user): return MEMBERSHIP_ALLOWED self.sub_mod_pending_list.add(user, user_name=user_name) else: return MEMBERSHIP_DENIED self.mail_sender.manager_mod(user_email, user_name) return MEMBERSHIP_DEFERRED
def subscribe(self, subscriber, send_notify=True): if is_email(subscriber): user_id = lookup_member_id(subscriber, self.context) if user_id: if user_id not in self.members and send_notify: self._notify_added_a_s(user_id) self.members[user_id] = {'subscriber':True} if subscriber in self.emails: self.emails.pop(subscriber) else: if subscriber not in self.emails and send_notify: self._notify_added_a_s(subscriber) self.emails[subscriber] = {'subscriber':True} else: if subscriber not in self.members and send_notify: self._notify_added_a_s(subscriber) self.members[subscriber] = {'subscriber':True} email = lookup_email(subscriber, self.context) if email in self.emails: self.emails.pop(email) if send_notify: self._notify_added_subscriber(subscriber)
def enforce(self, request): action = request.get('action') user = request.get('email') if action is None or user is None: return MEMBERSHIP_ERROR user_email = is_email(user) and user or lookup_email( user, self.context) user_name = is_email(user) and lookup_member_id(user, self.context) or user if action == 'add_allowed_sender': self.a_s_mod_pending_list.add(user) elif action == 'subscribe': if self.mem_list.is_allowed_sender(user): return MEMBERSHIP_ALLOWED self.sub_mod_pending_list.add(user, user_name=user_name) else: return MEMBERSHIP_DENIED self.mail_sender.manager_mod(user_email, user_name) return MEMBERSHIP_DEFERRED
def pending_status(self, user): annot = IAnnotations(self.context) listen_annot = annot.setdefault(PROJECTNAME, OOBTree()) subscribe_pending_list = getAdapter(self.context, IMembershipPendingList, 'pending_sub_email') unsubscribe_pending_list = getAdapter(self.context, IMembershipPendingList, 'pending_unsub_email') sub_mod_pending_list = getAdapter(self.context, IMembershipPendingList, 'pending_sub_mod_email') email_address = is_email(user) and user or lookup_email(user, self.context) inlist = lambda lst: lst.is_pending(email_address) status = lambda msg, lst: msg + lst.get_pending_time(email_address) status_msg = '' if inlist(subscribe_pending_list): status_msg += status('subscription pending user confirmation: ', subscribe_pending_list) if inlist(unsubscribe_pending_list): status_msg += status('unsubscription pending user confirmation: ', unsubscribe_pending_list) if inlist(sub_mod_pending_list): status_msg += status('subscription pending manager moderation: ', sub_mod_pending_list) return status_msg
def _notify_added_subscriber(self, user): email = is_email(user) and user or lookup_email(user, self.context) if email: notify(SubscriberPromotion(self.context, email))
def _get_email_from(self, member_or_email): return is_email(member_or_email) and member_or_email \ or lookup_email(member_or_email, self.context)
def allowed_senders(self): members = [lookup_email(x, self.context) for x in self.members.keys()] members = filter(None, members) # XXX for some reason list(self.emails.keys()) does not work return [x for x in self.emails.keys()] + members
def _notify_added_a_s(self, user): email = is_email(user) and user or lookup_email(user, self.context) if email: notify(AllowedSenderPromotion(self.context, email))
def _notify_removed_allowed_sender(self, user): email = is_email(user) and user or lookup_email(user, self.context) if email: notify(AllowedSenderRemoved(self.context, email))
def _notify_removed_subscriber(self, user): email = is_email(user) and user or lookup_email(user, self.context) if email: notify(SubscriberRemoved(self.context, email))
def __call__(self): sub_action = self.request.get('subscribe_member', None) unsub_action = self.request.get('unsubscribe_member', None) email_action = self.request.get('subscribe_email', None) self.request.set('enable_border', True) self.errors = errors = {} logged_in_mem = self._get_logged_in_user() self.user_logged_in = False if logged_in_mem: self.user_email = lookup_email(logged_in_mem.getId(), self.context) self.user_logged_in = True else: #XXX what should this be? self.user_email = '' self.mem_list = IWriteMembershipList(self.context) # the appropriate sub_policy needs to be instantiated # depending on list type self.sub_policy = getAdapter(self.context, IUserTTWMembershipPolicy) if sub_action: self.subscribe() elif unsub_action: self.unsubscribe() elif email_action: address = self.request.get('email_address', None) if not address: errors['email_address'] = _('An email address is required') elif EMAIL_RE.match(address) is None: errors['email_address'] = _('This email address is invalid') elif self.mem_list.is_subscribed(address): errors['email_address'] = \ _('This email address is already subscribed') else: # everything is OK, send a request mail the # appropriate sub_policy needs to be instantiated # depending on list type sub_policy_for_email = getAdapter(self.context, IUserEmailMembershipPolicy) ret = sub_policy_for_email.enforce({'email':address, 'subject':'subscribe'}) if ret == MEMBERSHIP_ALLOWED: # make user a subscriber self.mem_list.subscribe(address) self.request.set('portal_status_message', _(u'list_email_subscribed_status_msg', u'Email subscribed')) elif ret == MEMBERSHIP_DEFERRED: self.request.set('portal_status_message', _(u'list_subscription_request_sent_status_msg', u'Subscription request sent')) else: self.request.set('portal_status_message', _(u'list_bad_email_address_status_msg', u'Bad email address')) # Blank the email field to avoid the postback self.request.set('email_address', '') self.request.set('subscribe_email', '') return self.index()