From 5499472a9c39e7684001e6ccc6e3d48b691080d9 Mon Sep 17 00:00:00 2001 From: glondu Date: Sat, 20 May 2006 17:37:37 +0200 Subject: [PATCH] - Nouvelle methode derniereConnexion pour Adherent. - On verifie que la nouvelle valeur n'est pas nulle dans la methode _set de BaseClasseCrans. darcs-hash:20060520153737-68412-dd0a67b580cd1e23440667a6f8fae697905c7de3.gz --- gestion/ldap_crans.py | 48 ++++++++++++++++++++++++++++++++++++++----- gestion/whos.py | 29 ++++++++++++++++---------- 2 files changed, 61 insertions(+), 16 deletions(-) diff --git a/gestion/ldap_crans.py b/gestion/ldap_crans.py index d26e33e0..048876ce 100755 --- a/gestion/ldap_crans.py +++ b/gestion/ldap_crans.py @@ -1031,7 +1031,8 @@ class BaseClasseCrans(CransLdap): for champ in ['chbre', 'nom', 'prenom', 'mail', 'tel', 'rewriteMailHeaders', 'contourneGreylist', 'puissance', 'canal', 'prise', 'responsable', - 'macAddress', 'ipHostNumber', 'host', 'positionBorne']: + 'macAddress', 'ipHostNumber', 'host', 'positionBorne', + 'derniereConnexion']: if champ in self.modifs: if champ not in self._init_data.keys(): valeur_initiale = 'N/A' @@ -1077,6 +1078,13 @@ class BaseClasseCrans(CransLdap): timestamp = time.localtime() hist = "%s, %s" % ( time.strftime(date_format, timestamp), script_utilisateur ) + + if self.modifs.has_key('derniereConnexion'): + # On nettoie l'historique pour ne garder que la dernière modification + # (celle en cours) + self._data['historique'] = [x + for x in self._data['historique'] + if 'derniereConnexion' not in x] # On loggue try: @@ -1176,7 +1184,10 @@ class BaseClasseCrans(CransLdap): pass def _set(self, champ, val, comment=None): - """ Met à jour les données de data et modifie modifs si besoin """ + """ + Met à jour les données de _data et modifie modifs si besoin. + Si val=[] ou None, supprime le champ. + """ # On convertit éventuellement en utf-8 avant # On n'utilise pas preattr pour éviter de tout casser... mais # il faudra à l'avenir que _set reçoive toujours en unicode @@ -1188,7 +1199,10 @@ class BaseClasseCrans(CransLdap): comment = convert(comment) # On fait le changement et on note s'il y a vraiment eu une modif if self._data.get(champ, []) != val: - self._data[champ] = val + if val: + self._data[champ] = val + else: + self._data.pop(champ) if self.modifs.get(champ) == None or comment == None: self.modifs[champ] = comment else: @@ -1201,6 +1215,7 @@ class BaseClasseCrans(CransLdap): class BaseProprietaire(BaseClasseCrans): """ Méthodes de bases pour les classes Adherent et Club """ + def __init__(self, data=(), mode='', conn=None): """ Si data est fourni initialise l'adhérent avec les valeurs données @@ -2065,6 +2080,29 @@ class Adherent(BaseProprietaire): # renvoie la valeur trouvée dans la base return bool(self._data.get('rewriteMailHeaders', [])) + + def derniereConnexion(self, new=False): + """ + Date de dernière connexion. Le format est le nombre de secondes + écoulées depuis Epoch. Si new est donné, met à jour la valeur si + elle est plus récente. + """ + + # si l'adhérent n'a pas de compte, on lève une exception + if not self.compte(): + raise NotImplementedError, u"L'adhérent n'a pas de compte" + + current = int(self._data.get('derniereConnexion', ['0'])[0]) + + if new: + # lève une exception si l'argument n'est pas valide + new = int(new) + if new > current: + self._set('derniereConnexion', [str(new)]) + current = new + + return current + class Club(BaseProprietaire): """ Classe de définition d'un club """ @@ -2872,14 +2910,14 @@ class BorneWifi(Machine): On utilise des strings plutôt que des floats à cause de la précision. """ if new == False: - valeur = self._data.get('positionBorne',[''])[0] + valeur = self._data.get('positionBorne', [''])[0] if valeur: return tuple(valeur.split(' ')) else: return None elif new == None: - self._data.pop('positionBorne') + self._set('positionBorne', []) return None else: diff --git a/gestion/whos.py b/gestion/whos.py index 86efc521..01dd3d93 100755 --- a/gestion/whos.py +++ b/gestion/whos.py @@ -48,7 +48,7 @@ except: base = None -from time import strftime, localtime +from time import strftime, localtime, time from ldap_crans import is_actif, crans_ldap, ann_scol, AssociationCrans, hostname from ldap_crans import MachineWifi, BorneWifi from affich_tools import * @@ -114,7 +114,7 @@ def adhers_brief(adhers) : adhers.sort(lambda x, y: cmp((x.nom(), x.prenom()), (y.nom(), y.prenom()))) for a in adhers: - ## Etat administratif + ## État administratif ok = u'\x1b[1;32mo\x1b[1;0m' ook = u'\x1b[1;32mO\x1b[1;0m' nok = u'\x1b[1;31mn\x1b[1;0m' @@ -205,7 +205,7 @@ def clubs_brief(clubs) : clubs.sort(lambda x, y: cmp(x.Nom(), y.Nom())) for c in clubs : - ## Etat administratif + ## État administratif ok = u'\x1b[1;32mo\x1b[1;0m' ook = u'\x1b[1;32mO\x1b[1;0m' nok = u'\x1b[1;31mn\x1b[1;0m' @@ -360,10 +360,17 @@ def adher_details(adher) : except IOError, e: # Pas de .forward, ou .forward privé... on laisse tomber pass - + f += coul(u'Dernière connexion : ', 'gras') + timestamp = adher.derniereConnexion() + if timestamp == 0: + f += coul(u'Jamais', 'rouge') + else: + f += coul(strftime('%d/%m/%Y %H:%M', localtime(timestamp)), + time()-timestamp > 32*24*3600 and 'rouge' or '') + f += u'\n' - # Etat administratif - f += coul(u'Etat administratif : ','gras') + # État administratif + f += coul(u'État administratif : ','gras') jour=1 if ann_scol not in adher.carteEtudiant() : f += coul(u"manque carte d'étudiant",'violet') @@ -406,12 +413,12 @@ def adher_details(adher) : f += u'(%s)' % prise_etat(adher.chbre()) f += u'\n' - # Etudes + # Études if adher.etudes(1).isdigit() : - f += coul(u'Etudes : ','gras')+ "%s %s%s\n" % \ + f += coul(u'Études : ','gras')+ "%s %s%s\n" % \ ( adher.etudes(0), adher.etudes(1), adher.etudes(2) ) elif adher.etudes(0) : - f += coul(u'Etudes : ','gras')+ "%s %s %s\n" % \ + f += coul(u'Études : ','gras')+ "%s %s %s\n" % \ ( adher.etudes(0), adher.etudes(1), adher.etudes(2) ) # Solde @@ -627,8 +634,8 @@ def club_details(club) : # responsale f += coul(u'Responsable : ','gras') + "%s\n" % club.responsable().Nom() - # Etat administratif - f += coul(u'Etat administratif : ','gras') + # État administratif + f += coul(u'État administratif : ','gras') jour=1 if ann_scol not in club.paiement() : if not jour : f += ' et '