summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/mailman/app/events.py5
-rw-r--r--src/mailman/app/subscriptions.py5
-rw-r--r--src/mailman/app/tests/test_unsubscriptions.py2
-rw-r--r--src/mailman/app/workflowmanager.py147
-rw-r--r--src/mailman/config/configure.zcml4
5 files changed, 7 insertions, 156 deletions
diff --git a/src/mailman/app/events.py b/src/mailman/app/events.py
index f3a4d2f3b..d039a13d6 100644
--- a/src/mailman/app/events.py
+++ b/src/mailman/app/events.py
@@ -18,8 +18,7 @@
"""Global events."""
from mailman import public
-from mailman.app import (
- domain, membership, moderator, workflowmanager, subscriptions)
+from mailman.app import domain, membership, moderator, subscriptions
from mailman.core import i18n, switchboard
from mailman.languages import manager as language_manager
from mailman.styles import manager as style_manager
@@ -37,8 +36,8 @@ def initialize():
membership.handle_SubscriptionEvent,
moderator.handle_ListDeletingEvent,
passwords.handle_ConfigurationUpdatedEvent,
- workflowmanager.handle_ConfirmationNeededEvent,
style_manager.handle_ConfigurationUpdatedEvent,
subscriptions.handle_ListDeletingEvent,
+ subscriptions.handle_ConfirmationNeededEvent,
switchboard.handle_ConfigurationUpdatedEvent,
])
diff --git a/src/mailman/app/subscriptions.py b/src/mailman/app/subscriptions.py
index 26c3b1d17..fb712d979 100644
--- a/src/mailman/app/subscriptions.py
+++ b/src/mailman/app/subscriptions.py
@@ -35,10 +35,9 @@ from mailman.interfaces.listmanager import ListDeletingEvent
from mailman.interfaces.mailinglist import SubscriptionPolicy
from mailman.interfaces.member import MembershipIsBannedError, NotAMemberError
from mailman.interfaces.pending import IPendable, IPendings
-from mailman.interfaces.workflowmanager import ConfirmationNeededEvent
from mailman.interfaces.subscriptions import (
- ISubscriptionManager, ISubscriptionService, SubscriptionPendingError,
- TokenOwner)
+ ConfirmationNeededEvent, ISubscriptionManager, ISubscriptionService,
+ SubscriptionPendingError, TokenOwner)
from mailman.interfaces.template import ITemplateLoader
from mailman.interfaces.user import IUser
from mailman.interfaces.usermanager import IUserManager
diff --git a/src/mailman/app/tests/test_unsubscriptions.py b/src/mailman/app/tests/test_unsubscriptions.py
index c4f36e78a..9eec027b0 100644
--- a/src/mailman/app/tests/test_unsubscriptions.py
+++ b/src/mailman/app/tests/test_unsubscriptions.py
@@ -22,7 +22,7 @@ import unittest
from contextlib import suppress
from mailman.app.lifecycle import create_list
-from mailman.app.unsubscriptions import UnSubscriptionWorkflow
+from mailman.app.subscriptions import UnSubscriptionWorkflow
from mailman.interfaces.mailinglist import SubscriptionPolicy
from mailman.interfaces.pending import IPendings
from mailman.interfaces.subscriptions import TokenOwner
diff --git a/src/mailman/app/workflowmanager.py b/src/mailman/app/workflowmanager.py
deleted file mode 100644
index 78669ecd9..000000000
--- a/src/mailman/app/workflowmanager.py
+++ /dev/null
@@ -1,147 +0,0 @@
-# Copyright (C) 2007-2016 by the Free Software Foundation, Inc.
-#
-# This file is part of GNU Mailman.
-#
-# GNU Mailman 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 3 of the License, or (at your option)
-# any later version.
-#
-# GNU Mailman 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
-# GNU Mailman. If not, see <http://www.gnu.org/licenses/>.
-
-"""Implementation of the IWorkflowManager interface."""
-
-import logging
-
-from mailman import public
-from mailman.app.subscriptions import SubscriptionWorkflow
-from mailman.app.unsubscriptions import UnSubscriptionWorkflow
-from mailman.database.transaction import flush
-from mailman.email.message import UserNotification
-from mailman.interfaces.pending import IPendable, IPendings
-from mailman.interfaces.subscriptions import (
- ConfirmationNeededEvent, ISubscriptionManager)
-from mailman.interfaces.templates import ITemplateLoader
-from mailman.interfaces.workflow import IWorkflowStateManager
-from mailman.utilities.string import expand
-from zope.component import getUtility
-from zope.interface import implementer
-
-
-log = logging.getLogger('mailman.error')
-
-
-@implementer(IPendable)
-class PendableRegistration(dict):
- PEND_TYPE = 'registration'
-
-
-class BaseWorkflowManager:
- """Base class to handle registration and un-registration workflow. """
-
- # Workflow type is the type of the workflow and could be either 'register'
- # or 'unregister' depending on if it is for subscription workflow or
- # unsubscription workflow.
-
- WORKFLOW_TYPE = None
-
- def __init__(self, mlist):
- self._mlist = mlist
-
- def confirm(self, token):
- workflow = self.workflowClass(self._mlist)
- workflow.token = token
- workflow.restore()
- # In order to just run the whole workflow, all we need to do
- # is iterate over the workflow object. On calling the __next__
- # over the workflow iterator it automatically executes the steps
- # that needs to be done.
- list(workflow)
- return workflow.token, workflow.token_owner, workflow.member
-
- @property
- def workflowClass(self):
- if self.WORKFLOW_TYPE == 'subscribe':
- return SubscriptionWorkflow
- elif self.WORKFLOW_TYPE == 'unsubscribe':
- return UnSubscriptionWorkflow
- else:
- raise ValueError('Invalid workflow type {}'.format(
- self.WORKFLOW_TYPE))
-
- def discard(self, token):
- with flush():
- getUtility(IPendings).confirm(token)
- getUtility(IWorkflowStateManager).discard(
- self.workflowClass.__name__, token)
-
-
-@public
-@implementer(ISubscriptionManager)
-class SubscriptionWorkflowManager(BaseWorkflowManager):
- """Handle registrations and confirmations for subscriptions."""
-
- WORKFLOW_TYPE = 'subscribe'
-
- def register(self, subscriber=None, *,
- pre_verified=False, pre_confirmed=False, pre_approved=False):
- """See `ISubscriptionManager`."""
- workflow = SubscriptionWorkflow(
- self._mlist, subscriber,
- pre_verified=pre_verified,
- pre_confirmed=pre_confirmed,
- pre_approved=pre_approved)
- list(workflow)
- return workflow.token, workflow.token_owner, workflow.member
-
-
-@public
-@implementer(ISubscriptionManager)
-class UnsubscriptionWorkflowManager(BaseWorkflowManager):
- """Handle un-subscriptions and confirmations for un-subscriptions."""
-
- WORKFLOW_TYPE = 'unsubscribe'
-
- def unregister(self, subscriber=None, *,
- pre_confirmed=False, pre_approved=False):
- workflow = UnSubscriptionWorkflow(
- self._mlist, subscriber,
- pre_confirmed=pre_confirmed,
- pre_approved=pre_approved)
- list(workflow)
-
-
-@public
-def handle_ConfirmationNeededEvent(event):
- if not isinstance(event, ConfirmationNeededEvent):
- return
- # There are three ways for a user to confirm their subscription. They
- # can reply to the original message and let the VERP'd return address
- # encode the token, they can reply to the robot and keep the token in
- # the Subject header, or they can click on the URL in the body of the
- # message and confirm through the web.
- subject = 'confirm {}'.format(event.token)
- confirm_address = event.mlist.confirm_address(event.token)
- email_address = event.email
- # Send a verification email to the address.
- template = getUtility(ITemplateLoader).get(
- 'list:user:action:confirm', event.mlist)
- text = expand(template, event.mlist, dict(
- token=event.token,
- subject=subject,
- confirm_email=confirm_address,
- user_email=email_address,
- # For backward compatibility.
- confirm_address=confirm_address,
- email_address=email_address,
- domain_name=event.mlist.domain.mail_host,
- contact_address=event.mlist.owner_address,
- ))
- msg = UserNotification(email_address, confirm_address, subject, text)
- msg.send(event.mlist, add_precedence=False)
diff --git a/src/mailman/config/configure.zcml b/src/mailman/config/configure.zcml
index f2725c5c7..89d43ac2b 100644
--- a/src/mailman/config/configure.zcml
+++ b/src/mailman/config/configure.zcml
@@ -49,14 +49,14 @@
<adapter
for="mailman.interfaces.mailinglist.IMailingList"
provides="mailman.interfaces.subscriptions.ISubscriptionManager"
- factory="mailman.app.subscriptions.SubscriptionWorkflow"
+ factory="mailman.app.subscriptions.SubscriptionWorkflowManager"
name='subscribe'
/>
<adapter
for="mailman.interfaces.mailinglist.IMailingList"
provides="mailman.interfaces.subscriptions.ISubscriptionManager"
- factory="mailman.app.subscriptions.UnsubscriptionWorkflow"
+ factory="mailman.app.subscriptions.UnsubscriptionWorkflowManager"
name='unsubscribe'
/>