diff --git a/gestion/gest_crans2.py b/gestion/gest_crans2.py new file mode 100755 index 00000000..4cca0f2c --- /dev/null +++ b/gestion/gest_crans2.py @@ -0,0 +1,274 @@ +#! /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 +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", '', + [('nom', 'Nom :', 20), + ('prenom', u'Prénom :', 20), + ('tel', u'Numéro de téléphone', 13), + ('chbre', u'Chambre :', 5) ]) + +prompt_addr_ext = \ + dsgen.form_step (u"Adresse extérieure de %(nom)s", '', + [('addr1', 'Adresse', 40), ('addr2', '', 40), + ('addr3', 'Code Postal :', 6), + ('addr4', 'Ville :', 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') + + section1_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"), + ("A3", "Biochimie"), + ("B123", "Technologie mécanique"), + ("EEA", "Électronique, électrotechnique et automatique"), + ("C", "Art et création industrielle"), + ("D2", "Economie gestion"), + ("D3", "Sciences sociales"), + ("E", "Anglais") ]) + + section2_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"), + ("A3", "Biochimie"), + ("B1", "Mécanique"), + ("B2", "Génie civil"), + ("B3", "Génie mécanique"), + ("EEA", "Électronique, électrotechnique et automatique"), + ("C", "Art et création industrielle"), + ("D2", "Economie gestion"), + ("D3", "Sciences sociales"), + ("E", "Anglais") ]) + + section3_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", "Physique appliquée"), + ("A''2", "Chimie"), + ("A3", "Biochimie"), + ("B1", "Mécanique"), + ("B2", "Génie civil"), + ("B3", "Génie mécanique"), + ("B4", "Génie électrique"), + ("C", "Art et création industrielle"), + ("D2", "Economie gestion"), + ("D3", "Sciences sociales"), + ("E", "Anglais") ]) + + section5_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.case((lambda d: d['etud2']), + { '1': step_scenario(section1_step), + '2': step_scenario(section2_step), + '3': step_scenario(section3_step), + '4': step_scenario(section3_step), + '5': step_scenario(section5_step), + '6': step_scenario(section5_step), + '7': step_scenario(section5_step) }, + fallback = step_scenario(section_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 fourniee" % ann_scol), + ('paiement%s' % this_year, 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', + '') + +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()