see todolist changelog for new features.
authorx2000habouzit <x2000habouzit>
Thu, 9 Sep 2004 12:49:24 +0000 (12:49 +0000)
committerx2000habouzit <x2000habouzit>
Thu, 9 Sep 2004 12:49:24 +0000 (12:49 +0000)
discovered that instead of looping on elements, you ca use :
  if elt in list:
wich is quite shorter ;p

and some code optimisations.

scripts/mailman/mailman-rpc.py
scripts/mailman/mman

index 2a29653..233e562 100755 (executable)
 #*  Foundation, Inc.,                                                      *
 #*  59 Temple Place, Suite 330, Boston, MA  02111-1307  USA                *
 #***************************************************************************
-#       $Id: mailman-rpc.py,v 1.8 2004-09-09 09:28:34 x2000habouzit Exp $
+#       $Id: mailman-rpc.py,v 1.9 2004-09-09 12:49:24 x2000habouzit Exp $
 #***************************************************************************
 
 import base64, MySQLdb
+import MySQLdb.converters
 
 from SimpleXMLRPCServer import SimpleXMLRPCServer
 from SimpleXMLRPCServer import SimpleXMLRPCRequestHandler
@@ -36,8 +37,10 @@ class UserDesc: pass
 
 class AuthFailed(Exception): pass
 
-import MySQLdb.converters
-
+################################################################################
+#
+# CLASSES
+#
 #------------------------------------------------
 # Manage Basic authentication
 #
@@ -93,58 +96,53 @@ class BasicAuthXMLRPCRequestHandler(SimpleXMLRPCRequestHandler):
         else:
             return None
 
-#------------------------------------------------
-# Procedures
+################################################################################
+#
+# XML RPC STUFF
+#
+#-------------------------------------------------------------------------------
+# helpers
 #
 
 def connectDB():
-    try:
-        db = MySQLdb.connect(
-                db='x4dat',
-                user=mm_cfg.MYSQL_USER,
-                passwd=mm_cfg.MYSQL_PASS,
-                unix_socket='/var/run/mysqld/mysqld.sock')
-        db.ping()
-        return db.cursor()
-    except:
-        return None
+    db = MySQLdb.connect(
+            db='x4dat',
+            user=mm_cfg.MYSQL_USER,
+            passwd=mm_cfg.MYSQL_PASS,
+            unix_socket='/var/run/mysqld/mysqld.sock')
+    db.ping()
+    return db.cursor()
+
+def is_admin_on(userdesc,mlist):
+    return ( userdesc.perms == 'admin' ) or ( userdesc.address in mlist.owner )
 
-def lists_names(userdesc):
+#-------------------------------------------------------------------------------
+# users procedures
+#
+
+def get_lists(userdesc):
     names = Utils.list_names()
     names.sort()
     result = []
     for name in names:
         try:
             mlist = MailList.MailList(name, lock=0)
-        except Errors.MMListError:
+        except Errors.MMListError, e:
             continue
-        is_member = False
-        is_owner = False
-        for member in mlist.getRegularMemberKeys():
-            if userdesc.address == member:
-                is_member = True
-                break
-        for owner in mlist.owner:
-            if userdesc.address == owner:
-                is_owner = True
-                break
-        if ( mlist.advertised ) or ( userdesc.perms == 'admin' ) or is_member or is_owner:
-            result.append( (name,mlist.advertised,is_member,is_owner) )
+        is_member = userdesc.address in mlist.getRegularMemberKeys()
+        is_owner  = userdesc.address in mlist.owner
+        is_admin  = mm_cfg.ADMIN_ML_OWNER in mlist.owner
+        if ( mlist.advertised ) or ( userdesc.perms == 'admin' and is_admin ) or is_member or is_owner:
+            result.append( (name,1-mlist.advertised+is_admin,is_member,is_owner) )
     return result
 
-def members(userdesc,listname):
+def get_members(userdesc,listname):
     try:
         mlist = MailList.MailList(listname, lock=False)
     except Errors.MMListError, e:
         return None
     members = mlist.getRegularMemberKeys()
-    if ( userdesc.perms == 'admin' ) or ( mlist.advertised ):
-        return (members,mlist.owner)
-    for member in members:
-        if member == userdesc.address:
-            return (members,mlist.owner)
-    for member in mlist.owner:
-        if member == userdesc.address:
+    if ( mlist.advertised ) or ( is_admin_on(userdesc, mlist) ) or ( userdesc.address in members ):
             return (members,mlist.owner)
 
 def subscribe(userdesc,listname):
@@ -153,22 +151,15 @@ def subscribe(userdesc,listname):
     except Errors.MMListError, e:
         return 0
     try:
-        approved = ( mlist.subscribe_policy in (0,1) ) or ( userdesc.perms == 'admin' )
-        if approved is False :
-            for owner in mlist.owner:
-                if owner == userdesc.address:
-                    approved = True
-                    break
-        if approved:
+        if ( mlist.subscribe_policy in (0,1) ) or is_admin_on(userdesc,mlist):
             result = 2
             mlist.ApprovedAddMember(userdesc)
             mlist.Save()
         else:
             result = 1
             mlist.AddMember(userdesc,'xml-rpc iface')
-    except Exception, e:
-        mlist.Unlock()
-        return 0
+    except:
+        result = 0
     mlist.Unlock()
     return result
 
@@ -180,24 +171,117 @@ def unsubscribe(userdesc,listname):
     except Errors.MMListError, e:
         return 0
     try:
-        mlist.ApprovedDeleteMember(userdesc.address, 'xml-rpc iface', False, False);
+        mlist.ApprovedDeleteMember(userdesc.address, 'xml-rpc iface', False, False)
         mlist.Save()
-    except Exception, e:
+    except:
         mlist.Unlock()
         return 0
     mlist.Unlock()
     return 1
 
+#-------------------------------------------------------------------------------
+# owners procedures
+#
+
+def mass_subscribe(userdesc,listname,users):
+    try:
+        mlist = MailList.MailList(listname, lock=True)
+    except Errors.MMListError, e:
+        return None
+    try:
+        if not is_admin_on(userdesc,mlist):
+            return None
+        
+        added = []
+        for user in users:
+            mysql.execute ("""SELECT  CONCAT(u.prenom,' ',u.nom)
+                                FROM  auth_user_md5 AS u
+                          INNER JOIN  aliases       AS a ON (a.id=u.user_id AND alias='%s')
+                               LIMIT  1""" %( user ) )
+            if int(mysql.rowcount) is 1:
+                row = mysql.fetchone()
+                userd = UserDesc()
+                userd.fullname = row[0]
+                userd.address = user+'@polytechnique.org'
+                userd.digest = 0
+                mlist.ApprovedAddMember(userd)
+                added.append( (userd.fullname, userd.address) )
+    except:
+        pass
+    mlist.Save()
+    mlist.Unlock()
+    return added
+
+def mass_unsubscribe(userdesc,listname,users):
+    try:
+        mlist = MailList.MailList(listname, lock=True)
+    except Errors.MMListError, e:
+        return None
+    try:
+        if not is_admin_on(userdesc,mlist):
+            return None
+        
+        deleted = []
+        for user in users:
+            mlist.ApprovedDeleteMember(user+'@polytechnique.org', 'xml-rpc iface', False, False)
+            deleted.append( user )
+    except:
+        pass
+    mlist.Save()
+    mlist.Unlock()
+    return deleted
+
+def add_owner(userdesc,listname,user):
+    try:
+        mlist = MailList.MailList(listname, lock=True)
+    except Errors.MMListError, e:
+        return None
+    try:
+        if not is_admin_on(userdesc,mlist):
+            return None
+        addr = user+'@polytechnique.org'
+        if addr not in mlist.owner:
+            mlist.owner.append(addr)
+    except:
+        pass
+    mlist.Save()
+    mlist.Unlock()
+    return True
+
+def del_owner(userdesc,listname,user):
+    try:
+        mlist = MailList.MailList(listname, lock=True)
+    except Errors.MMListError, e:
+        return None
+    try:
+        if not is_admin_on(userdesc,mlist):
+            return None
+        mlist.owner.remove(user+'@polytechnique.org')
+    except:
+        pass
+    mlist.Save()
+    mlist.Unlock()
+    return True
+
+################################################################################
+#
+# INIT 
+#
 #------------------------------------------------
 # server
 #
 
 mysql = connectDB()
 server = SimpleXMLRPCServer(("localhost", 4949), BasicAuthXMLRPCRequestHandler)
-server.register_function(lists_names)
-server.register_function(members)
+server.register_function(get_lists)
+server.register_function(get_members)
 server.register_function(subscribe)
 server.register_function(unsubscribe)
+
+server.register_function(mass_subscribe)
+server.register_function(mass_unsubscribe)
+server.register_function(add_owner)
+server.register_function(del_owner)
 #server.register_introspection_functions()
 server.serve_forever()
 
index 3774360..b02a982 100644 (file)
@@ -1,13 +1,13 @@
     - possibilité de les lister les listes, avec :
 [X]   o listes publiques listes publiques (tout le monde peut les lister)
 [X]   o listes privées (on ne peut les lister que si on y appartient)
-[ ]   o listes admin (on ne peut les lister que si on est admin)
+[X]   o listes admin (on ne peut les lister que si on est admin)
 
     - pour le gestionnaire, possibilité de :
-[ ]   o ajouter un utilisateur
-[ ]   o supprimer un utilisateur
-[ ]   o ajouter/supprimer un autre gestionnaire
-[ ]   o ajouter supprimer un moderateur
+[X]   o ajouter un utilisateur
+[X]   o supprimer un utilisateur
+[X]   o ajouter/supprimer un autre gestionnaire
+[X]   o ajouter supprimer un moderateur
 [ ]   o possibilité de changer le message de bienvenue sur la liste
 [ ]   o possiblité de modérer des messages via _notre_ interface
 
@@ -17,7 +17,7 @@
     - les inscrits lamdas :
 [X]   o possibilité de s'inscrire tout seul si la ML est en inscription libre
 [X]   o possibilité de se desinscrire tt seul pour toutes les ML
-[-]   o possibilité de faire une demande d'inscription pour les listes publiques mais non libres d'inscription
+[?]   o possibilité de faire une demande d'inscription pour les listes publiques mais non libres d'inscription
 [X]   o possiblité de lister les membres d'une ML publique (inscrit ou pas inscrit) ou dont on fait partie
 [X]   o possiblité d'afficher le nom du proprio de la liste (mmes choses que ligne précédente)
 [ ]   o possibilité d'activer l'option digest