#!/usr/bin/python

"""Edit mailing list members.

Usage: %(program)s [options] listname

Where:

    -h / --help
        Print this text and exit.

"""

from __future__ import print_function;

import sys
import getopt
import paths
import re

from email.Utils import parseaddr

from Mailman import mm_cfg
from Mailman import MailList
from Mailman import MemberAdaptor
from Mailman import Utils
from Mailman import Errors
from Mailman.i18n import _

program = sys.argv[0]

def usage(code, msg=''):
    if code:
        fd = sys.stderr
    else:
        fd = sys.stdout
    print(_(__doc__), file=fd)
    if msg:
        print(msg, file=fd)
    sys.exit(code)



class UserDesc: pass



def main():
    try:
        opts, args = getopt.getopt(sys.argv[1:], 'h',
                                   ['domain=',
                                    'owner=',
                                    'help'])
    except getopt.error, msg:
        usage(1, msg)

    if len(args) <> 1:
        usage(1)

    listname = args[0].lower().strip()
    try:
        mlist = MailList.MailList(listname)
    except Errors.MMUnknownListError:
        usage(1, _('No such list: %(listname)s'))

    try:
        for line in sys.stdin.readlines():
            line = line.strip()
            opt = re.match(r'^(?P<action>[-+])(?P<email>\S*)(?:\s+(?P<name>.*))?$', line)
            if not opt:
                next

            userdesc = UserDesc()
            userdesc.address = opt.group('email')
            userdesc.fullname = opt.group('name') or ''

            if opt.group('action') == '+':
                userdesc.digest = False
                try:
                    mlist.ApprovedAddMember(userdesc,
                                            ack=False,
                                            admin_notif=False,
                                            whence='mm-members',
                                            )
                except Errors.MMAlreadyAMember:
                    mlist.setDeliveryStatus(userdesc.address, MemberAdaptor.ENABLED)
            elif opt.group('action') == '-':
                try:
                    _, address = parseaddr(opt.group('email'))
                    if mlist.default_member_moderation and \
                       not mlist.getMemberOption(userdesc.address, mm_cfg.Moderate):
                        mlist.setDeliveryStatus(userdesc.address, MemberAdaptor.UNKNOWN)
                    else:
                        mlist.ApprovedDeleteMember(userdesc.address,
                                'mm-members', False, False)
                except Errors.NotAMemberError:
                    pass

        mlist.Save()
    finally:
        mlist.Unlock()



if __name__ == '__main__':
    main()

