diff --git a/attributs.py b/attributs.py index 657a211..8c4cbea 100644 --- a/attributs.py +++ b/attributs.py @@ -62,6 +62,14 @@ class Attr(object): can_modify = ['Nounou'] """La liste des droits qui suffisent à avoir le droit de modifier la valeur""" + can_view = ['Nounou', 'apprenti', 'self', 'parent', 'owner'] + """Qui peut voir l'attribut. Par défaut, les nounous et les apprentis + peuvent tout voir. Par transparence, et par utilité, on autorise par + défaut l'adhérent à voir les données le concernant.""" + + category = 'other' + """Catégorie de l'attribut (pour affichage futur)""" + def __init__(self, val, ldif, conn, ctxt_check): """Crée un nouvel objet représentant un attribut. @@ -135,6 +143,11 @@ class objectClass(Attr): optional = False legend = "entité" + can_modify = [] + """ Personne ne doit modifier de classe """ + + can_view = ['Nounou', 'apprenti'] + """ Internal purpose (et à fin pédagogique) """ def parse_value(self, val, ldif): if val not in [ 'top', 'posixAccount', 'shadowAccount', 'proprio', @@ -160,16 +173,25 @@ class aid(intAttr): singlevalue = True optional = True legend = u"Identifiant de l'adhérent" + category = 'id' + + can_modify = [] + """ Personne ne devrait modifier un attribut d'identification """ + + can_view = ['Nounou', 'apprenti', 'cableurs'] class uid(Attr): singlevalue = True option = False legend = u"L'identifiant canonique de l'adhérent" + category = 'perso' class nom(Attr): singlevalue = True optional = False legend = "Nom" + category = 'perso' + can_modify = ["Nounou", "Cableur"] def parse_value(self, val, ldif): if u'club' in ldif['objectClass']: @@ -177,11 +199,12 @@ class nom(Attr): else: self.value = validate_name(val) - class prenom(Attr): singlevalue = True optional = False legend = u"Prénom" + category = 'perso' + can_modify = ["Nounou", "Cableur"] def parse_value(self, val, ldif): self.value = validate_name(val) @@ -191,6 +214,7 @@ class tel(Attr): singlevalue = True optional = False legend = u"Téléphone" + category = 'perso' can_modify = ["self", "Nounou", "Cableur"] def parse_value(self, val, ldif): @@ -212,9 +236,13 @@ class yearAttr(intAttr): class paiement(yearAttr): legend = u"Paiement" can_modify = ["Cableur", "Nounou", "tresorier"] + category = 'perso' class carteEtudiant(yearAttr): legend = u"Carte d'étudiant" + category = 'perso' + can_modify = ["Cableur", "Nounou", "tresorier"] + class mailAlias(Attr): @@ -222,6 +250,7 @@ class mailAlias(Attr): optional = True legend = u"Alias mail" can_modify = ["self", "Cableur", "Nounou"] + category = 'mail' def parse_value(self, val, ldif): val = val.lower() @@ -234,6 +263,7 @@ class canonicalAlias(Attr): singlevalue = True optional = False legend = u"Alias mail canonique" + category = 'mail' def parse_value(self, val, ldif): val = u".".join([ a.capitalize() for a in val.split(u'.', 1) ]) @@ -241,12 +271,12 @@ class canonicalAlias(Attr): raise ValueError("Alias mail invalide (%s)" % val) self.value = val - class etudes(Attr): singlevalue = False optional = False legend = u"Études" can_modify = ["self", "Cableur", "Nounou"] + category = 'perso' def parse_value(self, val, ldif): # who cares @@ -258,6 +288,7 @@ class chbre(Attr): optional = False legend = u"Chambre sur le campus" can_modify = ["self", "Cableur", "Nounou"] + category = 'perso' def parse_value(self, val, ldif): if self.ctxt_check: # Si ce n'est pas la peine de vérifier, on ne vérifie pas @@ -285,6 +316,7 @@ class droits(Attr): optional = True legend = u"Droits sur les serveurs" can_modify = ["Nounou", "Bureau"] + category = 'perso' def parse_value(self, val, ldif): if val.lower() not in ['apprenti', 'nounou', 'cableur', 'tresorier', 'bureau', @@ -308,6 +340,7 @@ class solde(Attr): self.value = solde class dnsAttr(Attr): + category = 'dns' def parse_value(self, dns, ldif): dns = dns.lower() name, net = dns.split('.', 1) @@ -322,6 +355,7 @@ class host(dnsAttr): optional = False hname = legend = u"Nom d'hôte" can_modify = ["parent", "Nounou", "Cableur"] + category = 'base_tech' class macAddress(Attr): @@ -329,6 +363,7 @@ class macAddress(Attr): optional = False legend = u"Adresse physique de la carte réseau" hname = "Adresse MAC" + category = 'base_tech' can_modify = ["parent", "Nounou", "Cableur"] def parse_value(self, mac, ldif): @@ -343,6 +378,7 @@ class ipHostNumber(Attr): optional = False legend = u"Adresse IPv4 de la machine" hname = "IPv4" + category = 'base_tech' def parse_value(self, ip, ldif): if ip == '': @@ -357,6 +393,7 @@ class mid(Attr): singlevalue = True optional = False legend = "Identifiant de machine" + category = 'id' def parse_value(self, mid, ldif): self.value = Mid(mid = int(mid)) @@ -374,21 +411,25 @@ class ipsec(Attr): singlevalue = False optional = True legend = u'Clef wifi' + category = 'wifi' class puissance(Attr): singlevalue = True optional = True legend = u"puissance d'émission pour les bornes wifi" + category = 'wifi' class canal(intAttr): singlevalue = True optional = True legend = u'Canal d\'émission de la borne' - + category = 'wifi' class portAttr(Attr): singlevalue = False optional = True + legend = u'Ouverture de port' + category = 'firewall' def parse_value(self, port, ldif): if ":" in port: @@ -435,6 +476,7 @@ class prise(Attr): singlevalue = True optional = True legend = u"Prise sur laquelle est branchée la machine" + category = 'base_tech' def parse_value(self, prise, ldif): ### Tu es une Nounou, je te fais confiance @@ -444,11 +486,13 @@ class cid(intAttr): singlevalue = True optional = True legend = u"Identifiant du club" + category = 'id' class responsable(Attr): singlevalue = True optional = True legend = u"Responsable du club" + category = 'perso' def get_respo(self): if self.value == None: @@ -467,6 +511,7 @@ class blacklist(Attr): singlevalue = False optional = True legend = u"Blackliste" + category = 'info' def parse_value(self, bl, ldif): bl_debut, bl_fin, bl_type, bl_comm = bl.split('$') @@ -491,24 +536,28 @@ class historique(Attr): singlevalue = False optional = True legend = u"Historique de l'objet" + category = 'info' class info(Attr): singlevalue = False optional = True legend = u"Quelques informations" + category = 'info' can_modify = ["Nounou", "Cableur", "Bureau"] class homepageAlias(Attr): singlevalue = True optional = True legend = u'Un alias pour la page personnelle' - can_modify = ["WebMaster", "Nounou", "Cableur"] + can_modify = ["Nounou", "Cableur"] + category = 'webpage' class charteMA(Attr): singlevalue = True optional = True legend= "Signale si l'adhérent a signé la charte de membres actifs" can_modify = ["Nounou", "Bureau"] + category = 'perso' def parse_value(self, signed, ldif): if signed.upper() not in ["TRUE", "FALSE"]: @@ -569,16 +618,19 @@ class uidNumber(intAttr): singlevalue = True optional = True legend = "L'uid du compte de l'adherent" + category = 'id' class gidNumber(intAttr): singlevalue = True optional = True legend = "Le gid du compte de l'adhérent" + category = 'id' class gecos(Attr): singlevalue = True optional = True legend = "Le gecos" + category = 'id' def parse_value(self, gecos, ldif): a, b, c, d = gecos.split(',') @@ -589,6 +641,7 @@ class mail(Attr): optional = False legend = "Le mail de l'adhérent" can_modify = ["self", "Nounou", "Cableur"] + category = 'mail' # XXX - to be implemented #def parse_value(self, mail, ldif): @@ -597,20 +650,26 @@ class mail(Attr): class cn(Attr): singlevalue = True optional = False + category = 'id' class dn(Attr): singlevalue = True optional = False + category = 'id' class postalAddress(Attr): singlevalue = False optional = True can_modify = ["self", "Cableur", "Nounou", "Bureau"] + legend = u"Adresse" + category = 'perso' class controle(Attr): singlevalue = True optional = False + legend = u"Contrôle" can_modify = ["Tresorier", "Nounou"] + category = 'perso' def parse_value(self, ctrl, ldif): if ctrl not in [u"", u"c", u"p", u"cp", u"pc"]: @@ -631,6 +690,7 @@ CRANS_ATTRIBUTES= { 'prenom' : prenom, 'tel' : tel, 'paiement' : paiement, + 'controle': controle, 'carteEtudiant' : carteEtudiant, 'mailAlias' : mailAlias, 'canonicalAlias' : canonicalAlias, diff --git a/lc_ldap.py b/lc_ldap.py index dbd983e..3041308 100644 --- a/lc_ldap.py +++ b/lc_ldap.py @@ -278,6 +278,19 @@ def new_cransldapobject(conn, dn, mode='ro', ldif = None): class CransLdapObject(object): """Classe de base des objets CransLdap. Cette classe ne devrait pas être utilisée directement.""" + + """ Champs uniques et nécessaires """ + ufields = [] + + """ Champs uniques facultatifs """ + ofields = [] + + """ Champs multivalués facultatifs """ + mfields = [] + + """ Champs obligatoires multivalué """ + xfields = [] + def __init__(self, conn, dn, mode='ro', ldif = None): ''' Créée une instance d'un objet Crans (machine, adhérent, @@ -533,7 +546,7 @@ class AssociationCrans(proprio): class adherent(proprio): u"""Adhérent crans.""" ufields = proprio.ufields + ['aid', 'prenom', 'tel', 'mail', 'mailInvalide'] - ofields = proprio.ofields + ['charteMA', 'adherentPayant', 'typeAdhesion', + ofields = proprio.ofields + ['charteMA', 'canonicalAlias', 'solde', 'contourneGreylist', 'rewriteMailHeaders', 'derniereConnexion', 'homepageAlias']