diff options
| -rw-r--r-- | src/mailman/app/subscriptions.py | 6 | ||||
| -rw-r--r-- | src/mailman/workflows/base.py | 6 | ||||
| -rw-r--r-- | src/mailman/workflows/builtin.py | 16 | ||||
| -rw-r--r-- | src/mailman/workflows/common.py | 28 |
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, |
