diff options
| author | Barry Warsaw | 2015-12-22 14:54:46 -0500 |
|---|---|---|
| committer | Barry Warsaw | 2015-12-22 14:54:46 -0500 |
| commit | c9464cb64f434749fee21e5ebbb15ce3f2fc1691 (patch) | |
| tree | 9b93f9abe3e253210ba0249f284db85c0ee6b914 /src/mailman/commands | |
| parent | 8e24476848de89302d9b0a8ea91116288201a95d (diff) | |
| download | mailman-c9464cb64f434749fee21e5ebbb15ce3f2fc1691.tar.gz mailman-c9464cb64f434749fee21e5ebbb15ce3f2fc1691.tar.zst mailman-c9464cb64f434749fee21e5ebbb15ce3f2fc1691.zip | |
Refactor bump_digest_number_and_volume() and maybe_send_digest_now() into
their own module inside the mailman.app package. With the latter, remove the
"all lists" functionality and require the mlist argument. We'll handle the
"all lists" use case higher up the stack.
Also, rename the send-digests handler digests since we'll next add the bump
functionality.
Diffstat (limited to 'src/mailman/commands')
| -rw-r--r-- | src/mailman/commands/cli_digests.py | 91 | ||||
| -rw-r--r-- | src/mailman/commands/cli_send_digests.py | 69 | ||||
| -rw-r--r-- | src/mailman/commands/tests/test_digests.py (renamed from src/mailman/commands/tests/test_send_digests.py) | 22 |
3 files changed, 107 insertions, 75 deletions
diff --git a/src/mailman/commands/cli_digests.py b/src/mailman/commands/cli_digests.py new file mode 100644 index 000000000..9af91f1c3 --- /dev/null +++ b/src/mailman/commands/cli_digests.py @@ -0,0 +1,91 @@ +# Copyright (C) 2015 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/>. + +"""The `send_digests` subcommand.""" + +__all__ = [ + 'Digests', + ] + + +import sys + +from mailman.app.digests import maybe_send_digest_now +from mailman.core.i18n import _ +from mailman.interfaces.command import ICLISubCommand +from mailman.interfaces.listmanager import IListManager +from zope.component import getUtility +from zope.interface import implementer + + + +@implementer(ICLISubCommand) +class Digests: + """Operate on digests.""" + + name = 'digests' + + def add(self, parser, command_parser): + """See `ICLISubCommand`.""" + + command_parser.add_argument( + '-l', '--list', + default=[], dest='lists', metavar='list', action='append', + help=_("""Operate on this mailing list. Multiple --list + options can be given. The argument can either be a List-ID + or a fully qualified list name. Without this option, + operate on the digests for all mailing lists.""")) + command_parser.add_argument( + '-s', '--send', + default=False, action='store_true', + help=_("""Send any collected digests right now, even if the size + threshold has not yet been met.""")) + command_parser.add_argument( + '-b', '--bump', + default=False, action='store_true', + help=_("""Increment the digest volume number and reset the digest + number to one. If given with --send, the volume number is + incremented after any current digests are sent.""")) + + def process(self, args): + """See `ICLISubCommand`.""" + list_manager = getUtility(IListManager) + if args.send: + if not args.lists: + # Send the digests for every list. + for mlist in list_manager.mailing_lists: + maybe_send_digest_now(mlist, force=True) + return + for list_spec in args.lists: + # We'll accept list-ids or fqdn list names. + if '@' in list_spec: + mlist = list_manager.get(list_spec) + else: + mlist = list_manager.get_by_list_id(list_spec) + if mlist is None: + print(_('No such list found: $list_spec'), file=sys.stderr) + continue + maybe_send_digest_now(mlist, force=True) + if args.bump: + if not args.lists: + mlists = list(list_manager.mailing_lists) + else: + # We'll accept list-ids or fqdn list names. + if '@' in list_spec: + mlist = list_manager.get(list_spec) + else: + mlist = list_manager.get_by_list_id(list_spec) diff --git a/src/mailman/commands/cli_send_digests.py b/src/mailman/commands/cli_send_digests.py deleted file mode 100644 index 842054982..000000000 --- a/src/mailman/commands/cli_send_digests.py +++ /dev/null @@ -1,69 +0,0 @@ -# Copyright (C) 2015 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/>. - -"""The `send_digests` subcommand.""" - -__all__ = [ - 'Send', - ] - - -import sys - -from mailman.core.i18n import _ -from mailman.handlers.to_digest import maybe_send_digest_now -from mailman.interfaces.command import ICLISubCommand -from mailman.interfaces.listmanager import IListManager -from zope.component import getUtility -from zope.interface import implementer - - - -@implementer(ICLISubCommand) -class Send: - """Send some mailing list digests right now.""" - - name = 'send-digests' - - def add(self, parser, command_parser): - """See `ICLISubCommand`.""" - - command_parser.add_argument( - '-l', '--list', - default=[], dest='lists', metavar='list', action='append', - help=_("""Send the digests for this mailing list. Multiple --list - options can be given. The argument can either be a List-ID - or a fully qualified list name. Without this option, the - digests for all mailing lists will be sent if possible.""")) - - def process(self, args): - """See `ICLISubCommand`.""" - if not args.lists: - # Send the digests for every list. - maybe_send_digest_now(force=True) - return - list_manager = getUtility(IListManager) - for list_spec in args.lists: - # We'll accept list-ids or fqdn list names. - if '@' in list_spec: - mlist = list_manager.get(list_spec) - else: - mlist = list_manager.get_by_list_id(list_spec) - if mlist is None: - print(_('No such list found: $list_spec'), file=sys.stderr) - continue - maybe_send_digest_now(mlist, force=True) diff --git a/src/mailman/commands/tests/test_send_digests.py b/src/mailman/commands/tests/test_digests.py index d0218ea12..2640580af 100644 --- a/src/mailman/commands/tests/test_send_digests.py +++ b/src/mailman/commands/tests/test_digests.py @@ -27,7 +27,7 @@ import unittest from io import StringIO from mailman.app.lifecycle import create_list -from mailman.commands.cli_send_digests import Send +from mailman.commands.cli_digests import Digests from mailman.config import config from mailman.interfaces.member import DeliveryMode from mailman.runners.digest import DigestRunner @@ -42,6 +42,8 @@ from unittest.mock import patch class FakeArgs: def __init__(self): self.lists = [] + self.send = False + self.bump = False @@ -55,7 +57,7 @@ class TestSendDigests(unittest.TestCase): self._mlist.digests_enabled = True self._mlist.digest_size_threshold = 100000 self._mlist.send_welcome_message = False - self._command = Send() + self._command = Digests() self._handler = config.handlers['to-digest'] self._runner = make_testable_runner(DigestRunner, 'digest') # The mailing list needs at least one digest recipient. @@ -80,6 +82,7 @@ Subject: message 1 mailbox_path = os.path.join(self._mlist.data_path, 'digest.mmdf') self.assertGreater(os.path.getsize(mailbox_path), 0) args = FakeArgs() + args.send = True args.lists.append('ant.example.com') self._command.process(args) self._runner.run() @@ -110,6 +113,7 @@ Subject: message 1 mailbox_path = os.path.join(self._mlist.data_path, 'digest.mmdf') self.assertGreater(os.path.getsize(mailbox_path), 0) args = FakeArgs() + args.send = True args.lists.append('ant@example.com') self._command.process(args) self._runner.run() @@ -140,9 +144,10 @@ Subject: message 1 mailbox_path = os.path.join(self._mlist.data_path, 'digest.mmdf') self.assertGreater(os.path.getsize(mailbox_path), 0) args = FakeArgs() + args.send = True args.lists.append('bee.example.com') stderr = StringIO() - with patch('mailman.commands.cli_send_digests.sys.stderr', stderr): + with patch('mailman.commands.cli_digests.sys.stderr', stderr): self._command.process(args) self._runner.run() # The warning was printed to stderr. @@ -171,9 +176,10 @@ Subject: message 1 mailbox_path = os.path.join(self._mlist.data_path, 'digest.mmdf') self.assertGreater(os.path.getsize(mailbox_path), 0) args = FakeArgs() + args.send = True args.lists.append('bee@example.com') stderr = StringIO() - with patch('mailman.commands.cli_send_digests.sys.stderr', stderr): + with patch('mailman.commands.cli_digests.sys.stderr', stderr): self._command.process(args) self._runner.run() # The warning was printed to stderr. @@ -202,9 +208,10 @@ Subject: message 1 mailbox_path = os.path.join(self._mlist.data_path, 'digest.mmdf') self.assertGreater(os.path.getsize(mailbox_path), 0) args = FakeArgs() + args.send = True args.lists.extend(('ant.example.com', 'bee.example.com')) stderr = StringIO() - with patch('mailman.commands.cli_send_digests.sys.stderr', stderr): + with patch('mailman.commands.cli_digests.sys.stderr', stderr): self._command.process(args) self._runner.run() # The warning was printed to stderr. @@ -260,6 +267,7 @@ Subject: message 3 self.assertEqual(len(items), 0) # Process both list's digests. args = FakeArgs() + args.send = True args.lists.extend(('ant.example.com', 'bee@example.com')) self._command.process(args) self._runner.run() @@ -327,7 +335,9 @@ Subject: message 3 items = get_queue_messages('digest') self.assertEqual(len(items), 0) # Process all mailing list digests by not setting any arguments. - self._command.process(FakeArgs()) + args = FakeArgs() + args.send = True + self._command.process(args) self._runner.run() # Now, neither list has a digest mbox and but there are plaintext # digest in the outgoing queue for both. |
