diff --git a/gestion/gest_crans.py b/gestion/gest_crans.py index db5514a0..8eb4298a 100644 --- a/gestion/gest_crans.py +++ b/gestion/gest_crans.py @@ -571,7 +571,7 @@ def set_droits(adher): for key in droits_critiques: if key in adher.droits(): result.append(key.encode("ISO-8859-15")) - adher.droits_light(result) + adher.droits(result, light=True) else: adher.droits(result) diff --git a/gestion/ldap_crans.py b/gestion/ldap_crans.py index 1f40228c..0eddd459 100644 --- a/gestion/ldap_crans.py +++ b/gestion/ldap_crans.py @@ -2296,10 +2296,10 @@ class Adherent(BaseProprietaire): self._set('canonicalAlias', [a]) return a - def droits(self, droits=None): - u""" droits est la liste des droits à donner à l'utilisateur """ - u""" ATTENTION : il y a une autre fonction droits_lights derrière celle-çi, - pensez à faire vos modifs sur les deux """ + def droits(self, droits=None, light=False): + u"""Modifie les droits d'un compte. + droits est la liste des droits à donner à l'utilisateur, + light permet de modifier les droits non critiques sans être Nounou.""" if droits != None and 'cransAccount' not in self._data.get('objectClass', []): raise EnvironmentError(u'Il faut avoir un compte pour avoir des droits.') @@ -2307,10 +2307,13 @@ class Adherent(BaseProprietaire): if droits == None: return map(decode, self._data.get('droits', [])) - from user_tests import isadm - if not isadm(): - raise EnvironmentError(u'Il faut être administrateur pour effectuer cette opération.') + # Si pas light, il faut être Nounou + if not light: + from user_tests import isadm + if not isadm(): + raise EnvironmentError(u'Il faut être administrateur pour effectuer cette opération.') + # On vérifie la liste donnée if type(droits) != list: raise TypeError(u'Une liste est attendue') @@ -2323,51 +2326,19 @@ class Adherent(BaseProprietaire): new.append(droit.encode('utf-8')) ancien = self._data.get('droits', []) + # On envoie les mails de "bienvenue" pour chaque nouveau droit for droit in new: if droit not in ancien: db.services_to_restart("mail_ajout_droits", self.compte().encode('latin-1') + ":" + droit) - if new != self._data.get('droits', []): - self._set('droits', new) - return new + # Si light, alors on n'a pas le droit de modifier les droits critiques + if light: + diff = [droit for droit in (ancien + new) + if (droit not in ancien or droit not in new) and (droit in droits_critiques)] + if len(diff) > 0: + raise("Droits critiques modifies (?) :: %s" % ','.join(diff)) - def droits_light(self, droits=None): - u""" droits_light ne verifie pas isadm et ne touche pas aux droits critiques """ - - if droits != None and 'cransAccount' not in self._data.get('objectClass', []): - raise EnvironmentError(u'Il faut avoir un compte pour avoir des droits.') - - if droits == None: - return map(decode, self._data.get('droits', [])) - - if type(droits) != list: - raise TypeError(u'Une liste est attendue') - - new = [] - for droit in droits: - if droit == '': continue - droit = unicode(droit.strip(), 'iso-8859-15') - if droit not in droits_possibles: - raise ValueError(u'Droit %s incorrect' % droit) - new.append(droit.encode('utf-8')) - - ancien = self._data.get('droits', []) - for droit in new: - if droit not in ancien: - db.services_to_restart("mail_ajout_droits", self.compte().encode('latin-1') + ":" + droit) - diff = [] - for droit in new: - if droit not in ancien: - diff.append(droit) - for droit in ancien: - if droit not in new: - diff.append(droit) - dc = [] # snif... il faut reencoder la liste des droits critiques - for droit in droits_critiques: - dc.append(droit.encode('utf-8')) - for droit in diff: - if droit in dc: - raise("Droits critiques modifies (?)") + # Sauvegarde if new != self._data.get('droits', []): self._set('droits', new)