Pour viter toute confusion future, on stocke les dates de blacklist en
nombre de secondes coules depuis Epoch. darcs-hash:20060326040112-68412-f01c2b7b858e2b5ece65beac8b7943ad7919724c.gz
This commit is contained in:
parent
65b6a8768d
commit
22fc2f1c0a
3 changed files with 134 additions and 97 deletions
|
@ -23,7 +23,8 @@ To = ['fred@crans.org' , 'glondu@crans.org', 'chove@crans.org']
|
||||||
|
|
||||||
import string, os, sys
|
import string, os, sys
|
||||||
from whos import aff
|
from whos import aff
|
||||||
import time, signal, getopt
|
import signal, getopt
|
||||||
|
from time import strftime, strptime, localtime, mktime
|
||||||
import re
|
import re
|
||||||
|
|
||||||
import affich_tools, config
|
import affich_tools, config
|
||||||
|
@ -810,28 +811,33 @@ def confirm(clas) :
|
||||||
affich_tools.prompt(u"Appuyez sur ENTREE pour continuer")
|
affich_tools.prompt(u"Appuyez sur ENTREE pour continuer")
|
||||||
|
|
||||||
def set_blackliste(clas) :
|
def set_blackliste(clas) :
|
||||||
""" Edite ou ajoute un item de la blackliste """
|
""" Édite ou ajoute un item de la blackliste """
|
||||||
bl = clas.blacklist()
|
bl = clas.blacklist()
|
||||||
if not bl :
|
if not bl :
|
||||||
# Pas d'entrée à éditer
|
# Pas d'entrée à éditer
|
||||||
index = -1
|
index = -1
|
||||||
else :
|
else :
|
||||||
arg = u'--title "Edition blackliste de %s" ' % clas.Nom()
|
arg = u'--title "Édition blackliste de %s" ' % clas.Nom()
|
||||||
arg+= u'--menu "Choisir l\'entrée à éditer :" 0 0 0 '
|
arg+= u'--menu "Choisir l\'entrée à éditer :" 0 0 0 '
|
||||||
arg+= u'"0" "Ajouter une nouvelle entrée" '
|
arg+= u'"0" "Ajouter une nouvelle entrée" '
|
||||||
i = 1
|
i = 1
|
||||||
for b in bl :
|
for b in bl :
|
||||||
arg += '"%i" "%s" ' % (i, b)
|
champs = b.split('$')
|
||||||
|
arg += '"%i" "%s [%s]" ' % (i, champs[2], champs[3])
|
||||||
i += 1
|
i += 1
|
||||||
annul , res = dialog(arg)
|
annul, res = dialog(arg)
|
||||||
if annul : return 1
|
if annul : return 1
|
||||||
index = int(res[0]) - 1
|
index = int(res[0]) - 1
|
||||||
|
|
||||||
# Edition
|
# Édition
|
||||||
if index != -1 :
|
if index != -1:
|
||||||
t = clas.blacklist()[index].split(',')
|
t = clas.blacklist()[index].split('$')
|
||||||
|
if t[0] != 'now':
|
||||||
|
t[0] = strftime('%d/%m/%Y %H:%M', localtime(int(t[0])))
|
||||||
|
if t[1] != 'now' and t[1] != '-':
|
||||||
|
t[1] = strftime('%d/%m/%Y %H:%M', localtime(int(t[1])))
|
||||||
else :
|
else :
|
||||||
t = [ 'now' , '-', '', '' ]
|
t = ['now', '-', '', '']
|
||||||
|
|
||||||
step = 1
|
step = 1
|
||||||
while 1 :
|
while 1 :
|
||||||
|
@ -857,15 +863,36 @@ def set_blackliste(clas) :
|
||||||
arg+= u'"- pour fin indéterminée" 2 25 "" 0 0 0 0 '
|
arg+= u'"- pour fin indéterminée" 2 25 "" 0 0 0 0 '
|
||||||
arg+= u'"Les jours de début et de fin sont inclus." 3 1 "" 0 0 0 0 '
|
arg+= u'"Les jours de début et de fin sont inclus." 3 1 "" 0 0 0 0 '
|
||||||
arg+= u'"Sanction : %s" 4 1 "" 0 0 0 0 ' % t[2]
|
arg+= u'"Sanction : %s" 4 1 "" 0 0 0 0 ' % t[2]
|
||||||
arg+= u'"Commentaire : (ne pas mettre de virgule)" 5 1 "%s" 6 1 52 0 ' % t[3]
|
arg+= u'"Commentaire : " 5 1 "%s" 6 1 52 0 ' % t[3]
|
||||||
annul , r = dialog(arg)
|
annul , r = dialog(arg)
|
||||||
if annul : return 1
|
if annul : return 1
|
||||||
|
|
||||||
# Ajout des heures
|
# Ajout des heures
|
||||||
t[0] = r[0].strip()
|
t[0] = r[0].strip()
|
||||||
if len(t[0]) == 10 : t[0] += ' 00:00'
|
if len(t[0]) == 10: t[0] += ' 00:00'
|
||||||
t[1] = r[1].strip()
|
t[1] = r[1].strip()
|
||||||
if len(t[1]) == 10 : t[1] += ' 23:59'
|
if len(t[1]) == 10: t[1] += ' 23:59'
|
||||||
|
|
||||||
|
# Vérification des heures
|
||||||
|
try:
|
||||||
|
if t[0] != 'now':
|
||||||
|
t[0] = int(mktime(strptime(t[0], '%d/%m/%Y %H:%M')))
|
||||||
|
except:
|
||||||
|
arg = u'--title "Erreur" '
|
||||||
|
arg+= u'--msgbox "Heure de début incorrecte (%s)\n\n\n" 0 0' % t[0]
|
||||||
|
dialog(arg)
|
||||||
|
step -= 1
|
||||||
|
continue
|
||||||
|
|
||||||
|
try:
|
||||||
|
if t[1] != 'now' and t[1] != '-':
|
||||||
|
t[1] = int(mktime(strptime(t[1], '%d/%m/%Y %H:%M')))
|
||||||
|
except:
|
||||||
|
arg = u'--title "Erreur" '
|
||||||
|
arg+= u'--msgbox "Heure de fin incorrecte (%s)\n\n\n" 0 0' % t[1]
|
||||||
|
dialog(arg)
|
||||||
|
step -= 1
|
||||||
|
continue
|
||||||
|
|
||||||
# Commentaire
|
# Commentaire
|
||||||
c = r[2].strip()
|
c = r[2].strip()
|
||||||
|
@ -882,7 +909,7 @@ def set_blackliste(clas) :
|
||||||
if index == -1 :
|
if index == -1 :
|
||||||
clas.blacklist(t)
|
clas.blacklist(t)
|
||||||
else :
|
else :
|
||||||
clas.blacklist( ( index, t ) )
|
clas.blacklist(( index, t ))
|
||||||
step += 1
|
step += 1
|
||||||
except ValueError, c :
|
except ValueError, c :
|
||||||
arg = u'--title "Erreur" '
|
arg = u'--title "Erreur" '
|
||||||
|
@ -2038,7 +2065,7 @@ Subject: Bugreport %s
|
||||||
# Erreur trop tot probablement
|
# Erreur trop tot probablement
|
||||||
serv = ''
|
serv = ''
|
||||||
if serv :
|
if serv :
|
||||||
mn = int(time.strftime('%M'))
|
mn = int(strftime('%M'))
|
||||||
# Restart toutes les 10 min : 03, 13, 23, 33, 43, 53
|
# Restart toutes les 10 min : 03, 13, 23, 33, 43, 53
|
||||||
t = ( 13 - mn % 10 ) % 10 + 1 # Certaines machines le font -Aà 4-b
|
t = ( 13 - mn % 10 ) % 10 + 1 # Certaines machines le font -Aà 4-b
|
||||||
if t == 0 : t = 10
|
if t == 0 : t = 10
|
||||||
|
|
|
@ -16,7 +16,6 @@ import ldap, ldap.modlist
|
||||||
import config, annuaires, iptools, chgpass, user_tests, cPickle
|
import config, annuaires, iptools, chgpass, user_tests, cPickle
|
||||||
from chgpass import chgpass
|
from chgpass import chgpass
|
||||||
from affich_tools import coul, prompt
|
from affich_tools import coul, prompt
|
||||||
from time import sleep, localtime
|
|
||||||
|
|
||||||
date_format = '%d/%m/%Y %H:%M'
|
date_format = '%d/%m/%Y %H:%M'
|
||||||
hostname = gethostname().split(".")[0]
|
hostname = gethostname().split(".")[0]
|
||||||
|
@ -158,17 +157,15 @@ def is_actif(sanction):
|
||||||
Retourne True ou False suivant si la sanction fournie (chaîne
|
Retourne True ou False suivant si la sanction fournie (chaîne
|
||||||
venant de blacklist) est active ou non
|
venant de blacklist) est active ou non
|
||||||
"""
|
"""
|
||||||
bl = sanction.split(',')
|
bl = sanction.split('$')
|
||||||
try:
|
|
||||||
now = time.time()
|
now = time.time()
|
||||||
debut = time.mktime( time.strptime(bl[0], date_format) )
|
debut = int(bl[0])
|
||||||
if bl[1] == '-':
|
if bl[1] == '-':
|
||||||
fin = now + 1
|
fin = now + 1
|
||||||
else:
|
else:
|
||||||
fin = time.mktime( time.strptime(bl[1], date_format) )
|
fin = int(bl[1])
|
||||||
return debut < now and fin > now
|
return debut < now and fin > now
|
||||||
except:
|
|
||||||
return False
|
|
||||||
|
|
||||||
def format_mac(mac):
|
def format_mac(mac):
|
||||||
"""
|
"""
|
||||||
|
@ -323,7 +320,7 @@ class crans_ldap:
|
||||||
sys.stderr.write("ERREUR : serveur LDAP injoignable\n")
|
sys.stderr.write("ERREUR : serveur LDAP injoignable\n")
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
else:
|
else:
|
||||||
sleep(0.3)
|
time.sleep(0.3)
|
||||||
|
|
||||||
def exist(self, arg):
|
def exist(self, arg):
|
||||||
"""
|
"""
|
||||||
|
@ -620,7 +617,7 @@ class crans_ldap:
|
||||||
# considéré non ok s'il n'a pas fourni sa carte d'etudiant
|
# considéré non ok s'il n'a pas fourni sa carte d'etudiant
|
||||||
# alors que l'on est desormais en periode de bloquage
|
# alors que l'on est desormais en periode de bloquage
|
||||||
# définifif (cf config.py).
|
# définifif (cf config.py).
|
||||||
if localtime()[1] == 9:
|
if time.localtime()[1] == 9:
|
||||||
# Pour septembre paiement année précédente ok
|
# Pour septembre paiement année précédente ok
|
||||||
el = "(|(paiement=%d)(paiement=%d))" % (ann_scol, ann_scol-1)
|
el = "(|(paiement=%d)(paiement=%d))" % (ann_scol, ann_scol-1)
|
||||||
else:
|
else:
|
||||||
|
@ -792,9 +789,11 @@ class crans_ldap:
|
||||||
|
|
||||||
__machines = ()
|
__machines = ()
|
||||||
def all_machines(self, graphic=False):
|
def all_machines(self, graphic=False):
|
||||||
"""Renvoie toutes les machines autorisées.
|
"""
|
||||||
|
Renvoie toutes les machines autorisées.
|
||||||
|
|
||||||
Cela affiche des trucs et des bidules si graphic est à True."""
|
Cela affiche des trucs et des bidules si graphic est à True.
|
||||||
|
"""
|
||||||
if graphic: from affich_tools import anim, cprint, OK
|
if graphic: from affich_tools import anim, cprint, OK
|
||||||
if not self.__machines:
|
if not self.__machines:
|
||||||
# Récolte des données
|
# Récolte des données
|
||||||
|
@ -843,23 +842,26 @@ class base_classes_crans(crans_ldap):
|
||||||
def blacklist_actif(self):
|
def blacklist_actif(self):
|
||||||
"""
|
"""
|
||||||
Vérifie si l'instance courante est blacklistée.
|
Vérifie si l'instance courante est blacklistée.
|
||||||
Retourne les sanctions en cours (liste)
|
Retourne les sanctions en cours (liste).
|
||||||
Retourne une liste vide si aucune sanction en cours
|
Retourne une liste vide si aucune sanction en cours.
|
||||||
"""
|
"""
|
||||||
return self.blacklist_all()[0].keys()
|
return self.blacklist_all()[0].keys()
|
||||||
|
|
||||||
def blacklist_all(self):
|
def blacklist_all(self):
|
||||||
"""
|
"""
|
||||||
Vérifie si l'instance courante est blacklistée ou a été blacklistée.
|
Vérifie si l'instance courante est blacklistée ou a été
|
||||||
Retourne les sanctions en cours sous forme de dictionnaire avec comme clef
|
blacklistée. Retourne les sanctions en cours sous la forme
|
||||||
la sanction et comme valeur une liste de couple de dates correspondant aux
|
d'un couple de deux dictionnaires (l'un pour les sanctions
|
||||||
|
actives, l'autre pour les inactive), chacun ayant comme
|
||||||
|
clef la sanction et comme valeur une liste de couple de
|
||||||
|
dates (en secondes depuis epoch) correspondant aux
|
||||||
différentes périodes de sanctions.
|
différentes périodes de sanctions.
|
||||||
|
|
||||||
ex: { 'upload' : (('17/11/2004 00:00','20/11/2004 00:00'), ('...', '...')) }
|
ex: {'upload': [(1143336210, 1143509010), ...]}
|
||||||
"""
|
"""
|
||||||
bl_liste = self._data.get('blacklist', [])
|
bl_liste = self._data.get('blacklist', [])
|
||||||
|
|
||||||
if 'machineWifi' in self._data['objectClass'] or 'machineFixe' in self._data['objectClass']:
|
if isinstance(self, Machine):
|
||||||
# Il faut aussi regarder la blackliste du propriétaire
|
# Il faut aussi regarder la blackliste du propriétaire
|
||||||
p = self.proprietaire()
|
p = self.proprietaire()
|
||||||
bl_liste += p.blacklist()
|
bl_liste += p.blacklist()
|
||||||
|
@ -868,44 +870,42 @@ class base_classes_crans(crans_ldap):
|
||||||
inactifs = {}
|
inactifs = {}
|
||||||
|
|
||||||
for sanction in bl_liste:
|
for sanction in bl_liste:
|
||||||
s = sanction.split(',')[2]
|
champs = sanction.split('$')
|
||||||
|
s = champs[2]
|
||||||
if is_actif(sanction):
|
if is_actif(sanction):
|
||||||
if not s in actifs:
|
actifs.setdefault(s, []).append((champs[0], champs[1]))
|
||||||
actifs[s] = []
|
|
||||||
actifs[s].append((sanction.split(',')[0],
|
|
||||||
sanction.split(',')[1]))
|
|
||||||
else:
|
else:
|
||||||
if not s in inactifs:
|
inactifs.setdefault(s, []).append((champs[0], champs[1]))
|
||||||
inactifs[s] = []
|
|
||||||
inactifs[s].append((sanction.split(',')[0],
|
|
||||||
sanction.split(',')[1]))
|
|
||||||
return (actifs, inactifs)
|
return (actifs, inactifs)
|
||||||
|
|
||||||
def blacklist(self, new=None):
|
def blacklist(self, new=None):
|
||||||
"""
|
"""
|
||||||
Blacklistage de la ou de toutes la machines du propriétaire
|
Blacklistage de la ou de toutes la machines du propriétaire
|
||||||
new est une liste de 4 termes:
|
* new est une liste de 4 termes :
|
||||||
[ debut_sanction, fin_sanction, sanction, commentaire ]
|
[debut_sanction, fin_sanction, sanction, commentaire]
|
||||||
début et fin doivent être sous la forme donnée par date_format
|
* début et fin sont le nombre de secondes depuis epoch
|
||||||
pour un début ou fin immédiate mettre now
|
* pour un début ou fin immédiate mettre now
|
||||||
pour une fin indéterminée mettre '-'
|
* pour une fin indéterminée mettre '-'
|
||||||
|
Les données sont stockées dans la base sous la forme :
|
||||||
pour modifier une entrée donner un tuple de deux termes :
|
debut$fin$sanction$commentaire
|
||||||
( index dans blacklist à modifier, nouvelle liste )
|
Pour modifier une entrée donner un tuple de deux termes :
|
||||||
l'index est celui obtenu dans la liste retournée par blacklist()
|
(index dans blacklist à modifier, nouvelle liste),
|
||||||
|
l'index étant celui dans la liste retournée par blacklist().
|
||||||
"""
|
"""
|
||||||
if not self._data.has_key('blacklist'):
|
liste = self._data.setdefault('blacklist', [])[:]
|
||||||
self._data['blacklist'] = []
|
if new == None:
|
||||||
liste = list(self._data['blacklist'])
|
return map(decode, liste)
|
||||||
if new == None: return map(decode, liste)
|
|
||||||
|
|
||||||
if type(new) == tuple:
|
if type(new) == tuple:
|
||||||
# Modif
|
# Modification
|
||||||
index = new[0]
|
index = new[0]
|
||||||
new = new[1]
|
new = new[1]
|
||||||
if new == '':
|
if new == '':
|
||||||
liste.pop(index)
|
liste.pop(index)
|
||||||
|
# La ligne suivante est inutile, elle est laissée dans un souci de clarté
|
||||||
self._set('blacklist', liste)
|
self._set('blacklist', liste)
|
||||||
|
# La liste n'a pas changé, mais son contenu, lui, a bien changé
|
||||||
|
self.modifs.setdefault('blacklist', None)
|
||||||
return liste
|
return liste
|
||||||
else:
|
else:
|
||||||
index = -1
|
index = -1
|
||||||
|
@ -913,55 +913,57 @@ class base_classes_crans(crans_ldap):
|
||||||
if type(new) != list or len(new) != 4:
|
if type(new) != list or len(new) != 4:
|
||||||
raise TypeError
|
raise TypeError
|
||||||
|
|
||||||
# Verif que les dates sont OK
|
# Verification que les dates sont OK
|
||||||
if new[0] == 'now':
|
if new[0] == 'now':
|
||||||
new[0] = time.strftime(date_format)
|
debut = new[0] = int(time.time())
|
||||||
debut = 0
|
|
||||||
else:
|
else:
|
||||||
try: debut = int(time.mktime(time.strptime(new[0], date_format)))
|
try: debut = new[0] = int(new[0])
|
||||||
except: raise ValueError(u'Date de début blacklist invalide')
|
except: raise ValueError(u'Date de début blacklist invalide')
|
||||||
|
|
||||||
if new[1] == 'now':
|
if new[1] == 'now':
|
||||||
new[1] = time.strftime(date_format)
|
fin = new[1] = int(time.time())
|
||||||
fin = 0
|
elif new[1] == '-':
|
||||||
elif new[1] != '-':
|
|
||||||
try: fin = int(time.mktime(time.strptime(new[1], date_format)))
|
|
||||||
except: raise ValueError(u'Date de fin blacklist invalide')
|
|
||||||
else:
|
|
||||||
fin = -1
|
fin = -1
|
||||||
|
else:
|
||||||
|
try: fin = new[1] = int(new[1])
|
||||||
|
except: raise ValueError(u'Date de fin blacklist invalide')
|
||||||
|
|
||||||
if debut == fin:
|
if debut == fin:
|
||||||
raise ValueError(u'Dates de début et fin identiques')
|
raise ValueError(u'Dates de début et de fin identiques')
|
||||||
|
elif fin != -1 and debut > fin:
|
||||||
|
raise ValueError(u'Date de fin avant date de début')
|
||||||
|
|
||||||
# On prend en compte le fuseau horaire et on dépasse la fin
|
# On dépasse la fin de sanction d'1min pour être sûr qu'elle est périmée.
|
||||||
# de sanction d'1min pour être sur quelle périmé.
|
fin = fin + 60
|
||||||
fin = fin+60-time.timezone
|
|
||||||
|
|
||||||
new_c = ','.join(new)
|
new_c = '$'.join(map(str, new))
|
||||||
new_c = preattr(new_c)[1]
|
new_c = preattr(new_c)[1]
|
||||||
|
|
||||||
|
touched = True
|
||||||
if index != -1:
|
if index != -1:
|
||||||
|
if liste[index] == new_c:
|
||||||
|
touched = False
|
||||||
|
else:
|
||||||
liste[index] = new_c
|
liste[index] = new_c
|
||||||
else:
|
else:
|
||||||
liste = liste + [ new_c ]
|
liste.append(new_c)
|
||||||
|
|
||||||
if self._data['blacklist'] != liste:
|
if touched:
|
||||||
|
# La ligne suivante est inutile, elle est laissée dans un souci de clarté
|
||||||
self._data['blacklist'] = liste
|
self._data['blacklist'] = liste
|
||||||
self.modifs.setdefault('blacklist_' + new[2], None)
|
self.modifs.setdefault('blacklist_' + new[2], None)
|
||||||
if not hasattr(self, "_blacklist_restart"):
|
if not hasattr(self, "_blacklist_restart"):
|
||||||
self._blacklist_restart = {}
|
self._blacklist_restart = {}
|
||||||
if not self._blacklist_restart.has_key(new[2]):
|
restart = self._blacklist_restart.setdefault(new[2], [])
|
||||||
self._blacklist_restart[new[2]] = [ debut, fin ]
|
if debut not in restart:
|
||||||
else:
|
restart.append(debut)
|
||||||
if debut not in self._blacklist_restart[new[2]]:
|
if fin != -1 and fin not in restart:
|
||||||
self._blacklist_restart[new[2]].append(debut)
|
restart.append(fin)
|
||||||
if fin != -1 and fin not in self._blacklist_restart[new[2]]:
|
|
||||||
self._blacklist_restart[new[2]].append(fin)
|
|
||||||
|
|
||||||
return liste
|
return liste
|
||||||
|
|
||||||
def restore(self):
|
def restore(self):
|
||||||
""" Restore les données à l'état initial """
|
""" Restore les données à l'état initial (ou pas) """
|
||||||
self._data = self._init_data.copy()
|
self._data = self._init_data.copy()
|
||||||
self.modifs = {}
|
self.modifs = {}
|
||||||
|
|
||||||
|
@ -1079,7 +1081,7 @@ class base_classes_crans(crans_ldap):
|
||||||
liste_historique.append(ligne)
|
liste_historique.append(ligne)
|
||||||
modif = ', '.join(liste_historique)
|
modif = ', '.join(liste_historique)
|
||||||
|
|
||||||
timestamp = localtime()
|
timestamp = time.localtime()
|
||||||
hist = "%s, %s" % ( time.strftime(date_format, timestamp), script_utilisateur )
|
hist = "%s, %s" % ( time.strftime(date_format, timestamp), script_utilisateur )
|
||||||
|
|
||||||
# On loggue
|
# On loggue
|
||||||
|
|
|
@ -48,6 +48,7 @@ except:
|
||||||
|
|
||||||
base = None
|
base = None
|
||||||
|
|
||||||
|
from time import strftime, localtime
|
||||||
from ldap_crans import is_actif, crans_ldap, ann_scol, AssociationCrans, hostname
|
from ldap_crans import is_actif, crans_ldap, ann_scol, AssociationCrans, hostname
|
||||||
from ldap_crans import MachineWifi, BorneWifi
|
from ldap_crans import MachineWifi, BorneWifi
|
||||||
from affich_tools import *
|
from affich_tools import *
|
||||||
|
@ -640,22 +641,29 @@ def club_details(club) :
|
||||||
###########################################
|
###########################################
|
||||||
# Fonctions annexes de formatage de données
|
# Fonctions annexes de formatage de données
|
||||||
|
|
||||||
def _blacklist(clas) :
|
def _blacklist(clas):
|
||||||
""" Formatage blackliste de la classe fournie """
|
""" Formatage blackliste de la classe fournie """
|
||||||
f = u''
|
f = u''
|
||||||
for event in clas.blacklist() :
|
for event in clas.blacklist():
|
||||||
if is_actif(event) :
|
if is_actif(event):
|
||||||
# Colorisation si sanction en cours
|
# Colorisation si sanction en cours
|
||||||
c = 'rouge'
|
c = 'rouge'
|
||||||
else :
|
else :
|
||||||
c = 'blanc'
|
c = 'blanc'
|
||||||
f += u"%s\n\t " % coul(u'du %s au %s : %s, %s' % tuple(event.split(',')) ,c)
|
event = event.split('$')
|
||||||
|
dates = strftime('%d/%m/%Y %H:%M', localtime(int(event[0])))
|
||||||
|
if event[1] == '-':
|
||||||
|
dates = u'à partir du %s' % dates
|
||||||
|
else:
|
||||||
|
dates = u'du %s au ' % dates
|
||||||
|
dates += strftime('%d/%m/%Y %H:%M', localtime(int(event[1])))
|
||||||
|
f += u"%s\n\t " % coul(u'%s : %s [%s]' % (dates, event[2], event[3]), c)
|
||||||
|
|
||||||
f = f[:-6] # supression des espaces superflus
|
f = f[:-6] # supression des espaces superflus
|
||||||
|
|
||||||
if f :
|
if f:
|
||||||
return coul(u'Blackliste : ', 'gras') + f
|
return coul(u'Blackliste : ', 'gras') + f
|
||||||
else :
|
else:
|
||||||
return ''
|
return ''
|
||||||
|
|
||||||
def _info(clas) :
|
def _info(clas) :
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue