try:
import json
except ImportError:
import simplejson as json
from email.Utils import parseaddr try:
from collections import Callable
except ImportError:
def iscallable(attr): return callable(attr)
else:
def iscallable(attr): return isinstance(attr, Callable)
from Mailman import MailList from Mailman import Errors
class MailingListEncoder(json.JSONEncoder):
def default(self, obj): if isinstance(obj, MailList.MailList): return {'name': obj.internal_name()} return json.JSONEncoder.default(self, obj)
def dumplist(mlist):
print json.dumps(mlist, True, cls=MailingListEncoder)
class UserDesc: pass def userdesc_for(member):
userdesc = UserDesc() userdesc.fullname, userdesc.address = parseaddr(member) return userdesc
def unwindattrs(obj, attrname, *args):
if not attrname.count('.'): attr = getattr(obj, attrname) if iscallable(attr): return attr(*args) else: if len(args) > 0: # must be a setter setattr(obj, attrname, args[0]) else: # must be a getter return attr else: attr, nextattrname = attrname.split('.', 1) nextobj = getattr(obj, attr) return unwindattrs(nextobj, nextattrname, *args)
needs_userdesc = dict(AddMember=True, ApprovedAddMember=True) needs_save = dict(AddMember=True, ApprovedAddMember=True, DeleteMember=True,
ApprovedDeleteMember=True, moderator_append=True, moderator_remove=True)
needs_save_with_arg = dict(description=True, subject_prefix=True, host_name=True)
def command(mlist, cmd, *args):
result = {} try: if (needs_save.get(cmd.replace('.','_'), False) or (needs_save_with_arg.get(cmd.replace('.','_'), False) and len(args) > 0)): mlist.Lock() if needs_userdesc.get(cmd, False): result['return'] = unwindattrs(mlist, cmd, userdesc_for(args[0])) else: result['return'] = unwindattrs(mlist, cmd, *args) if (needs_save.get(cmd.replace('.','_'), False) or (needs_save_with_arg.get(cmd.replace('.','_'), False) and len(args) > 0)): mlist.Save() except TypeError, err: error_msg = '%s' % err print json.dumps({'error': error_msg}) except AttributeError, err: error_msg = 'AttributeError: %s' % err print json.dumps({'error': error_msg}) except Errors.MMSubscribeNeedsConfirmation, err: print json.dumps({'result': 'pending_confirmation'}) except Errors.MMAlreadyAMember, err: print json.dumps({'result': 'already_a_member'}) except Errors.MMNeedApproval, err: print json.dumps({'result': 'needs_approval'}) except Exception, err: error_msg = '%s: %s' % (type(err), err) print json.dumps({'error': error_msg}) else: result['result'] = 'success' print json.dumps(result)
def loadlist(mlist, jsonlist):
#newlist = json.loads(jsonlist) #for attr in newlist: #print "Setting %s to %s" % (attr, newlist[attr])