ressuscite.py: ajout a un autre adherent, depuis un fichier, clarification

Je vais encore rajouter la recherche par conditions sur la machine ressuscitee
mais apres je ne vois plus trop quoi rajouter ...

darcs-hash:20080924133419-ddb99-27051bb18d13dba998052dff2fe1dadcd0ecedc7.gz
This commit is contained in:
Michel Blockelet 2008-09-24 15:34:19 +02:00
parent 6ddb784b1b
commit 289e14df60

View file

@ -39,12 +39,15 @@ def dialog(arg):
return affich_tools.dialog(u'Ressusciter une machine', arg) return affich_tools.dialog(u'Ressusciter une machine', arg)
def menu_principal(): def menu_principal():
"""Menu principal de l'interface."""
choix = ''
while 1: while 1:
arg = u'--title "Ressusciter" ' arg = u'--title "Ressusciter" '
arg += u'--help-button --item-help --cancel-label "Quitter" ' arg += u'--item-help --cancel-label "Quitter" '
arg += u'--default-item "" ' arg += u'--default-item "%s" ' % choix
arg += u'--menu "Que souhaitez vous faire ?" 0 55 13 ' arg += u'--menu "Que souhaitez vous faire ?" 0 55 13 '
arg += u'"A" "Ressusciter à partir d\'un adhérent" "" ' arg += u'"A" "Ressusciter à partir d\'un adhérent" "Rechercher les anciennes machines d\'un adhérent" '
arg += u'"F" "Ressusciter à partir d\'un fichier" "Récupérer depuis un fichier du cimetière" '
annul, result = dialog(arg) annul, result = dialog(arg)
if annul: break if annul: break
@ -52,9 +55,50 @@ def menu_principal():
if choix == 'A': if choix == 'A':
# Ressusciter à partir d'un adhérent # Ressusciter à partir d'un adhérent
# On sélectionne l'adhérent # On sélectionne l'adhérent
adh = select(db, u'Adhérent auquel rechercher les anciennes machines a', mde='ro') adh = select(db, u'Adhérent duquel rechercher les anciennes machines a', mde='ro')
if not adh: continue if not adh: continue
# Est-ce que c'est bien une machine de l'adhérent ?
def condition(machine, date):
return (int(machine.dn.split(',', 3)[1].split('=', 2)[1])
== int(adh.id()) and str(machine.proprio) == ("%s %s"
% (adh.prenom(), adh.nom())))
choixmachine = choixrecherche(condition)
if choixmachine != None:
(machine, date) = choixmachine
adh = choixadherent(machine, adh)
if not adh: continue
ressuscite(adh, machine)
elif choix == 'F':
# Ressusciter à partir d'un fichier
fichier = None
while 1:
arg = u'--title "Sélection du fichier" '
arg += u'--inputbox "Vous pouvez aussi exécuter le script sur le fichier :\nressuscite [le fichier]\n\nFichier : " 0 0 "%s"' % "/home/cimetiere/Machine"
annul, result = dialog(arg)
if annul: break
try:
fichier = open(result[0], 'r')
break
except:
arg = u'--title "Sélection du fichier" '
arg += u'--msgbox "Fichier invalide\n\n\n" 0 0'
dialog(arg)
continue
if fichier != None:
machine = cPickle.load(fichier)
adh = choixadherent(machine)
if not adh: continue
ressuscite(adh, machine)
continue
def choixrecherche(condition=None):
"""Demande les types de machines à chercher, et effectue la recherche avec
la condition."""
# On sélectionne le type de machine # On sélectionne le type de machine
arg = u'--title "Recherche de machine" ' arg = u'--title "Recherche de machine" '
arg += u'--menu "Type de machine ?" 0 0 0 ' arg += u'--menu "Type de machine ?" 0 0 0 '
@ -62,38 +106,84 @@ def menu_principal():
arg += u'"Wifi" "Machine wireless" ' arg += u'"Wifi" "Machine wireless" '
arg += u'"Tous" "Rechercher les deux types" ' arg += u'"Tous" "Rechercher les deux types" '
annul, result = dialog(arg) annul, result = dialog(arg)
if annul: continue if annul: return None
choix = result[0] choix = result[0]
# On fait la liste des machines # On cherche les machines
machines = recherche(choix == 'Fixe' or choix == 'Tous',
choix == 'Wifi' or choix == 'Tous',
condition)
# Pas de résultat
if not machines:
arg = u'--title "Recherche" '
arg += u'--msgbox "Aucun résultat.\n\n\n" 0 0'
dialog(arg)
return None
return choixmachine(machines)
def recherche(fixe=False, wifi=False, condition=None):
"""Recherche des machines du type demandé, et satisfaisant une condition :
la fonction condition doit être de la forme
condition(machine, date)
et retourner True ou False selon si l'on veut avoir la machine dans la
liste ou non."""
# Liste des fichiers à lire
cimetiere = [] cimetiere = []
if choix == 'Fixe' or choix == 'Tous': if fixe: cimetiere = map(lambda s: "/home/cimetiere/MachineFixe/" + s,
cimetiere = map(lambda s: "/home/cimetiere/MachineFixe/" + s,
os.listdir("/home/cimetiere/MachineFixe")) os.listdir("/home/cimetiere/MachineFixe"))
if choix == 'Wifi' or choix == 'Tous': if wifi: cimetiere += map(lambda s: "/home/cimetiere/MachineWifi/" + s,
cimetiere += map(lambda s: "/home/cimetiere/MachineWifi/" + s,
os.listdir("/home/cimetiere/MachineWifi")) os.listdir("/home/cimetiere/MachineWifi"))
# On regarde chacun des fichiers
valid = [] valid = []
for fichier in cimetiere: for fichier in cimetiere:
try: try:
machine = cPickle.load(open(fichier, 'r')) machine = cPickle.load(open(fichier, 'r'))
# Est-ce que c'est bien une machine de l'adhérent ? date = fichier[28:44]
if (int(machine.dn.split(',', 3)[1].split('=', 2)[1]) if condition == None or condition(machine, date):
== int(adh.id()) valid.append((machine, date))
and str(machine.proprio) == ("%s %s"
% (adh.prenom(), adh.nom()))):
valid.append((machine, fichier[28:44]))
except: except:
pass pass
return valid
def choixadherent(machine, oldadh=None):
"""Permet de choisir l'adhérent à qui rattacher la machine."""
if oldadh == None:
oldadhl = db.search(machine.dn.split(',', 2)[1])['adherent']
else:
oldadhl = [oldadh]
arg = u'--title "Adhérent auquel rattacher la machine" '
arg += u'--menu "Le propriétaire de la machine est %s.' % machine.proprio
# Est-ce que l'adhérent existe encore ?
if (len(oldadhl) > 0 and str(machine.proprio) == "%s %s"
% (oldadhl[0].prenom(), oldadhl[0].nom())):
arg += u'\nCet adhérent existe encore dans la base." 0 0 0 '
arg += u'"Garder" "Ajouter à cet adhérent" '
arg += u'"Autre" "Ajouter à un autre adhérent" '
else:
arg += u'\nCet adhérent n\'existe plus dans la base." 0 0 0 '
arg += u'"Autre" "Ajouter à un autre adhérent" '
annul, result = dialog(arg)
if not annul:
choix = result[0]
if choix == "Garder":
adh = oldadhl[0]
else:
adh = select(db, u'Adhérent auquel ajouter la machine a', mde='ro')
else:
adh = None
return adh
def choixmachine(valid):
"""Choisit une machine dans une liste."""
# Pas de machines ! # Pas de machines !
if not valid:
arg = u'--title "Recherche" '
arg += u'--msgbox "Aucun résultat.\n\n\n" 0 0'
dialog(arg)
continue
if len(valid) == 1: if len(valid) == 1:
# Une seule réponse # Une seule réponse
choix = valid[0] choix = valid[0]
@ -105,33 +195,40 @@ def menu_principal():
print "Plusieurs réponses correspondant à votre requête ont été trouvées :" print "Plusieurs réponses correspondant à votre requête ont été trouvées :"
data = [] data = []
i = 1
for (machine, date) in valid: for (machine, date) in valid:
data.append([machine.id(), str(machine.__class__)[-4:], machine.nom().split('.', 1)[0], date]) data.append([i, date, str(machine.__class__)[-4:], machine.nom().split('.', 1)[0], machine.mac()])
i += 1
print affich_tools.tableau(data, print affich_tools.tableau(data,
titre=[u'mid', u'Type', u'Nom de machine', u'Date destruction'], titre=[u'id', u'Date destruction', u'Type', u'Nom de machine', u'Adresse MAC'],
largeur=[5, 4, '*', 16], largeur=[5, 16, 4, '*', 17],
alignement=['d', 'c', 'c', 'c']) alignement=['d', 'c', 'c', 'c', 'c'])
i = affich_tools.prompt(u'Votre choix ? (0 pour annuler) mid =') i = affich_tools.prompt(u'Votre choix ? (0 pour annuler) id =')
if i == '0': break try:
for (m, d) in valid: i = int(i)
if m.id() == i: except:
choix = (m, d)
break
if not choix:
# Redemande le choix
print 'Choix invalide' print 'Choix invalide'
continue continue
if i == 0: break
if i > len(valid):
print 'Choix invalide'
continue
choix = valid[i-1]
if choix: break if choix: break
if not choix: if not choix:
# Retour à l'interface de recherche # Retour à l'interface de recherche
continue return None
return choix
(oldmachine, date) = choix
if str(machine.__class__)[-4:] == 'Fixe': def ressuscite(adh, oldmachine):
"""Ressuscite une instance de machine."""
if str(oldmachine.__class__)[-4:] == 'Fixe':
machine = MachineFixe(adh) machine = MachineFixe(adh)
elif str(machine.__class__)[-4:] == 'Wifi': elif str(oldmachine.__class__)[-4:] == 'Wifi':
machine = MachineWifi(adh) machine = MachineWifi(adh)
else: else:
# On va quand même créer une machine ... # On va quand même créer une machine ...
@ -182,9 +279,20 @@ def menu_principal():
dialog(arg) dialog(arg)
set_machine(machine) set_machine(machine)
continue return True
if __name__ == '__main__': if __name__ == '__main__':
if len(sys.argv) < 2: if len(sys.argv) < 2:
menu_principal() menu_principal()
os.system("clear")
else:
for path in sys.argv[1:]:
try:
fichier = open(path, 'r')
machine = cPickle.load(fichier)
adh = choixadherent(machine)
if adh:
ressuscite(adh, machine)
except:
print "Fichier invalide : %s" % fichier