From 014292eaaf4c86b70d97d6e55e81c8382d229254 Mon Sep 17 00:00:00 2001 From: Antoine Durand-gasselin Date: Sat, 26 Feb 2011 23:21:47 +0100 Subject: [PATCH] =?UTF-8?q?[*]=20Corrections=20pour=20les=20blacklistes,?= =?UTF-8?q?=20ajout=20de=20la=20m=C3=A9thode=20blacklist=20actif,=20pgsql?= =?UTF-8?q?=5Ftest?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- attributs.py | 15 ++++++++++----- lc_ldap.py | 31 +++++++++++++++++++++++-------- 2 files changed, 33 insertions(+), 13 deletions(-) diff --git a/attributs.py b/attributs.py index 47aec64..4bd5aaa 100644 --- a/attributs.py +++ b/attributs.py @@ -84,6 +84,7 @@ class Attr(object): return unicode(self).encode('utf-8') def __unicode__(self): + # XXX - Vérifier que cette méthode produit un objet parsable assert isinstance(self.value, unicode) return self.value @@ -256,7 +257,11 @@ class chbre(Attr): if val in (u"EXT", u"????"): self.value = val return - annuaires_pg.chbre_prises(val[0], val[1:]) + try: + annuaires_pg.chbre_prises(val[0], val[1:]) + except NameError: + import annuaires_pg_test + annuaires_pg_test.chbre_prises(val[0], val[1:]) self.value = val class droits(Attr): @@ -267,7 +272,7 @@ class droits(Attr): def parse_value(self, val, ldif): if val.lower() not in ['apprenti', 'nounou', 'cableur', 'tresorier', 'bureau', - 'webmaster', 'webradio', 'imprimeur', 'multimachines', 'victime']: + 'webmaster', 'webradio', 'imprimeur', 'multimachines', 'victime', 'moderateur']: raise ValueError("Ces droits n'existent pas ('%s')" % val) if val.lower() == 'webmaster': self.value = u'WebMaster' @@ -314,7 +319,7 @@ class macAddress(Attr): self.value = format_mac(mac) def __unicode__(self): - return unicode(self.value) + return unicode(self.value).lower() class ipHostNumber(Attr): @@ -435,8 +440,8 @@ class blacklist(Attr): return self.value['actif'] def terminer(self): - self.value['fin'] = max(self.value['debut'], time.time() - 60) - self.actif = False + self.value['fin'] = int(max(self.value['debut'], time.time() - 60)) + self.value['actif'] = False def __unicode__(self): return u'%(debut)s$%(fin)s$%(type)s$%(comm)s' % self.value diff --git a/lc_ldap.py b/lc_ldap.py index 3abe27e..753cdb3 100644 --- a/lc_ldap.py +++ b/lc_ldap.py @@ -275,8 +275,8 @@ class CransLdapObject(object): self.dn, self.attrs = res[0] self.attrs = ldif_to_uldif(self.attrs) + self.attrs = ldif_to_cldif(self.attrs, conn, check_ctxt = False) if mode in ['w', 'rw']: - self.attrs = ldif_to_cldif(self.attrs, conn, check_ctxt = False) ### Vérification que `λv. str(Attr(v))` est bien une projection oldif = res[0][1] nldif = cldif_to_ldif(self.attrs) @@ -289,7 +289,7 @@ class CransLdapObject(object): nvals = [nldif[attr][v.index(v)] for v in vals ] raise EnvironmentError("λv. str(Attr(v)) n'est peut-être pas une projection:", attr, nvals, vals) - self._modifs = ldif_to_cldif(self.attrs, conn, check_ctxt = False) + self._modifs = ldif_to_cldif(ldif_to_uldif(res[0][1]), conn, check_ctxt = False) def save(self): "Vérifie que self._modifs contient des valeurs correctes et enregistre les modifications" @@ -302,8 +302,16 @@ class CransLdapObject(object): # Vérification des modifications self.attrs = ldif_to_uldif(self.conn.search_s(self.dn, 0)[0][1]) - if self.attrs != self._modifs: - raise EnvironmentError("Les modifications apportées à l'objet %s n'ont pas été correctement sauvegardées\nexpected = %s, found = %s" % (self.dn, self._modifs, self.attrs)) + self.attrs = ldif_to_cldif(self.attrs, self.conn, check_ctxt=False) + differences = [] + # On fait les différences entre les deux dicos + for attr in set(self.attrs.keys()).union(set(self._modifs.keys())): + exp_vals = set([unicode(i) for i in self.attrs.get(attr,[])]) + new_vals = set([unicode(i) for i in self._modifs.get(attr,[])]) + if exp_vals != new_vals: + differences.append({"missing": exp_vals - new_vals, "having": new_vals - exp_vals}) + if differences: + raise EnvironmentError("Les modifications apportées à l'objet %s n'ont pas été correctement sauvegardées\n%s" % (self.dn, differences)) def get_modlist(self): """Renvoie le dico des modifs""" @@ -371,7 +379,14 @@ class CransLdapObject(object): out.append(u"%s : [%s] %s" % (date, author, u" ; ".join(mod_list))) return out - def blacklist(self, sanction, commentaire, debut=time.time(), fin = '-'): + def blacklist_actif(self): + """Renvoie la liste des blacklistes actives sur l'entité""" + # XXX - Proposer de filtrer les blacklistes avec un arg supplémentaire ? + # XXX - Vérifier les blacklistes des machines pour les adhérents ? + attrs = (self.attrs if self.mode not in ["w", "rw"] else self._modifs) + return filter((lambda bl: bl.is_actif()), attrs.get("blacklist")) + + def blacklist(self, sanction, commentaire, debut="now", fin = '-'): u""" Blacklistage de la ou de toutes la machines du propriétaire * debut et fin sont le nombre de secondes depuis epoch @@ -381,10 +396,10 @@ class CransLdapObject(object): debut$fin$sanction$commentaire """ if debut == 'now': - debut = time.time() + debut = int(time.time()) if fin == 'now': - fin = time.time() - bl = blacklist(u'%s$%s$%s$%s' % (sanction, commentaire, debut, fin), {}, self.conn, False) + fin = int(time.time()) + bl = blacklist(u'%s$%s$%s$%s' % (debut, fin, sanction, commentaire), {}, self.conn, False) self._modifs.setdefault('blacklist', []).append(bl)