summaryrefslogtreecommitdiff
path: root/src/mailman/rules/moderation.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/mailman/rules/moderation.py')
-rw-r--r--src/mailman/rules/moderation.py63
1 files changed, 50 insertions, 13 deletions
diff --git a/src/mailman/rules/moderation.py b/src/mailman/rules/moderation.py
index 1e2b46529..733edd70c 100644
--- a/src/mailman/rules/moderation.py
+++ b/src/mailman/rules/moderation.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2007-2010 by the Free Software Foundation, Inc.
+# Copyright (C) 2007-2011 by the Free Software Foundation, Inc.
#
# This file is part of GNU Mailman.
#
@@ -21,23 +21,27 @@ from __future__ import absolute_import, unicode_literals
__metaclass__ = type
__all__ = [
- 'Moderation',
- 'NonMember',
+ 'MemberModeration',
+ 'NonmemberModeration',
]
+from zope.component import getUtility
from zope.interface import implements
from mailman.core.i18n import _
+from mailman.interfaces.action import Action
+from mailman.interfaces.member import MemberRole
from mailman.interfaces.rules import IRule
+from mailman.interfaces.usermanager import IUserManager
-class Moderation:
+class MemberModeration:
"""The member moderation rule."""
implements(IRule)
- name = 'moderation'
+ name = 'member-moderation'
description = _('Match messages sent by moderated members.')
record = True
@@ -45,24 +49,57 @@ class Moderation:
"""See `IRule`."""
for sender in msg.senders:
member = mlist.members.get_member(sender)
- if member is not None and member.is_moderated:
+ action = (None if member is None
+ else member.moderation_action)
+ if action is Action.defer:
+ # The regular moderation rules apply.
+ return False
+ elif action is not None:
+ # We must stringify the moderation action so that it can be
+ # stored in the pending request table.
+ msgdata['moderation_action'] = action.enumname
+ msgdata['moderation_sender'] = sender
return True
+ # The sender is not a member so this rule does not match.
return False
-class NonMember:
- """The non-membership rule."""
+class NonmemberModeration:
+ """The nonmember moderation rule."""
implements(IRule)
- name = 'non-member'
- description = _('Match messages sent by non-members.')
+ name = 'nonmember-moderation'
+ description = _('Match messages sent by nonmembers.')
record = True
def check(self, mlist, msg, msgdata):
"""See `IRule`."""
+ user_manager = getUtility(IUserManager)
+ # First ensure that all senders are already either members or
+ # nonmembers. If they are not subscribed in some role to the mailing
+ # list, make them nonmembers.
+ for sender in msg.senders:
+ if (mlist.members.get_member(sender) is None and
+ mlist.nonmembers.get_member(sender) is None):
+ # The address is neither a member nor nonmember.
+ address = user_manager.get_address(sender)
+ assert address is not None, (
+ 'Posting address is not registered: {0}'.format(sender))
+ address.subscribe(mlist, MemberRole.nonmember)
+ # Do nonmember moderation check.
for sender in msg.senders:
- if mlist.members.get_member(sender) is not None:
- # The sender is a member of the mailing list.
+ nonmember = mlist.nonmembers.get_member(sender)
+ action = (None if nonmember is None
+ else nonmember.moderation_action)
+ if action is Action.defer:
+ # The regular moderation rules apply.
return False
- return True
+ elif action is not None:
+ # We must stringify the moderation action so that it can be
+ # stored in the pending request table.
+ msgdata['moderation_action'] = action.enumname
+ msgdata['moderation_sender'] = sender
+ return True
+ # The sender must be a member, so this rule does not match.
+ return False