summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorBarry Warsaw2010-01-23 20:15:20 -0500
committerBarry Warsaw2010-01-23 20:15:20 -0500
commit1927e9311c2f06d663a0aa06c8ff1ebf7feb0d51 (patch)
tree3cf2719632180e98e0bf8f4559c00514b6fe6c39 /src
parent3ad94d9ff4649b5e5046174d5337d68266643128 (diff)
downloadmailman-1927e9311c2f06d663a0aa06c8ff1ebf7feb0d51.tar.gz
mailman-1927e9311c2f06d663a0aa06c8ff1ebf7feb0d51.tar.zst
mailman-1927e9311c2f06d663a0aa06c8ff1ebf7feb0d51.zip
Diffstat (limited to 'src')
-rw-r--r--src/mailman/commands/cli_members.py38
-rw-r--r--src/mailman/commands/docs/members.txt72
2 files changed, 109 insertions, 1 deletions
diff --git a/src/mailman/commands/cli_members.py b/src/mailman/commands/cli_members.py
index 8cab15bfc..e18b4b686 100644
--- a/src/mailman/commands/cli_members.py
+++ b/src/mailman/commands/cli_members.py
@@ -38,7 +38,8 @@ from mailman.config import config
from mailman.core.i18n import _
from mailman.interfaces.command import ICLISubCommand
from mailman.interfaces.listmanager import IListManager
-from mailman.interfaces.member import AlreadySubscribedError, DeliveryMode
+from mailman.interfaces.member import (
+ AlreadySubscribedError, DeliveryMode, DeliveryStatus)
@@ -77,6 +78,19 @@ class Members:
help=_("""Display only digest members of KIND. 'any' means any
digest type, 'plaintext' means only plain text (RFC 1153) type
digests, 'mime' means MIME type digests."""))
+ command_parser.add_argument(
+ '-n', '--nomail',
+ default=None, metavar='WHY',
+ choices=('enabled', 'any', 'unknown'
+ 'byadmin', 'byuser', 'bybounces'),
+ help=_("""Display only members with a given delivery
+ status. 'enabled' means all members whose delivery is enabled,
+ 'any' means members whose delivery is disabled for any reason,
+ 'byuser' means that the member disabled their own delivery,
+ 'bybounces' means that delivery was disabled by the automated
+ bounce processor, 'byadmin' means delivery was disabled by the
+ list administrator or moderator, and 'unknown' means that delivery
+ was disabled for unknown (legacy) reasons."""))
# Required positional argument.
command_parser.add_argument(
'listname', metavar='LISTNAME', nargs=1,
@@ -119,6 +133,24 @@ class Members:
else:
# Don't filter on digest type.
pass
+ if args.nomail is None:
+ # Don't filter on delivery status.
+ pass
+ elif args.nomail == 'byadmin':
+ status_types = [DeliveryStatus.by_moderator]
+ elif args.nomail.startswith('by'):
+ status_types = [DeliveryStatus('by_' + args.nomail[2:])]
+ elif args.nomail == 'enabled':
+ status_types = [DeliveryStatus.enabled]
+ elif args.nomail == 'unknown':
+ status_types = [DeliveryStatus.unknown]
+ elif args.nomail == 'any':
+ status_types = [DeliveryStatus.by_user,
+ DeliveryStatus.by_bounces,
+ DeliveryStatus.by_moderator,
+ DeliveryStatus.unknown]
+ else:
+ raise AssertionError('Unknown delivery status: %s' % args.nomail)
try:
addresses = list(mlist.members.addresses)
if len(addresses) == 0:
@@ -133,6 +165,10 @@ class Members:
member = mlist.members.get_member(address.address)
if member.delivery_mode not in digest_types:
continue
+ if args.nomail is not None:
+ member = mlist.members.get_member(address.address)
+ if member.delivery_status not in status_types:
+ continue
print >> fp, formataddr(
(address.real_name, address.original_address))
finally:
diff --git a/src/mailman/commands/docs/members.txt b/src/mailman/commands/docs/members.txt
index 4664cb3a8..af7f13da7 100644
--- a/src/mailman/commands/docs/members.txt
+++ b/src/mailman/commands/docs/members.txt
@@ -13,6 +13,7 @@ and remove members from a mailing list.
... listname = []
... regular = False
... digest = None
+ ... nomail = None
>>> args = FakeArgs()
>>> from mailman.commands.cli_members import Members
@@ -82,6 +83,10 @@ The output file can also be standard out.
Bart Person <bart@example.com>
>>> args.output_filename = None
+
+Filtering on delivery mode
+--------------------------
+
You can limit output to just the regular non-digest members...
>>> args.regular = True
@@ -118,6 +123,73 @@ members...
>>> args.digest = None
+Filtering on delivery status
+----------------------------
+
+You can also filter the display on the member's delivery status. By default,
+all members are displayed, but you can filter out only those whose delivery
+status is enabled...
+
+ >>> from mailman.interfaces.member import DeliveryStatus
+ >>> member = mlist1.members.get_member('anne@aaaxample.com')
+ >>> member.preferences.delivery_status = DeliveryStatus.by_moderator
+ >>> member = mlist1.members.get_member('bart@example.com')
+ >>> member.preferences.delivery_status = DeliveryStatus.by_user
+ >>> member = add_member(
+ ... mlist1, 'cris@example.com', 'Cris Person', 'xxx',
+ ... DeliveryMode.regular, mlist1.preferred_language.code)
+ >>> member.preferences.delivery_status = DeliveryStatus.unknown
+ >>> member = add_member(
+ ... mlist1, 'dave@example.com', 'Dave Person', 'xxx',
+ ... DeliveryMode.regular, mlist1.preferred_language.code)
+ >>> member.preferences.delivery_status = DeliveryStatus.enabled
+ >>> member = add_member(
+ ... mlist1, 'elly@example.com', 'Elly Person', 'xxx',
+ ... DeliveryMode.regular, mlist1.preferred_language.code)
+ >>> member.preferences.delivery_status = DeliveryStatus.by_bounces
+
+ >>> args.nomail = 'enabled'
+ >>> command.process(args)
+ Anne Person <anne@example.com>
+ Dave Person <dave@example.com>
+
+...or disabled by the user...
+
+ >>> args.nomail = 'byuser'
+ >>> command.process(args)
+ Bart Person <bart@example.com>
+
+...or disabled by the list administrator (or moderator)...
+
+ >>> args.nomail = 'byadmin'
+ >>> command.process(args)
+ Anne Person <anne@aaaxample.com>
+
+...or by the bounce processor...
+
+ >>> args.nomail = 'bybounces'
+ >>> command.process(args)
+ Elly Person <elly@example.com>
+
+...or for unknown (legacy) reasons.
+
+ >>> args.nomail = 'unknown'
+ >>> command.process(args)
+ Cris Person <cris@example.com>
+
+You can also display all members who have delivery disabled for any reason.
+
+ >>> args.nomail = 'any'
+ >>> command.process(args)
+ Anne Person <anne@aaaxample.com>
+ Bart Person <bart@example.com>
+ Cris Person <cris@example.com>
+ Elly Person <elly@example.com>
+
+ # Reset for following tests.
+ >>> args.nomail = None
+
+
Adding members
==============