summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/mailman/app/subscriptions.py6
-rw-r--r--src/mailman/workflows/base.py6
-rw-r--r--src/mailman/workflows/builtin.py16
-rw-r--r--src/mailman/workflows/common.py28
4 files changed, 37 insertions, 19 deletions
diff --git a/src/mailman/app/subscriptions.py b/src/mailman/app/subscriptions.py
index 90811722d..c89e1e79f 100644
--- a/src/mailman/app/subscriptions.py
+++ b/src/mailman/app/subscriptions.py
@@ -28,10 +28,10 @@ from mailman.interfaces.subscriptions import (
from mailman.interfaces.template import ITemplateLoader
from mailman.interfaces.workflows import IWorkflowStateManager
from mailman.utilities.string import expand
-from mailman.workflows.builtin import (PendableSubscription,
- PendableUnsubscription,
- SubscriptionWorkflow,
+from mailman.workflows.builtin import (SubscriptionWorkflow,
UnSubscriptionWorkflow)
+from mailman.workflows.common import (PendableSubscription,
+ PendableUnsubscription)
from public import public
from zope.component import getUtility
from zope.interface import implementer
diff --git a/src/mailman/workflows/base.py b/src/mailman/workflows/base.py
index 5988dfa43..e374d58b4 100644
--- a/src/mailman/workflows/base.py
+++ b/src/mailman/workflows/base.py
@@ -23,9 +23,11 @@ import logging
from collections import deque
-from mailman.interfaces.workflows import IWorkflowStateManager
+from mailman.interfaces.workflows import IWorkflow, IWorkflowStateManager
+from mailman.utilities.modules import abstract_component
from public import public
from zope.component import getUtility
+from zope.interface import implementer
COMMASPACE = ', '
@@ -33,6 +35,8 @@ log = logging.getLogger('mailman.error')
@public
+@abstract_component
+@implementer(IWorkflow)
class Workflow:
"""Generic workflow."""
diff --git a/src/mailman/workflows/builtin.py b/src/mailman/workflows/builtin.py
index e16a888fc..33e428d0b 100644
--- a/src/mailman/workflows/builtin.py
+++ b/src/mailman/workflows/builtin.py
@@ -29,13 +29,15 @@ from mailman.interfaces.mailinglist import SubscriptionPolicy
from mailman.interfaces.member import (AlreadySubscribedError, MemberRole,
MembershipIsBannedError,
NotAMemberError)
-from mailman.interfaces.pending import IPendable, IPendings
+from mailman.interfaces.pending import IPendings
from mailman.interfaces.subscriptions import (
SubscriptionConfirmationNeededEvent, SubscriptionPendingError,
TokenOwner, UnsubscriptionConfirmationNeededEvent)
from mailman.interfaces.template import ITemplateLoader
from mailman.interfaces.user import IUser
from mailman.interfaces.usermanager import IUserManager
+from mailman.interfaces.workflows import (ISubscriptionWorkflow,
+ IUnsubscriptionWorkflow)
from mailman.utilities.datetime import now
from mailman.utilities.string import expand, wrap
from mailman.workflows.common import (SubscriptionWorkflowCommon,
@@ -49,17 +51,8 @@ from zope.interface import implementer
log = logging.getLogger('mailman.subscribe')
-@implementer(IPendable)
-class PendableSubscription(dict):
- PEND_TYPE = 'subscription'
-
-
-@implementer(IPendable)
-class PendableUnsubscription(dict):
- PEND_TYPE = 'unsubscription'
-
-
@public
+@implementer(ISubscriptionWorkflow)
class SubscriptionWorkflow(SubscriptionWorkflowCommon):
"""Workflow of a subscription request."""
@@ -269,6 +262,7 @@ class SubscriptionWorkflow(SubscriptionWorkflowCommon):
@public
+@implementer(IUnsubscriptionWorkflow)
class UnSubscriptionWorkflow(SubscriptionWorkflowCommon):
"""Workflow of a unsubscription request."""
diff --git a/src/mailman/workflows/common.py b/src/mailman/workflows/common.py
index 940152272..c57ce374d 100644
--- a/src/mailman/workflows/common.py
+++ b/src/mailman/workflows/common.py
@@ -22,13 +22,17 @@ import uuid
from datetime import timedelta
from enum import Enum
from mailman.interfaces.address import IAddress
-from mailman.interfaces.pending import IPendings
+from mailman.interfaces.pending import IPendable, IPendings
from mailman.interfaces.subscriptions import TokenOwner
from mailman.interfaces.user import IUser
from mailman.interfaces.usermanager import IUserManager
+from mailman.interfaces.workflows import (ISubscriptionWorkflow,
+ IUnsubscriptionWorkflow, IWorkflow)
from mailman.utilities.datetime import now
from mailman.workflows.base import Workflow
from zope.component import getUtility
+from zope.interface import implementer
+from zope.interface.exceptions import DoesNotImplement
class WhichSubscriber(Enum):
@@ -36,11 +40,19 @@ class WhichSubscriber(Enum):
user = 2
+@implementer(IPendable)
+class PendableSubscription(dict):
+ PEND_TYPE = 'subscription'
+
+
+@implementer(IPendable)
+class PendableUnsubscription(dict):
+ PEND_TYPE = 'unsubscription'
+
+
class SubscriptionWorkflowCommon(Workflow):
"""Common support between subscription and unsubscription."""
- PENDABLE_CLASS = None
-
def __init__(self, mlist, subscriber):
super().__init__()
self.mlist = mlist
@@ -113,7 +125,15 @@ class SubscriptionWorkflowCommon(Workflow):
if token_owner is TokenOwner.no_one:
self.token = None
return
- pendable = self.PENDABLE_CLASS(
+
+ if ISubscriptionWorkflow.implementedBy(self.__class__):
+ pendable_class = PendableSubscription
+ elif IUnsubscriptionWorkflow.implementedBy(self.__class__):
+ pendable_class = PendableUnsubscription
+ else:
+ raise DoesNotImplement(IWorkflow)
+
+ pendable = pendable_class(
list_id=self.mlist.list_id,
email=self.address.email,
display_name=self.address.display_name,