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