#! /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", '', [{'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()