diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/mailman/app/events.py | 5 | ||||
| -rw-r--r-- | src/mailman/app/subscriptions.py | 5 | ||||
| -rw-r--r-- | src/mailman/app/tests/test_unsubscriptions.py | 2 | ||||
| -rw-r--r-- | src/mailman/app/workflowmanager.py | 147 | ||||
| -rw-r--r-- | src/mailman/config/configure.zcml | 4 |
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' /> |
