------------------------------------------------------------
revno: 6556
committer: Barry Warsaw <[EMAIL PROTECTED]>
branch nick: 3.0
timestamp: Thu 2007-09-20 22:39:20 -0400
message:
  Get bin/add_members and bin/list_members to work again (for the most
  part).  Mostly this is just updating the code to use the new APIs, but
  there's also some other code clean up involved.  There's still more to
  do for sure, but this is a start.
modified:
  Mailman/bin/add_members.py
  Mailman/bin/list_lists.py
  Mailman/bin/list_members.py
  Mailman/bin/newlist.py
  Mailman/database/model/mailinglist.py
  TODO.txt

=== modified file 'Mailman/bin/add_members.py'
--- a/Mailman/bin/add_members.py        2007-09-19 11:28:58 +0000
+++ b/Mailman/bin/add_members.py        2007-09-21 02:39:20 +0000
@@ -22,7 +22,7 @@
 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 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 @@
                       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 @@
         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 @@
         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 @@
         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 @@
 
         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 @@
                 mlist.preferred_language)
             msg.send(mlist)
 
-        mlist.Save()
-    finally:
-        mlist.Unlock()
-
 
 
 if __name__ == '__main__':

=== modified file 'Mailman/bin/list_lists.py'
--- a/Mailman/bin/list_lists.py 2007-05-28 20:21:41 +0000
+++ b/Mailman/bin/list_lists.py 2007-09-21 02:39:20 +0000
@@ -20,6 +20,7 @@
 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 @@
     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:

=== modified file 'Mailman/bin/list_members.py'
--- a/Mailman/bin/list_members.py       2007-01-19 04:38:06 +0000
+++ b/Mailman/bin/list_members.py       2007-09-21 02:39:20 +0000
@@ -22,11 +22,12 @@
 
 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 @@
 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 @@
     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 @@
                       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 @@
 
 
 
-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 @@
     # (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 @@
     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))
 
 
 

=== modified file 'Mailman/bin/newlist.py'
--- a/Mailman/bin/newlist.py    2007-09-19 11:28:58 +0000
+++ b/Mailman/bin/newlist.py    2007-09-21 02:39:20 +0000
@@ -123,10 +123,10 @@
         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)

=== modified file 'Mailman/database/model/mailinglist.py'
--- a/Mailman/database/model/mailinglist.py     2007-09-20 02:35:37 +0000
+++ b/Mailman/database/model/mailinglist.py     2007-09-21 02:39:20 +0000
@@ -16,6 +16,7 @@
 # USA.
 
 import os
+import string
 
 from elixir import *
 from zope.interface import implements
@@ -25,6 +26,9 @@
 from Mailman.interfaces import *
 from Mailman.database.types import EnumType, TimeDeltaType
 
+SPACE = ' '
+UNDERSCORE = '_'
+
 
 
 class MailingList(Entity):
@@ -177,6 +181,7 @@
         # 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

=== modified file 'TODO.txt'
--- a/TODO.txt  2007-09-20 02:35:37 +0000
+++ b/TODO.txt  2007-09-21 02:39:20 +0000
@@ -13,3 +13,5 @@
 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.



--

https://code.launchpad.net/~mailman-coders/mailman/3.0

You are receiving this branch notification because you are subscribed to it.
To unsubscribe from this branch go to 
https://code.launchpad.net/~mailman-coders/mailman/3.0/+subscription/mailman-checkins.
_______________________________________________
Mailman-checkins mailing list
Mailman-checkins@python.org
Unsubscribe: 
http://mail.python.org/mailman/options/mailman-checkins/archive%40jab.org

Reply via email to