scripts/gestion/gest_crans2.py
Antoine Durand-Gasselin d79f7ec2f0 [lib/dialogwizard] on peut mettre des champs plus élaborés
Ignore-this: 197a121bac23ae72a086535cc612311c

darcs-hash:20090906134550-bd074-801938dc1daca12012adb24aeb4bff939ab75728.gz
2009-09-06 15:45:50 +02:00

241 lines
11 KiB
Python
Executable file

#! /usr/bin/env python
# -*- coding: utf-8 -*-
u"""Nouvelle interface utilisateur du système de gestion des machines et
adhérents du crans. Largement inspirée par l'ancienne version écrite par
Frédéric Pauget.
Copyright (C) 2009 Antoine Durand-Gasselin <adg@crans.org>
Licence : GPLv2
Utilise des wizard.Scenario des objets qu'on construit avec wizard.Steps
(qu'on construit avec des dialogwizard.DialogStepGenerator). Ces
Scenario sont ensuite lancés: transformés en wizard.Running, qui prend
en argument un dictionnaire, et renvoie un dictionnaire rempli selon les
choix faits par l'utilisateur dans l'interface dialog. (reste à bien
gérer les exceptions et les erreurs).
Idéalement, on \"tranforme\" les crans_ldap.Adherents en dicos, que l'on
modifie avec des dialog.Running, et on les sauve dans la base de donnée.
Bon là où ça se complique c'est qu'il faudrait reporter en temps réel
les erreurs qui sont renvoyées par crans_ldap.
Après on peut inscrire des gens de deux manières différentes: soit avec
un crans_ldap.Adherent(), soit avec un dico construit à partir d'infos
rentrés depuis la préinscription.
"""
### Rapport de bug automatique
# Destinataires, si vide n'envoi rien
To = ['fred@crans.org', 'glondu@crans.org', 'dimino@crans.org',
'salles@crans.org', 'cohen@crans.org', 'segaud@crans.org',
'adg@crans.org']
import os, sys#, string
# import dialog
# from whos import aff
# import signal, getopt
# from time import strftime, strptime, localtime, mktime
# import re
#
# import affich_tools, config
# from lock import make_lock, remove_lock
from ldap_crans import crans_ldap, script_utilisateur#, blacklist_items, ann_scol, droits_possibles, droits_critiques, smtpserv,
sys.path.append('/usr/scripts')
from lib.dialogwizard.wizard import Scenario, Running, step_scenario, unit_scenario
from lib.dialogwizard.dialogwizard import DialogStepGenerator
from ldap_crans import Adherent #, AssociationCrans, Club
# from ldap_crans import Machine, MachineFixe, MachineWifi, MachineCrans, BorneWifi
# import user_tests
# isadm = user_tests.isadm()
# isdeconnecteur = user_tests.isdeconnecteur()
#db = crans_ldap()
#droits = db.search("uid=%s" % script_utilisateur)['adherent'][0].droits()
droits = []
isimprimeur = u"Imprimeur" in droits
iscontroleur = u'Tresorier' in droits
isbureau = u'Bureau' in droits
encoding = sys.stdin.encoding or 'utf-8'
if u'Nounou' in droits and not os.environ.has_key('DIALOGRC') \
and not os.path.exists(os.path.expanduser('~/.dialogrc')):
os.environ['DIALOGRC'] = '/etc/dialog.rc'
dsgen = DialogStepGenerator(u'Gestion des adhérents et machines du Crans')
#########################################################################
## Fonctions de remplissage ou modification des paramètres d'un adhérent
prompt_new_adher = \
dsgen.form_step (u"Inscription adhérent", '',
[{'var': 'nom', 'label': 'Nom :', 'field_len': 20},
{'var': 'prenom', 'label': u'Prénom :', 'field_len': 20},
{'var': 'tel', 'label': u'Numéro de téléphone', 'field_len': 13},
{'var': 'chbre', 'label': u'Chambre :', 'field_len': 5} ])
prompt_addr_ext = \
dsgen.form_step (u"Adresse extérieure de %(nom)s", '',
[{'var': 'addr1', 'label': 'Adresse', 'field_len': 40},
{'var': 'addr2', 'label': '', 'field_len': 40},
{'var': 'addr3', 'label': 'Code Postal :', 'field_len': 6},
{'var': 'addr4', 'label': 'Ville :', 'field_len': 20}])
def prompt_etudes(name):
etab_step = \
dsgen.select_step(u'Études de %(nom)s (1/3)',
u"Choisissez l'établissement :",
'etud1',
[("ENS", u"ENS -- École Normale Supérieure de Cachan "),
("IUT Cachan", u"IUT Cachan"),
("Maximilien Sorre", u"Maximilien Sorre"),
("Gustave Eiffel", u"Gustave Eiffel"),
("P1", u"P1 -- Université Panthéon Sorbonne"),
("P2", u"P2 -- Université Panthéon Assas"),
("P3", u"P3 -- Université de la Sorbonne Nouvelle"),
("P4", u"P4 -- Université Paris Sorbonne"),
("P5", u"P5 -- Université René Descartes"),
("P6", u"P6 -- Université Pierre et Marie Curie"),
("P7", u"P7 -- Université Denis Diderot"),
("P8", u"P8 -- Université Vincennes Saint Denis"),
("P9", u"P9 -- Université Paris Dauphine"),
("P10", u"P10 -- Université de Nanterre"),
("P11", u"P11 -- Université de Paris Sud (Orsay)"),
("P12", u"P12 -- Université Val de Marne"),
("P13", u"P13 -- Université Paris Nord"),
("IUFM", u"IUFM"),
("Personnel ENS", u"Personnel ENS"),
("Personnel CROUS", u"Personnel CROUS"),
("autre", u"autre")])
etab_other = \
dsgen.input_step(u'Études de %(nom)s (1/3)',
u"Préciser l'établissement :",
'etud1')
year_ens_step = \
dsgen.select_step(u"Études de %(nom)s (2/3)",
u"Choisissez l'année administrative",
'etud2',
[("1", u"License"),
("2", u"Master 1"),
("3", u"Agrégation"),
("4", u"Master 2"),
("5", u"1ère année thèse"),
("6", u"2ème année thèse"),
("7", u"3ème année thèse"),
("", "Autre")])
year_step = \
dsgen.input_step(u"Études de %(nom)s (2/3)",
u"Année adminstrative :\nET UNIQUEMENT l'ANNEE : la section sera demandée après.",
'etud2')
section_step = \
dsgen.input_step(u'Études de %(nom)s (3/3)',
u'Section :',
'etud3')
section_step = \
dsgen.select_step(u'Études de %(nom)s (3/3)',
u'Choisissez la section :',
'etud3',
[ ("A0", "Informatique"),
("A1", "Mathématiques"),
("A2", "Physique fondamentale"),
("A''2", "Chimie"),
{'label': "A'2", 'item': "Physique appliquée",
'show_cond': (lambda d: d['etud2'] in ['3','4'])},
("A3", "Biochimie"),
{'label': "B123", 'item':"Technologie mécanique",
'show_cond': (lambda d: d['etud2'] == '1') },
{'label': "B1", 'item': "Mécanique",
'show_cond': (lambda d: d['etud2'] in ['2','3','4'])},
{'label': "B2", 'item': "Génie civil",
'show_cond': (lambda d: d['etud2'] in ['2','3','4'])},
{'label': "B3", 'item': "Génie mécanique",
'show_cond': (lambda d: d['etud2'] in ['2','3','4'])},
("EEA", "Électronique, électrotechnique et automatique"),
("C", "Art et création industrielle"),
("D2", "Economie gestion"),
("D3", "Sciences sociales"),
("E", "Anglais") ])
labo_step = \
dsgen.select_step(u'Études de %(nom)s (3/3)',
u'Choisissez le laboratoire :',
'etud3',
[ ("CMLA", u"Centre de Mathématiques et de Leurs Applications"),
("GAPP", u"Groupe d'Analyse des Politiques Publiques"),
("IDHE", u"Institutions et Dynamiques Historiques de l'Economie"),
("LBPA", u"Laboratoire de Biotechnologies et Pharmacologie génétique Appliquées"),
("LMT", u"Laboratoire de Mécanique et Technologie"),
("LPQM", u"Laboratoire de Photonique Quantique et Moléculaire"),
("LSV", u"Laboratoire de Spécification et Vérification"),
("LURPA", u"Laboratoire Universitaire de Recherche en Production Automatisée"),
("PPSM", u"Laboratoire de Photophysique et Photochimie Supramoléculaires et Macromoléculaires"),
("SATIE", u"Systèmes et Applications des Technologies de l'Information et de l'Energie"),
("STEF", u"Sciences Techniques Education Formation") ])
etudes_scenar = Scenario()
etudes_scenar.nest(etab_step)
ens_scenar = Scenario()
ens_scenar.nest(year_ens_step)
ens_scenar.branch((lambda d: d['etud2'] in ['1','2','3','4']),
step_scenario(section_step),
step_scenario(labo_step))
other_etab_scenar = Scenario()
other_etab_scenar.nest(year_step)
other_etab_scenar.nest(section_step)
etudes_scenar.branch((lambda d: d['etud1'] == 'other'),
step_scenario(etab_other),
unit_scenario())
etudes_scenar.branch((lambda d: d['etud1'] == 'ENS'),
ens_scenar, other_etab_scenar)
return etudes_scenar
# prompt_connexion = \
# dsgen.form_step (u"Type de connexion",
# u'Inscription adhérent',
# 'typ', [('1', 'Adhésion'),
# ('2', 'Inscription gratuite')])
prompt_papiers = \
dsgen.checklist_step('', u'État administratif de %(nom)s',
[('carte', u"Carte d'étudiant %s-%s fourniee" % (ann_scol, ann_scol+1)),
('paiement%s' % ann_scol, u'Cotisation %s réglée et charte signée' % ann_scol),
('chartema', u'Charte des membres actifs signée')])
prompt_login = \
dsgen.input_step(u'Choix du login pour %(nom)s',
u'Le choix du login doit faire au maximum 15 caractères\nIl ne doit *pas* être un pseudo ou un prénom, mais doit être relié au nom de famille\nSeuls les caractères alphabétiques et le - sont autorisés', 'login')
prompt_mailaddress = \
dsgen.input_step(u'Addresse mail extérieure de %(nom)s',
'', 'mail')
dummy_scenar = Scenario()
dummy_scenar.nest(prompt_new_adher)
dummy_scenar.nest(prompt_addr_ext)
dummy_scenar.quote(prompt_etudes('toto'))
Running(dummy_scenar).run()
def inscrit_in_ldap(adherent):
"""Prend en argument un dictionnaire, et l'inscrit dans la base ldap
Les champs suivants ont OBLIGATOIRES:
nom, prenom, chbre, mail, login
Les champs suivants sont OPTIONNELS:
carte, paiementYEAR, tel, etud1, etud2, etud3, addr1, addr2, addr3, addr4
"""
adher = Adherent()