[lc_ldap] On met en place un système de propagation de certaines modifications.
* Quand on modifie un attribut qui devrait en modifier d'autres, on peut invoquer check_changes pour voir ce qui devrait être changé, puis validate_changes pour rendre ces changements effectifs. Il ne reste plus qu'à appeler save pour enregistrer le tout. * Correction de petits problèmes sur les locks : quand save réussissait, ils n'étaient pas virés.
This commit is contained in:
parent
9540bc572c
commit
c2968c6b15
5 changed files with 133 additions and 28 deletions
107
objets.py
107
objets.py
|
@ -190,6 +190,18 @@ class CransLdapObject(object):
|
|||
faite"""
|
||||
pass
|
||||
|
||||
def check_changes(self):
|
||||
"""
|
||||
Vérifie la consistence d'un objet
|
||||
"""
|
||||
pass
|
||||
|
||||
def validate_changes(self):
|
||||
"""
|
||||
Après vérification, harmonise l'objet
|
||||
"""
|
||||
pass
|
||||
|
||||
def create(self, login=None):
|
||||
"""Crée l'objet dans la base ldap, cette méthode vise à faire en sorte que
|
||||
l'objet se crée lui-même, si celui qui essaye de le modifier a les droits
|
||||
|
@ -263,9 +275,12 @@ class CransLdapObject(object):
|
|||
modlist = self.get_modlist()
|
||||
try:
|
||||
self.conn.modify_s(self.dn, modlist)
|
||||
self.conn.lockholder.purge(id(self))
|
||||
self.conn.lockholder.purge()
|
||||
except:
|
||||
# On nettoie les locks
|
||||
self.conn.lockholder.purge(id(self))
|
||||
self.conn.lockholder.purge()
|
||||
self._modifs = self.attrs
|
||||
raise EnvironmentError("Impossible de modifier l'objet, peut-être n'existe-t-il pas ?")
|
||||
|
||||
|
@ -350,15 +365,16 @@ class CransLdapObject(object):
|
|||
# sert à permettre les vérifications de cardinalité
|
||||
# (on peut pas utiliser self._modifs, car il ne faut
|
||||
# faire le changement que si on peut)
|
||||
|
||||
attrs_before_verif = [ attributs.attrify(val, attr, self.conn, Parent=self) for val in values ]
|
||||
if attr in self.attrs.keys():
|
||||
for attribut in attrs_before_verif:
|
||||
attribut.check_uniqueness([content.value for content in self.attrs[attr]])
|
||||
attribut.check_uniqueness([unicode(content) for content in self.attrs[attr]])
|
||||
|
||||
# On groupe les attributs précédents, et les nouveaux
|
||||
mixed_attrs = attrs_before_verif + self.attrs[attr]
|
||||
else:
|
||||
for attribut in attrs_before_verif:
|
||||
attribut.check_uniqueness([])
|
||||
mixed_attrs = attrs_before_verif
|
||||
# Si c'est vide, on fait pas de vérifs, on avait une liste
|
||||
# vide avant, puis on en a une nouvelle après.
|
||||
|
@ -369,7 +385,11 @@ class CransLdapObject(object):
|
|||
self._modifs[attr] = attrs_before_verif
|
||||
for attribut in attrs_before_verif:
|
||||
if attribut.unique:
|
||||
self.conn.lockholder.addlock(attr, str(attribut), id(self))
|
||||
try:
|
||||
self.conn.lockholder.addlock(attr, str(attribut), id(self))
|
||||
except:
|
||||
self._modifs[attr] = list(self.attrs[attr])
|
||||
raise
|
||||
|
||||
def search_historique(self, ign_fields=HIST_IGNORE_FIELDS):
|
||||
u"""Récupère l'historique
|
||||
|
@ -632,8 +652,85 @@ class machine(CransLdapObject):
|
|||
if self._proprio._machines is not None:
|
||||
self._proprio._machines.remove(self)
|
||||
|
||||
def check_changes(self):
|
||||
old = {}
|
||||
new = {}
|
||||
sbm = {'rid' : (), 'ipHostNumber' : (), 'ip6HostNumber' : ()}
|
||||
default = {'rid': -1, 'ipHostNumber': u'', 'macAddress': u''}
|
||||
for i in ['rid', 'ipHostNumber', 'macAddress']:
|
||||
try:
|
||||
old[i] = self.attrs[i][0].value
|
||||
except:
|
||||
old[i] = default[i]
|
||||
try:
|
||||
new[i] = self._modifs[i][0].value
|
||||
except:
|
||||
new[i] = default[i]
|
||||
if old['rid'] != new['rid']:
|
||||
nip4 = unicode(crans_utils.ip4_of_rid(new['rid']))
|
||||
oip4 = unicode(new['ipHostNumber'])
|
||||
if oip4 != nip4:
|
||||
sbm['ipHostNumber'] = (oip4, nip4)
|
||||
nip6 = unicode(crans_utils.ip6_of_mac(new['macAddress'], new['rid']))
|
||||
try:
|
||||
oip6 = unicode(self._modifs['ip6HostNumber'][0])
|
||||
except:
|
||||
oip6 = u""
|
||||
if oip6 != nip6:
|
||||
sbm['ip6HostNumber'] = (oip6, nip6)
|
||||
return sbm
|
||||
elif unicode(old['ipHostNumber']) != unicode(new['ipHostNumber']):
|
||||
nrid = crans_utils.rid_of_ip4(new['ipHostNumber'])
|
||||
orid = new['rid']
|
||||
if nrid != orid:
|
||||
sbm['rid'] = (orid, nrid)
|
||||
return sbm
|
||||
elif old['macAddress'] != new['macAddress']:
|
||||
nip6 = unicode(crans_utils.ip6_of_mac(new['macAddress'], new['rid']))
|
||||
try:
|
||||
oip6 = unicode(self._modifs['ip6HostNumber'][0])
|
||||
except:
|
||||
oip6 = u""
|
||||
if oip6 != nip6:
|
||||
sbm['ip6HostNumber'] = (oip6, nip6)
|
||||
return sbm
|
||||
|
||||
def validate_changes(self):
|
||||
sbm = self.check_changes()
|
||||
if sbm['rid']:
|
||||
if sbm['rid'][1] == -1:
|
||||
try:
|
||||
ip6 = unicode(self._modifs['ip6HostNumber'][0])
|
||||
except:
|
||||
ip6 = u""
|
||||
if ip6 != u"":
|
||||
realm = crans_utils.find_rid_plage(sbm['rid'][0])[0]
|
||||
if 'v6' not in realm:
|
||||
realm = realm + "-v6"
|
||||
self['rid'] = [unicode(self.conn._find_id('rid', realm))]
|
||||
self['ip6HostNumber'] = [unicode(crans_utils.ip6_of_mac(self['macAddress'][0].value, self['rid'][0].value))]
|
||||
else:
|
||||
self['ipHostNumber'] = []
|
||||
self['ip6HostNumber'] = []
|
||||
else:
|
||||
if unicode(self['ipHostNumber'][0]) != unicode(ip4_of_rid(sbm['rid'][1])):
|
||||
raise ValueError("L'ipv4 et le rid ne concordent pas !")
|
||||
self['ip6HostNumber'] = [unicode(crans_utils.ip6_of_mac(self['macAddress'][0].value, self['rid'][0].value))]
|
||||
if sbm['ipHostNumber']:
|
||||
if sbm['ipHostNumber'][1] == u"":
|
||||
ip4 = []
|
||||
else:
|
||||
ip4 = sbm['ipHostNumber'][1]
|
||||
self['ipHostNumber'] = ip4
|
||||
if sbm['ip6HostNumber']:
|
||||
if sbm['ip6HostNumber'][1] == u"":
|
||||
ip6 = []
|
||||
else:
|
||||
ip6 = sbm['ip6HostNumber'][1]
|
||||
self['ip6HostNumber'] = ip6
|
||||
|
||||
class AssociationCrans(proprio):
|
||||
u""" Association crans (propriétaire particulier)."""
|
||||
""" Association crans (propriétaire particulier)."""
|
||||
def save(self):
|
||||
pass
|
||||
|
||||
|
@ -647,8 +744,6 @@ class BaseInvites(proprio):
|
|||
u"""Un artefact de la base ldap"""
|
||||
def delete(self, comm, login):
|
||||
raise EnvironmentError("Les pauvres invites")
|
||||
pass
|
||||
|
||||
|
||||
@crans_object
|
||||
class adherent(proprio):
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue