diff options
| author | Barry Warsaw | 2007-09-20 22:39:20 -0400 |
|---|---|---|
| committer | Barry Warsaw | 2007-09-20 22:39:20 -0400 |
| commit | 892316be3c09eec4a1f8117bfd9eb44bba1c9117 (patch) | |
| tree | c6dd4f1f116bad876306923a981237d09d05fdca | |
| parent | 18e07a3dc2caa61ed042515cd91833a76a596b9d (diff) | |
| download | mailman-892316be3c09eec4a1f8117bfd9eb44bba1c9117.tar.gz mailman-892316be3c09eec4a1f8117bfd9eb44bba1c9117.tar.zst mailman-892316be3c09eec4a1f8117bfd9eb44bba1c9117.zip | |
| -rw-r--r-- | Mailman/bin/add_members.py | 77 | ||||
| -rw-r--r-- | Mailman/bin/list_lists.py | 6 | ||||
| -rw-r--r-- | Mailman/bin/list_members.py | 108 | ||||
| -rw-r--r-- | Mailman/bin/newlist.py | 8 | ||||
| -rw-r--r-- | Mailman/database/model/mailinglist.py | 5 | ||||
| -rw-r--r-- | TODO.txt | 2 |
6 files changed, 88 insertions, 118 deletions
diff --git a/Mailman/bin/add_members.py b/Mailman/bin/add_members.py index e27304aaf..5d1400a9a 100644 --- a/Mailman/bin/add_members.py +++ b/Mailman/bin/add_members.py @@ -22,7 +22,7 @@ import sys import optparse from cStringIO import StringIO -from email.Utils import parseaddr +from email.utils import parseaddr from Mailman import Errors from Mailman import MailList @@ -30,7 +30,10 @@ from Mailman import Message from Mailman import Utils from Mailman import Version from Mailman import i18n +from Mailman.app.membership import add_member from Mailman.configuration import config +from Mailman.constants import DeliveryMode +from Mailman.initialize import initialize _ = i18n._ __i18n_templates__ = True @@ -69,13 +72,9 @@ success/failure of these subscriptions, overriding whatever the list's help=_('Alternative configuration file to use')) opts, args = parser.parse_args() if not args: - parser.print_help() - print >> sys.stderr, _('Missing listname') - sys.exit(1) + parser.error(_('Missing listname')) if len(args) > 1: - parser.print_help() - print >> sys.stderr, _('Unexpected arguments') - sys.exit(1) + parser.error(_('Unexpected arguments')) if opts.welcome_msg is not None: ch = opts.welcome_msg[0].lower() if ch == 'y': @@ -83,9 +82,7 @@ success/failure of these subscriptions, overriding whatever the list's elif ch == 'n': opts.welcome_msg = False else: - parser.print_help() - print >> sys.stderr, _('Illegal value for -w: $opts.welcome_msg') - sys.exit(1) + parser.error(_('Illegal value for -w: $opts.welcome_msg')) if opts.admin_notify is not None: ch = opts.admin_notify[0].lower() if ch == 'y': @@ -93,17 +90,11 @@ success/failure of these subscriptions, overriding whatever the list's elif ch == 'n': opts.admin_notify = False else: - parser.print_help() - print >> sys.stderr, _('Illegal value for -a: $opts.admin_notify') - sys.exit(1) + parser.error(_('Illegal value for -a: $opts.admin_notify')) if opts.regular is None and opts.digest is None: - parser.print_help() - print >> sys.stderr, _('At least one of -r or -d is required') - sys.exit(1) + parser.error(_('At least one of -r or -d is required')) if opts.regular == '-' and opts.digest == '-': - parser.print_help() - print >> sys.stderr, _("-r and -d cannot both be '-'") - sys.exit(1) + parser.error(_("-r and -d cannot both be '-'")) return parser, opts, args @@ -131,45 +122,37 @@ class Tee: self._outfp.write(msg) -class UserDesc: - pass - - -def addall(mlist, members, digest, ack, outfp): +def addall(mlist, subscribers, delivery_mode, ack, admin_notify, outfp): tee = Tee(outfp) - for member in members: - userdesc = UserDesc() - userdesc.fullname, userdesc.address = parseaddr(member) - userdesc.digest = digest - + for subscriber in subscribers: try: - mlist.ApprovedAddMember(userdesc, ack, 0) - except Errors.MMAlreadyAMember: - print >> tee, _('Already a member: $member') + fullname, address = parseaddr(subscriber) + password = Utils.MakeRandomPassword() + add_member(mlist, address, fullname, password, delivery_mode, + config.DEFAULT_SERVER_LANGUAGE, ack, admin_notify) + except AlreadySubscribedError: + print >> tee, _('Already a member: $subscriber') except Errors.InvalidEmailAddress: if userdesc.address == '': print >> tee, _('Bad/Invalid email address: blank line') else: print >> tee, _('Bad/Invalid email address: $member') else: - print >> tee, _('Subscribed: $member') + print >> tee, _('Subscribing: $subscriber') def main(): parser, opts, args = parseargs() - config.load(opts.config) + initialize(opts.config) listname = args[0].lower().strip() - try: - mlist = MailList.MailList(listname) - except Errors.MMUnknownListError: - parser.print_help() - print >> sys.stderr, _('No such list: $listname') - sys.exit(1) + mlist = config.db.list_manager.get(listname) + if mlist is None: + parser.error(_('No such list: $listname')) - # Set up defaults + # Set up defaults. if opts.welcome_msg is None: send_welcome_msg = mlist.send_welcome_msg else: @@ -195,10 +178,14 @@ def main(): s = StringIO() if nmembers: - addall(mlist, nmembers, False, send_welcome_msg, s) + addall(mlist, nmembers, DeliveryMode.regular, + send_welcome_msg, admin_notify, s) if dmembers: - addall(mlist, dmembers, True, send_welcome_msg, s) + addall(mlist, dmembers, DeliveryMode.mime_digests, + send_welcome_msg, admin_notify, s) + + config.db.flush() if admin_notify: subject = _('$mlist.real_name subscription notification') @@ -207,10 +194,6 @@ def main(): mlist.preferred_language) msg.send(mlist) - mlist.Save() - finally: - mlist.Unlock() - if __name__ == '__main__': diff --git a/Mailman/bin/list_lists.py b/Mailman/bin/list_lists.py index 14a57f002..145043759 100644 --- a/Mailman/bin/list_lists.py +++ b/Mailman/bin/list_lists.py @@ -20,6 +20,7 @@ import optparse from Mailman import Defaults from Mailman import MailList from Mailman import Version +from Mailman.configuration import config from Mailman.i18n import _ from Mailman.initialize import initialize @@ -68,8 +69,9 @@ def main(): mlists = [] longest = 0 - for n in sorted(config.list_manager.names): - mlist = MailList.MailList(n, lock=False) + listmgr = config.db.list_manager + for fqdn_name in sorted(listmgr.names): + mlist = listmgr.get(fqdn_name) if opts.advertised and not mlist.advertised: continue if opts.domains: diff --git a/Mailman/bin/list_members.py b/Mailman/bin/list_members.py index 22b5347ea..2e1213979 100644 --- a/Mailman/bin/list_members.py +++ b/Mailman/bin/list_members.py @@ -22,11 +22,12 @@ from email.Utils import formataddr from Mailman import Errors from Mailman import MailList -from Mailman import MemberAdaptor from Mailman import Utils from Mailman import Version from Mailman.configuration import config +from Mailman.constants import DeliveryStatus from Mailman.i18n import _ +from Mailman.initialize import initialize __i18n_templates__ = True @@ -34,11 +35,10 @@ ENC = sys.getdefaultencoding() COMMASPACE = ', ' WHYCHOICES = { - 'enabled' : MemberAdaptor.ENABLED, - 'unknown' : MemberAdaptor.UNKNOWN, - 'byuser' : MemberAdaptor.BYUSER, - 'byadmin' : MemberAdaptor.BYADMIN, - 'bybounce': MemberAdaptor.BYBOUNCE, + 'enabled' : DeliveryStatus.enabled, + 'byuser' : DeliveryStatus.by_user, + 'byadmin' : DeliveryStatus.by_moderator, + 'bybounce': DeliveryStatus.by_bounces, } KINDCHOICES = set(('mime', 'plain', 'any')) @@ -78,10 +78,6 @@ the users who are disabled for that particular reason. WHY can also be parser.add_option('-f', '--fullnames', default=False, action='store_true', help=_('Include the full names in the output')) - parser.add_option('-p', '--preserve', - default=False, action='store_true', help=_("""\ -Output member addresses case preserved the way they were added to the list. -Otherwise, addresses are printed in all lowercase.""")) parser.add_option('-i', '--invalid', default=False, action='store_true', help=_("""\ Print only the addresses in the membership list that are invalid. Ignores -r, @@ -94,27 +90,19 @@ objects. Ignores -r, -d, -n.""")) help=_('Alternative configuration file to use')) opts, args = parser.parse_args() if not args: - parser.print_help() - print >> sys.stderr, _('Missing listname') - sys.exit(1) + parser.error(_('Missing listname')) if len(args) > 1: - parser.print_help() - print >> sys.stderr, _('Unexpected arguments') - sys.exit(1) + parser.print_error(_('Unexpected arguments')) if opts.digest is not None: opts.kind = opts.digest.lower() if opts.kind not in KINDCHOICES: - parser.print_help() - print >> sys.stderr, _('Invalid value for -d: $opts.digest') - sys.exit(1) + parser.error(_('Invalid value for -d: $opts.digest')) if opts.nomail is not None: why = opts.nomail.lower() if why == 'any': opts.why = 'any' elif why not in WHYCHOICES: - parser.print_help() - print >> sys.stderr, _('Invalid value for -n: $opts.nomail') - sys.exit(1) + parser.error(_('Invalid value for -n: $opts.nomail')) opts.why = why if opts.regular is None and opts.digest is None: opts.regular = opts.digest = True @@ -123,14 +111,10 @@ objects. Ignores -r, -d, -n.""")) -def isunicode(s): - return isinstance(s, unicode) - - def safe(s): if not s: return '' - if isunicode(s): + if isinstance(s, unicode): return s.encode(ENC, 'replace') return unicode(s, ENC, 'replace').encode(ENC, 'replace') @@ -150,14 +134,14 @@ def whymatches(mlist, addr, why): # (i.e. not enabled). status = mlist.getDeliveryStatus(addr) if why in (None, 'any'): - return status <> MemberAdaptor.ENABLED + return status <> DeliveryStatus.enabled return status == WHYCHOICES[why] def main(): parser, opts, args = parseargs() - config.load(opts.config) + initialize(opts.config) listname = args[0].lower().strip() if opts.output: @@ -170,59 +154,53 @@ def main(): else: fp = sys.stdout - try: - mlist = MailList.MailList(listname, lock=False) - except Errors.MMListError: + mlist = config.db.list_manager.get(listname) + if mlist is None: print >> sys.stderr, _('No such list: $listname') sys.exit(1) - # Get the lowercased member addresses - rmembers = mlist.getRegularMemberKeys() - dmembers = mlist.getDigestMemberKeys() - - if opts.preserve: - # Convert to the case preserved addresses - rmembers = mlist.getMemberCPAddresses(rmembers) - dmembers = mlist.getMemberCPAddresses(dmembers) + # The regular delivery and digest members. + rmembers = set(mlist.regular_members.members) + dmembers = set(mlist.digest_members.members) if opts.invalid or opts.unicode: - all = rmembers + dmembers - all.sort() - for addr in all: - name = opts.fullnames and mlist.getMemberName(addr) or '' + all = sorted(member.address.address for member in rmembers + dmembers) + for address in all: + user = config.db.user_manager.get_user(address) + name = (user.real_name if opts.fullnames and user else '') showit = False - if opts.invalid and isinvalid(addr): + if opts.invalid and isinvalid(address): showit = True - if opts.unicode and isunicode(addr): + if opts.unicode and isinstance(address, unicode): showit = True if showit: - print >> fp, formataddr((safe(name), addr)) + print >> fp, formataddr((safe(name), address)) return if opts.regular: - rmembers.sort() - for addr in rmembers: - name = opts.fullnames and mlist.getMemberName(addr) or '' + for address in sorted(member.address.address for member in rmembers): + user = config.db.user_manager.get_user(address) + name = (user.real_name if opts.fullnames and user else '') # Filter out nomails - if opts.nomail and not whymatches(mlist, addr, opts.why): + if opts.nomail and not whymatches(mlist, address, opts.why): continue - print >> fp, formataddr((safe(name), addr)) + print >> fp, formataddr((safe(name), address)) if opts.digest: - dmembers.sort() - for addr in dmembers: - name = opts.fullnames and mlist.getMemberName(addr) or '' + for address in sorted(member.address.address for member in dmembers): + user = config.db.user_manager.get_user(address) + name = (user.real_name if opts.fullnames and user else '') # Filter out nomails - if opts.nomail and not whymatches(mlist, addr, opts.why): + if opts.nomail and not whymatches(mlist, address, opts.why): continue # Filter out digest kinds - if mlist.getMemberOption(addr, config.DisableMime): - # They're getting plain text digests - if opts.kind == 'mime': - continue - else: - # They're getting MIME digests - if opts.kind == 'plain': - continue - print >> fp, formataddr((safe(name), addr)) +## if mlist.getMemberOption(addr, config.DisableMime): +## # They're getting plain text digests +## if opts.kind == 'mime': +## continue +## else: +## # They're getting MIME digests +## if opts.kind == 'plain': +## continue + print >> fp, formataddr((safe(name), address)) diff --git a/Mailman/bin/newlist.py b/Mailman/bin/newlist.py index 3897f73dc..be594fac2 100644 --- a/Mailman/bin/newlist.py +++ b/Mailman/bin/newlist.py @@ -123,10 +123,10 @@ def main(): sys.stdin.readline() if not opts.quiet: d = dict( - listname = listname, - admin_url = mlist.GetScriptURL('admin', absolute=True), - listinfo_url = mlist.GetScriptURL('listinfo', absolute=True), - requestaddr = mlist.GetRequestEmail(), + listname = mlist.fqdn_listname, + admin_url = mlist.script_url('admin'), + listinfo_url = mlist.script_url('listinfo'), + requestaddr = mlist.request_address, siteowner = mlist.no_reply_address, ) text = Utils.maketext('newlist.txt', d, mlist=mlist) diff --git a/Mailman/database/model/mailinglist.py b/Mailman/database/model/mailinglist.py index 1b2892a46..0d12f919e 100644 --- a/Mailman/database/model/mailinglist.py +++ b/Mailman/database/model/mailinglist.py @@ -16,6 +16,7 @@ # USA. import os +import string from elixir import * from zope.interface import implements @@ -25,6 +26,9 @@ from Mailman.configuration import config from Mailman.interfaces import * from Mailman.database.types import EnumType, TimeDeltaType +SPACE = ' ' +UNDERSCORE = '_' + class MailingList(Entity): @@ -177,6 +181,7 @@ class MailingList(Entity): # autoresponses sent on that date. self.hold_and_cmd_autoresponses = {} self.full_path = os.path.join(config.LIST_DATA_DIR, fqdn_listname) + self.real_name = string.capwords(SPACE.join(listname.split(UNDERSCORE))) makedirs(self.full_path) # XXX FIXME @@ -13,3 +13,5 @@ Fix the roster creation cruft for mailing lists Suss out the IDomain stuff Remove Date: header from messagestore requirements (see list thread) Handle moderation flag (see Mailman.app.membership) +Eradicate MailList.Lock() and friends. +Eradicate MemberAdapter and friends. |
