packages: mailman/add_nonmembers (NEW), mailman/subscribe_list (NEW) - extr...

glen glen at pld-linux.org
Mon Jun 8 20:33:27 CEST 2009


Author: glen                         Date: Mon Jun  8 18:33:27 2009 GMT
Module: packages                      Tag: HEAD
---- Log message:
- extraced from http://mail.python.org/pipermail/mailman-developers/2002-July/012290.html

---- Files affected:
packages/mailman:
   add_nonmembers (NONE -> 1.1)  (NEW), subscribe_list (NONE -> 1.1)  (NEW)

---- Diffs:

================================================================
Index: packages/mailman/add_nonmembers
diff -u /dev/null packages/mailman/add_nonmembers:1.1
--- /dev/null	Mon Jun  8 20:33:27 2009
+++ packages/mailman/add_nonmembers	Mon Jun  8 20:33:21 2009
@@ -0,0 +1,273 @@
+#! /usr/bin/python
+#
+# Copyright (C) 1998,1999,2000,2001,2002 by the Free Software Foundation, Inc.
+#
+# This program 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 2
+# of the License, or (at your option) any later version.
+# 
+# This program 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 this program; if not, write to the Free Software 
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#
+# argv[1] should be the name of the list.
+
+# Make sure that the list of email addresses doesn't contain any comments,
+# like majordomo may throw in.  For now, you just have to remove them manually.
+
+"""Add nonmembers to a list from the command line.
+
+Usage:
+    add_nonmembers [options] listname
+
+Options:
+
+    --accepted-file=file
+    -a file
+        A file containing addresses of the members to be added,
+        one address per line, to the list of postings which are
+        automatically accepted. If file is `-', read addresses
+        from stdin.
+
+    --moderated-file=file
+    -m file
+        A file containing addresses of the members to be added,
+        one address per line, to the list of postings which are
+        held for moderation. If file is `-', read addresses
+        from stdin.
+
+    --rejected-file=file
+    -r file
+        A file containing addresses of the members to be added,
+        one address per line, to the list of postings which are
+        automatically rejected. If file is `-', read addresses
+        from stdin.
+
+    --discarded-file=file
+    -d file
+        A file containing addresses of the members to be added,
+        one address per line, to the list of postings which are
+        automatically discarded. If file is `-', read addresses
+        from stdin.
+
+    --empty
+    -e
+        Empty all current addresses from the list before adding
+        new addresses.
+
+    --verbose
+    -v
+        Verbose output.  Display messages stating whether each
+        address was added or already in a list
+
+    --help
+    -h
+        Print this help message and exit.
+
+    listname
+        The name of the Mailman list you are adding members to.  It must
+        already exist.
+
+You must supply at least one of -n and -d options.  At most one of the
+files can be `-'.
+"""
+
+import sys
+import os
+import getopt
+from cStringIO import StringIO
+
+import paths
+# Import this /after/ paths so that the sys.path is properly hacked
+from email.Utils import parseaddr
+
+from Mailman import MailList
+from Mailman import Utils
+from Mailman import Message
+from Mailman import Errors
+from Mailman import mm_cfg
+from Mailman import i18n
+
+_ = i18n._
+
+
+
+def usage(status, msg=''):
+    print >> sys.stderr, _(__doc__)
+    if msg:
+        print >> sys.stderr, msg
+    sys.exit(status)
+
+
+
+def readfile(filename):
+    if filename == '-':
+        fp = sys.stdin
+        closep = 0
+    else:
+        fp = open(filename)
+        closep = 1
+    # strip all the lines of whitespace and discard blank lines
+    lines = filter(None, [line.strip() for line in fp.readlines()])
+    if closep:
+        fp.close()
+    return lines
+
+
+
+class Tee:
+    def __init__(self, outfp):
+        self.__outfp = outfp
+
+    def write(self, msg):
+        sys.stdout.write(msg)
+        self.__outfp.write(msg)
+
+
+class UserDesc: pass
+
+
+
+def addall(mlist, submlist, list, members, verbose, outfp):
+    tee = Tee(outfp)
+
+    for member in members:
+        if member in mlist.accept_these_nonmembers:
+            if verbose:
+                print >> tee, _('%(list)s: already in accept_these_nonmembers: %(member)s')
+        elif member in mlist.hold_these_nonmembers:
+            if verbose:
+                print >> tee, _('%(list)s: already in hold_these_nonmembers: %(member)s')
+        elif member in mlist.reject_these_nonmembers:
+            if verbose:
+                print >> tee, _('%(list)s: already in reject_these_nonmembers: %(member)s')
+        elif member in mlist.discard_these_nonmembers:
+            if verbose:
+                print >> tee, _('%(list)s: already in discard_these_nonmembers: %(member)s')
+        else:
+            submlist.append(member)
+            if verbose:
+                print >> tee, _('%(list)s: added: %(member)s')
+
+    return submlist
+
+
+def main():
+    try:
+        opts, args = getopt.getopt(sys.argv[1:],
+                                   'a:m:r:d:ehv',
+                                   ['accepted-file=',
+                                    'moderated-file=',
+                                    'rejected-file=',
+                                    'discarded-file=',
+                                    'empty-list',
+                                    'verbose',
+                                    'help'])
+    except getopt.error, msg:
+        usage(1, msg)
+
+    if len(args) <> 1:
+        usage(1)
+
+    listname = args[0].lower().strip()
+    afile = None
+    mfile = None
+    rfile = None
+    dfile = None
+    verbose = 0
+    empty = 0
+    stdin = 0
+    for opt, arg in opts:
+        if opt in ('-h', '--help'):
+            usage(0)
+        elif opt in ('-a', '--accepted-file'):
+            afile = arg
+            if afile == "-":
+                stdin += 1
+        elif opt in ('-m', '--moderated-file'):
+            mfile = arg
+            if mfile == "-":
+                stdin += 1
+        elif opt in ('-r', '--rejected-file'):
+            rfile = arg
+            if rfile == "-":
+                stdin += 1
+        elif opt in ('-d', '--discarded-file'):
+            dfile = arg
+            if dfile == "-":
+                stdin += 1
+        elif opt in ('-e', '--empty-list'):
+            empty = 1
+        elif opt in ('-v', '--verbose'):
+            verbose = 1
+
+    if afile is None and mfile is None and rfile is None and dfile is None:
+        usage(1)
+
+    if stdin > 1:
+        usage(1, _('Cannot read more than one list of members '
+                   'from standard input.'))
+
+    try:
+        mlist = MailList.MailList(listname)
+    except Errors.MMUnknownListError:
+        usage(1, _('No such list: %(listname)s'))
+
+    otrans = i18n.get_translation()
+
+    # Read the member files
+    try:
+        amembers = []
+        mmembers = []
+        rmembers = []
+        dmembers = []
+        if afile:
+            amembers = readfile(afile)
+            if empty:
+                mlist.accept_these_nonmembers = []
+        if mfile:
+            mmembers = readfile(mfile)
+            if empty:
+                mlist.hold_these_nonmembers = []
+        if rfile:
+            rmembers = readfile(rfile)
+            if empty:
+                mlist.reject_these_nonmembers = []
+        if dfile:
+            dmembers = readfile(dfile)
+            if empty:
+                mlist.discard_these_nonmembers = []
+
+        if not amembers and not mmembers and not rmembers and not dmembers \
+               and not empty:
+            usage(0, _('Nothing to do.'))
+
+        s = StringIO()
+        i18n.set_language(mlist.preferred_language)
+
+        if afile:
+            mlist.accept_these_nonmembers = addall(mlist, mlist.accept_these_nonmembers, 'accept_these_nonmembers', amembers, verbose, s)
+
+        if mfile:
+            mlist.hold_these_nonmembers = addall(mlist, mlist.hold_these_nonmembers, 'hold_these_nonmembers', mmembers, verbose, s)
+
+        if rfile:
+            mlist.reject_these_nonmembers = addall(mlist, mlist.reject_these_nonmembers, 'reject_these_nonmembers', rmembers, verbose, s)
+
+        if dfile:
+            mlist.discard_these_nonmembers = addall(mlist, mlist.discard_these_nonmembers, 'discard_these_nonmembers', dmembers, verbose, s)
+
+        mlist.Save()
+    finally:
+        mlist.Unlock()
+        i18n.set_translation(otrans)
+
+
+if __name__ == '__main__':
+    main()

================================================================
Index: packages/mailman/subscribe_list
diff -u /dev/null packages/mailman/subscribe_list:1.1
--- /dev/null	Mon Jun  8 20:33:27 2009
+++ packages/mailman/subscribe_list	Mon Jun  8 20:33:21 2009
@@ -0,0 +1,218 @@
+#! /usr/bin/python
+#
+# Copyright (C) 1998,1999,2000,2001,2002 by the Free Software Foundation, Inc.
+#
+# This program 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 2
+# of the License, or (at your option) any later version.
+# 
+# This program 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 this program; if not, write to the Free Software 
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#
+# argv[1] should be the name of the list.
+# argv[2] should be the list of non-digested users.
+# argv[3] should be the list of digested users.
+
+# Make sure that the list of email addresses doesn't contain any comments,
+# like majordomo may throw in.  For now, you just have to remove them manually.
+
+"""Add members to a list from the command line.
+
+Usage:
+    subscribe_list [options] listname [listname ...]
+
+Options:
+
+    --regular-member=addr1
+    -r addr1
+        Add addr1 as a regular (non-digest) member.
+
+    --digest-member=addr1
+    -d addr1
+        Add add1 as a digest member.
+
+    --welcome-msg=<y|n>
+    -w <y|n>
+        Set whether or not to send the list members a welcome message,
+        overriding whatever the list's `send_welcome_msg' setting is.
+
+    --admin-notify=<y|n>
+    -a <y|n>
+        Set whether or not to send the list administrators a notification on
+        the success/failure of these subscriptions, overriding whatever the
+        list's `admin_notify_mchanges' setting is.
+
+    --help
+    -h
+        Print this help message and exit.
+
+    listname
+        The name of the Mailman list you are adding members to.  It must
+        already exist.
+
+You must supply at least one of -n and -d options.  At most one of the
+files can be `-'.
+"""
+
+import sys
+import os
+import getopt
+from cStringIO import StringIO
+
+import paths
+# Import this /after/ paths so that the sys.path is properly hacked
+from email.Utils import parseaddr
+
+from Mailman import MailList
+from Mailman import Utils
+from Mailman import Message
+from Mailman import Errors
+from Mailman import mm_cfg
+from Mailman import i18n
+
+_ = i18n._
+
+
+
+def usage(status, msg=''):
+    print >> sys.stderr, _(__doc__)
+    if msg:
+        print >> sys.stderr, msg
+    sys.exit(status)
+
+
+
+class Tee:
+    def __init__(self, outfp):
+        self.__outfp = outfp
+
+    def write(self, msg):
+        sys.stdout.write(msg)
+        self.__outfp.write(msg)
+
+
+class UserDesc: pass
+
+
+
+def add(mlist, member, digest, ack, outfp):
+    tee = Tee(outfp)
+
+    mlist_name = mlist.internal_name()
+    
+    userdesc = UserDesc()
+    userdesc.fullname, userdesc.address = parseaddr(member)
+    userdesc.digest = digest
+
+    try:
+        mlist.ApprovedAddMember(userdesc, ack, 0)
+    except Errors.MMAlreadyAMember:
+        print >> tee, _('Already a member of %(mlist_name)s: %(member)s')
+    except Errors.MMBadEmailError:
+        if userdesc.address == '':
+            print >> tee, _('Bad/Invalid email address: blank line')
+        else:
+            print >> tee, _('Bad/Invalid email address: %(member)s')
+    except MMHostileAddress:
+        print >> tee, _('Hostile address (illegal characters): %(member)s')
+    else:
+        print >> tee, _('Subscribed: %(member)s to %(mlist_name)s')
+
+
+
+def main():
+    try:
+        opts, args = getopt.getopt(sys.argv[1:],
+                                   'a:r:d:w:h',
+                                   ['admin-notify=',
+                                    'regular-member=',
+                                    'digest-member=',
+				    'welcome-msg=',
+                                    'help'])
+    except getopt.error, msg:
+        usage(1, msg)
+
+    if len(args) < 1:
+        usage(1, args)
+
+    listnames = args
+
+    send_welcome_msg = None
+    admin_notif = None
+    member_address = None
+    digest_member = 0
+    for opt, arg in opts:
+        if opt in ('-h', '--help'):
+            usage(0)
+        elif opt in ('-d', '--digest-member'):
+            member_address = arg
+            digest_member = 1
+        elif opt in ('-r', '--regular-member'):
+            member_address = arg
+            digest_member = 0
+        elif opt in ('-w', '--welcome-msg'):
+            if arg.lower()[0] == 'y':
+                send_welcome_msg = 1
+            elif arg.lower()[0] == 'n':
+                send_welcome_msg = 0
+            else:
+                usage(1, _('Bad argument to -w/--welcome-msg: %(arg)s'))
+        elif opt in ('-a', '--admin-notify'):
+            if arg.lower()[0] == 'y':
+                admin_notif = 1
+            elif arg.lower()[0] == 'n':
+                admin_notif = 0
+            else:
+                usage(1, _('Bad argument to -a/--admin-notify: %(arg)s'))
+                
+    if member_address is None:
+        usage(1)
+
+    listnames = [n.lower().strip() for n in listnames]
+    if not listnames:
+        print _('Nothing to do.')
+        sys.exit(0)
+
+    for listname in listnames:
+        try:
+            mlist = MailList.MailList(listname)
+        except Errors.MMUnknownListError:
+            usage(1, _('No such list: %(listname)s'))
+
+        # Set up defaults
+        if send_welcome_msg is None:
+            send_welcome_msg = mlist.send_welcome_msg
+            if admin_notif is None:
+                admin_notif = mlist.admin_notify_mchanges
+
+        otrans = i18n.get_translation()
+        # Read the regular and digest member files
+        try:
+            s = StringIO()
+            i18n.set_language(mlist.preferred_language)
+
+            add(mlist, member_address, digest_member, send_welcome_msg, s)
+
+            if admin_notif:
+                realname = mlist.real_name
+                subject = _('%(realname)s subscription notification')
+                msg = Message.UserNotification(
+                    mlist.owner, Utils.get_site_email(), subject, s.getvalue(),
+                    mlist.preferred_language)
+                msg.send(mlist)
+
+            mlist.Save()
+        finally:
+            mlist.Unlock()
+            i18n.set_translation(otrans)
+
+
+if __name__ == '__main__':
+    main()
================================================================


More information about the pld-cvs-commit mailing list