Merge branch 'master' of https://gitlab.adm.crans.org/nounous/scripts
This commit is contained in:
commit
5201e3dfdf
2 changed files with 167 additions and 110 deletions
|
@ -6,29 +6,29 @@ Copyright (C) Frédéric Pauget
|
||||||
Licence : GPLv2
|
Licence : GPLv2
|
||||||
"""
|
"""
|
||||||
|
|
||||||
import sys
|
|
||||||
import re
|
|
||||||
import os
|
import os
|
||||||
import tempfile
|
import re
|
||||||
|
import shlex
|
||||||
import subprocess
|
import subprocess
|
||||||
|
import sys
|
||||||
if not "/usr/scripts" in sys.path:
|
if not "/usr/scripts" in sys.path:
|
||||||
sys.path.append("/usr/scripts")
|
sys.path.append("/usr/scripts")
|
||||||
import cranslib.cransstrings
|
import cranslib.cransstrings
|
||||||
|
|
||||||
# Détermination de l'encodage
|
# Détermination de l'encodage
|
||||||
encoding = None
|
ENCODING = None
|
||||||
try:
|
try:
|
||||||
from locale import getpreferredencoding
|
from locale import getpreferredencoding
|
||||||
encoding = getpreferredencoding()
|
ENCODING = getpreferredencoding()
|
||||||
except:
|
except:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
if not encoding:
|
if not ENCODING:
|
||||||
encoding = sys.stdin.encoding or 'UTF-8'
|
ENCODING = sys.stdin.encoding or 'UTF-8'
|
||||||
|
|
||||||
# Si aucune locale n'est définie, on se met en...
|
# Si aucune locale n'est définie, on se met en...
|
||||||
if encoding == "ANSI_X3.4-1968":
|
if ENCODING == "ANSI_X3.4-1968":
|
||||||
encoding = 'UTF-8'
|
ENCODING = 'UTF-8'
|
||||||
|
|
||||||
if 'TERM' in os.environ and os.environ['TERM'] != 'unknown':
|
if 'TERM' in os.environ and os.environ['TERM'] != 'unknown':
|
||||||
el = subprocess.Popen('tput cr ; tput el', shell=True, stdout=subprocess.PIPE).stdout.read()
|
el = subprocess.Popen('tput cr ; tput el', shell=True, stdout=subprocess.PIPE).stdout.read()
|
||||||
|
@ -41,44 +41,89 @@ except (IOError, AttributeError):
|
||||||
stdout_atty = False
|
stdout_atty = False
|
||||||
|
|
||||||
def dialog(backtitle, arg, dialogrc=''):
|
def dialog(backtitle, arg, dialogrc=''):
|
||||||
""" Affiche la boite de dialogue défine avec les arguments fournis
|
|
||||||
(cf man dialog)
|
|
||||||
si tout se déroule bien retourne :
|
|
||||||
[ 0, [ reponse(s) ] ]
|
|
||||||
si annulatin retourne :
|
|
||||||
[ 1, [] ]
|
|
||||||
si appui sur ESC demande confirmation de l'abandon et exécute sys.exit(0)
|
|
||||||
si erreur dans les arguments raise RuntimeError
|
|
||||||
"""
|
"""
|
||||||
f = tempfile.NamedTemporaryFile()
|
Affiche la boîte de dialogue définie avec les arguments fournis
|
||||||
cmd = u'%s /usr/bin/dialog --backtitle "%s" --cancel-label "Retour" %s 2>%s' % (dialogrc, backtitle,arg,f.name)
|
(cf man dialog)
|
||||||
res = os.system(cmd.encode(encoding, 'ignore'))
|
|
||||||
|
|
||||||
if res == 256 :
|
Paramètres:
|
||||||
# Annuler
|
- ``backtitle`` : (str) texte de l'en-tête, situé en haut à gauche
|
||||||
f.close()
|
- ``arg`` : (str ou list) ensemble des paramètres à passer au
|
||||||
return [ 1, [] ]
|
programme dialog
|
||||||
# Lecture du fichier de résultat et effacement
|
- ``dialogrc`` : (str) chemin vers le dialogrc à utiliser
|
||||||
try:
|
|
||||||
result= f.readlines()
|
Utilises:
|
||||||
f.close()
|
- :py:var:`os.environ`
|
||||||
except :
|
- :py:func:`shlex.split`
|
||||||
result = [ "n'importe quoi", '']
|
- :py:class:`subprocess.Popen`
|
||||||
res = 65280
|
- :py:func:`sys.exit`
|
||||||
# Traitement
|
|
||||||
if res==65280 and result:
|
Peut lever:
|
||||||
# Erreur dans les arguments
|
- :py:exc:`RuntimeError`
|
||||||
raise RuntimeError( arg, result[1].strip() )
|
|
||||||
elif res==65280 :
|
Retournes:
|
||||||
# Appui sur ESC
|
- soit un tuple dont le premier élément est le code d'erreur (0 ou 1) et
|
||||||
arg1 = u'--title "Annulation" --yesno "Quitter ?\nLes dernières modifications seront perdues." 6 48'
|
le second la sortie du programme dialog (une liste ou une liste vide)
|
||||||
print backtitle
|
- soit rien du tout parce que sys.exit(0)
|
||||||
cmd = u'%s /usr/bin/dialog --backtitle "%s" %s' % (dialogrc, backtitle,arg1)
|
"""
|
||||||
res = os.system(cmd.encode(encoding ,'ignore') )
|
# Tant que gest_crans (au moins) n'a pas été modifié pour que arg soit une
|
||||||
if res==0 : sys.exit(0)
|
# liste, ce kludge est nécessaire.
|
||||||
else : return dialog(backtitle,arg)
|
if not isinstance(arg, list):
|
||||||
elif not result : result=['']
|
arg = shlex.split(to_encoding(arg))
|
||||||
return [ 0, result ]
|
|
||||||
|
commande = [
|
||||||
|
"/usr/bin/dialog",
|
||||||
|
"--backtitle", backtitle,
|
||||||
|
"--cancel-label", "Retour"
|
||||||
|
] + arg
|
||||||
|
|
||||||
|
# On copie l'environnement afin de pouvoir écraser une variable pour
|
||||||
|
# l'appel au programme dialog sans que cela affecte les autres processus.
|
||||||
|
environnement = os.environ.copy()
|
||||||
|
|
||||||
|
# Si dialog est fourni, on modifie effectivement l'environnement
|
||||||
|
if dialogrc:
|
||||||
|
environnement["DIALOGRC"] = dialogrc
|
||||||
|
|
||||||
|
# Le résultat du programme dialog est dans stderr, on la récupère dans
|
||||||
|
# un pipe
|
||||||
|
processus = subprocess.Popen(commande, stderr=subprocess.PIPE, env=environnement)
|
||||||
|
|
||||||
|
# Récupération du contenu du pipe
|
||||||
|
_, sortie = processus.communicate()
|
||||||
|
resultat = sortie.splitlines()
|
||||||
|
|
||||||
|
# Récupération du code d'erreur
|
||||||
|
code_erreur = processus.returncode
|
||||||
|
|
||||||
|
if code_erreur == 1:
|
||||||
|
# L'utilisateur a annulé
|
||||||
|
return (1, [])
|
||||||
|
elif code_erreur == 255 and resultat:
|
||||||
|
# La liste des arguments passés au programme dialog est invalide
|
||||||
|
raise RuntimeError(arg, resultat[1].strip())
|
||||||
|
elif code_erreur == 255:
|
||||||
|
# L'utilisateur a appuyé sur ÉCHAP. Dans ce cas, on lui demande de
|
||||||
|
# confirmer.
|
||||||
|
# "0" et "0" sont là pour ajuster la taille de la fenêtre à son
|
||||||
|
# contenu
|
||||||
|
arg_confirmation = [
|
||||||
|
"--title", "Annulation",
|
||||||
|
"--yesno", "Quitter ?\nLes dernières modifications seront perdues.",
|
||||||
|
"0", "0"
|
||||||
|
]
|
||||||
|
code_confirmation, _ = dialog(backtitle, arg_confirmation, dialogrc)
|
||||||
|
if code_confirmation == 0:
|
||||||
|
# L'utilisateur veut quitter (vraiment).
|
||||||
|
sys.exit(0)
|
||||||
|
else:
|
||||||
|
# L'appui sur ÉCHAP était une fausse manip, on recommence
|
||||||
|
return dialog(backtitle, arg, dialogrc)
|
||||||
|
elif not resultat:
|
||||||
|
# Quand le code d'erreur est nul, il ne faut pas que resultat soit
|
||||||
|
# vide.
|
||||||
|
resultat = ['']
|
||||||
|
|
||||||
|
return (0, resultat)
|
||||||
|
|
||||||
def coul(txt, col=None, dialog=False):
|
def coul(txt, col=None, dialog=False):
|
||||||
"""
|
"""
|
||||||
|
@ -98,8 +143,7 @@ def coul(txt, col=None, dialog=False):
|
||||||
'cyan': 36,
|
'cyan': 36,
|
||||||
'gris': 30,
|
'gris': 30,
|
||||||
'gras': 50}
|
'gras': 50}
|
||||||
codecol_dialog = {
|
codecol_dialog = {'rouge': 1,
|
||||||
'rouge': 1,
|
|
||||||
'vert': 2,
|
'vert': 2,
|
||||||
'jaune': 3,
|
'jaune': 3,
|
||||||
'bleu': 4,
|
'bleu': 4,
|
||||||
|
@ -127,7 +171,7 @@ OK = coul('OK', 'vert')
|
||||||
WARNING = coul('WARNING', 'jaune')
|
WARNING = coul('WARNING', 'jaune')
|
||||||
ERREUR = coul('ERREUR', 'rouge')
|
ERREUR = coul('ERREUR', 'rouge')
|
||||||
|
|
||||||
def to_unicode(txt, enc=encoding):
|
def to_unicode(txt, enc=ENCODING):
|
||||||
if isinstance(txt, unicode):
|
if isinstance(txt, unicode):
|
||||||
return txt
|
return txt
|
||||||
else:
|
else:
|
||||||
|
@ -139,7 +183,7 @@ def to_unicode(txt, enc=encoding):
|
||||||
# donc on le décode en utf-8 \o/
|
# donc on le décode en utf-8 \o/
|
||||||
return txt.decode("UTF-8")
|
return txt.decode("UTF-8")
|
||||||
|
|
||||||
def to_encoding(txt, enc=encoding):
|
def to_encoding(txt, enc=ENCODING):
|
||||||
return to_unicode(txt).encode(enc, 'ignore')
|
return to_unicode(txt).encode(enc, 'ignore')
|
||||||
|
|
||||||
def cprint(txt, col='blanc', newline=True):
|
def cprint(txt, col='blanc', newline=True):
|
||||||
|
@ -316,7 +360,7 @@ def prompt(prompt, defaut=u'', couleur='gras'):
|
||||||
# On laisse néanmoins la possibilité de sortir sur un Ctrl+C
|
# On laisse néanmoins la possibilité de sortir sur un Ctrl+C
|
||||||
while True:
|
while True:
|
||||||
try:
|
try:
|
||||||
v = raw_input(prompt_s.encode(encoding))
|
v = raw_input(prompt_s.encode(ENCODING))
|
||||||
v = cranslib.cransstrings.decode_dammit(v).strip()
|
v = cranslib.cransstrings.decode_dammit(v).strip()
|
||||||
if not v:
|
if not v:
|
||||||
v = defaut
|
v = defaut
|
||||||
|
|
|
@ -53,19 +53,31 @@ isbureau = u'Bureau' in droits
|
||||||
encoding = sys.stdin.encoding or 'UTF-8'
|
encoding = sys.stdin.encoding or 'UTF-8'
|
||||||
|
|
||||||
if u'Nounou' in droits:
|
if u'Nounou' in droits:
|
||||||
|
# Si on est nounou
|
||||||
if os.path.exists(os.path.expanduser('~/.dialogrc')):
|
if os.path.exists(os.path.expanduser('~/.dialogrc')):
|
||||||
dialogrc='~/.dialogrc'
|
# Si on a un fichier de configuration du programme dialog dans son
|
||||||
|
# HOME, alors on récupère son chemin.
|
||||||
|
DIALOGRC = '~/.dialogrc'
|
||||||
else:
|
else:
|
||||||
dialogrc='/etc/dialog.rc'
|
# Sinon on utilise celui du système.
|
||||||
dlg = dialog.Dialog(DIALOGRC=dialogrc)
|
DIALOGRC = '/etc/dialog.rc'
|
||||||
dialog_theme='DIALOGRC='+dialogrc
|
|
||||||
|
dlg = dialog.Dialog(DIALOGRC=DIALOGRC)
|
||||||
else:
|
else:
|
||||||
|
# Si on est pas nounou, on est libre de faire ce que l'on veut avec la
|
||||||
|
# variable d'environnement DIALOGRC.
|
||||||
|
DIALOGRC = ''
|
||||||
|
|
||||||
dlg = dialog.Dialog()
|
dlg = dialog.Dialog()
|
||||||
dialog_theme=''
|
|
||||||
|
|
||||||
|
|
||||||
def dialog(arg):
|
def dialog(arg):
|
||||||
return affich_tools.dialog(u'Gestion des adhérents et machines du Crans', arg, dialog_theme)
|
"""
|
||||||
|
Raccourci permettant d'appeler :py:func:`affich_tools.dialog`.
|
||||||
|
|
||||||
|
.. seealso:: :py:func:`affich_tools.dialog`
|
||||||
|
"""
|
||||||
|
return affich_tools.dialog(u'Gestion des adhérents et machines du Crans', arg, DIALOGRC)
|
||||||
|
|
||||||
in_facture = None
|
in_facture = None
|
||||||
#########################################################################
|
#########################################################################
|
||||||
|
@ -92,7 +104,8 @@ def set_bases(adher):
|
||||||
|
|
||||||
# Affichage
|
# Affichage
|
||||||
annul, result = dialog(arg)
|
annul, result = dialog(arg)
|
||||||
if annul: return 1
|
if annul:
|
||||||
|
return 1
|
||||||
|
|
||||||
# Traitement
|
# Traitement
|
||||||
err = ''
|
err = ''
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue