summaryrefslogtreecommitdiff
path: root/Mailman/interfaces
diff options
context:
space:
mode:
Diffstat (limited to 'Mailman/interfaces')
-rw-r--r--Mailman/interfaces/__init__.py7
-rw-r--r--Mailman/interfaces/chain.py98
-rw-r--r--Mailman/interfaces/mailinglist.py2
-rw-r--r--Mailman/interfaces/member.py3
-rw-r--r--Mailman/interfaces/rules.py45
5 files changed, 153 insertions, 2 deletions
diff --git a/Mailman/interfaces/__init__.py b/Mailman/interfaces/__init__.py
index c4094e365..20dff7fdf 100644
--- a/Mailman/interfaces/__init__.py
+++ b/Mailman/interfaces/__init__.py
@@ -46,7 +46,12 @@ def _populate():
is_enum = issubclass(obj, Enum)
except TypeError:
is_enum = False
- if IInterface.providedBy(obj) or is_enum:
+ is_interface = IInterface.providedBy(obj)
+ try:
+ is_exception = issubclass(obj, Exception)
+ except TypeError:
+ is_exception = False
+ if is_interface or is_exception or is_enum:
setattr(iface_mod, name, obj)
__all__.append(name)
diff --git a/Mailman/interfaces/chain.py b/Mailman/interfaces/chain.py
new file mode 100644
index 000000000..04c0260c2
--- /dev/null
+++ b/Mailman/interfaces/chain.py
@@ -0,0 +1,98 @@
+# Copyright (C) 2007 by the Free Software Foundation, Inc.
+#
+# This program 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; either version 2
+# of the License, or (at your option) any later version.
+#
+# 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.
+
+"""Interface describing the basics of chains and links."""
+
+from munepy import Enum
+from zope.interface import Interface, Attribute
+
+
+
+class LinkAction(Enum):
+ # Jump to another chain.
+ jump = 0
+ # Take a detour to another chain, returning to the original chain when
+ # completed (if no other jump occurs).
+ detour = 1
+ # Stop processing all chains.
+ stop = 2
+ # Continue processing the next link in the chain.
+ defer = 3
+ # Run a function and continue processing.
+ run = 4
+
+
+
+class IChainLink(Interface):
+ """A link in the chain."""
+
+ rule = Attribute('The rule to run for this link.')
+
+ action = Attribute('The LinkAction to take if this rule matches.')
+
+ chain = Attribute('The chain to jump or detour to.')
+
+ function = Attribute(
+ """The function to execute.
+
+ The function takes three arguments and returns nothing.
+ :param mlist: the IMailingList object
+ :param msg: the message being processed
+ :param msgdata: the message metadata dictionary
+ """)
+
+
+
+class IChain(Interface):
+ """A chain of rules."""
+
+ name = Attribute('Chain name; must be unique.')
+ description = Attribute('A brief description of the chain.')
+
+ def get_links(mlist, msg, msgdata):
+ """Get an `IChainIterator` for processing.
+
+ :param mlist: the IMailingList object
+ :param msg: the message being processed
+ :param msgdata: the message metadata dictionary
+ :return: An `IChainIterator`.
+ """
+
+
+
+class IChainIterator(Interface):
+ """An iterator over chain rules."""
+
+ def __iter__():
+ """Iterate over all the IChainLinks in this chain.
+
+ :return: an IChainLink.
+ """
+
+
+
+class IMutableChain(IChain):
+ """Like `IChain` but can be mutated."""
+
+ def append_link(link):
+ """Add a new chain link to the end of this chain.
+
+ :param link: The chain link to add.
+ """
+
+ def flush():
+ """Delete all links in this chain."""
diff --git a/Mailman/interfaces/mailinglist.py b/Mailman/interfaces/mailinglist.py
index 2d3811785..2c828a43c 100644
--- a/Mailman/interfaces/mailinglist.py
+++ b/Mailman/interfaces/mailinglist.py
@@ -82,7 +82,7 @@ class IMailingList(Interface):
delivery is currently enabled.
""")
- noreply_address = Attribute(
+ no_reply_address = Attribute(
"""The address to which all messages will be immediately discarded,
without prejudice or record. This address is specific to the ddomain,
even though it's available on the IMailingListAddresses interface.
diff --git a/Mailman/interfaces/member.py b/Mailman/interfaces/member.py
index 18f0b034e..8fc410a77 100644
--- a/Mailman/interfaces/member.py
+++ b/Mailman/interfaces/member.py
@@ -78,6 +78,9 @@ class IMember(Interface):
role = Attribute(
"""The role of this membership.""")
+ is_moderated = Attribute(
+ """True if the membership is moderated, otherwise False.""")
+
def unsubscribe():
"""Unsubscribe (and delete) this member from the mailing list."""
diff --git a/Mailman/interfaces/rules.py b/Mailman/interfaces/rules.py
new file mode 100644
index 000000000..e92b354e1
--- /dev/null
+++ b/Mailman/interfaces/rules.py
@@ -0,0 +1,45 @@
+# Copyright (C) 2007 by the Free Software Foundation, Inc.
+#
+# This program 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; either version 2
+# of the License, or (at your option) any later version.
+#
+# 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.
+
+"""Interface describing the basics of rules."""
+
+from zope.interface import Interface, Attribute
+
+
+
+class IRule(Interface):
+ """A basic rule."""
+
+ name = Attribute('Rule name; must be unique.')
+
+ description = Attribute('A brief description of the rule.')
+
+ record = Attribute(
+ """Should this rule's success or failure be recorded?
+
+ This is a boolean; if True then this rule's hit or miss will be
+ recorded in a message header. If False, it won't.
+ """)
+
+ def check(mlist, msg, msgdata):
+ """Run the rule.
+
+ :param mlist: The mailing list object.
+ :param msg: The message object.
+ :param msgdata: The message metadata.
+ :returns: a boolean specifying whether the rule matched or not.
+ """