[inscription.py] ça avance, fout les inscriptions correctes dans des fichiers dans /v/l/w/d/p/

Ignore-this: d2ebe9614a2ca38aa97310480efa143
reste à faire:
 * masquer le mdp
 * empêcher les multi-insciption (ou pas ?)
 * faire plus de tests (ou pas?)
 * coder plus de js (ou pas?)
 * créer un script qui permette au câbleur de câbler plus rapidement (ou pas?)

darcs-hash:20090720172333-bd074-a398864703f09b3048b273eeb437686cc93f7d2d.gz
This commit is contained in:
Antoine Durand-Gasselin 2009-07-20 19:23:33 +02:00
parent 7932aa5a3f
commit 81299a838f

View file

@ -30,7 +30,7 @@ SXXo )XZX: |i> ._%i>~~+|ii| .i| ._s_ass,,. ._a%ssssssss
Licence: GPLv3 Licence: GPLv3
""" """
import re, locale, base64, sys, unicodedata import os, re, locale, base64, sys, unicodedata, random
from commands import getstatusoutput as gso from commands import getstatusoutput as gso
sys.path.append("/usr/scripts/gestion") sys.path.append("/usr/scripts/gestion")
from iptools import AddrInNet from iptools import AddrInNet
@ -40,6 +40,7 @@ from MoinMoin.Page import Page
from MoinMoin.PageEditor import PageEditor from MoinMoin.PageEditor import PageEditor
from MoinMoin.formatter.text_html import Formatter from MoinMoin.formatter.text_html import Formatter
PREINSCRIPTION_DIR = '/var/local/wiki/data/preinscription/'
ETABLISSEMENTS = [ ("ENS", u"ENS Cachan"), ETABLISSEMENTS = [ ("ENS", u"ENS Cachan"),
("IUT Cachan", u"IUT Cachan"), ("IUT Cachan", u"IUT Cachan"),
("Maximilien Sorre", u"Maximilien Sorre"), ("Maximilien Sorre", u"Maximilien Sorre"),
@ -102,11 +103,19 @@ SECTIONS_ENS = [ ("A0", u"A0 - Informatique"),
("D3", u"D3 - Sciences sociales"), ("D3", u"D3 - Sciences sociales"),
("E", u"E - Anglais") ] ("E", u"E - Anglais") ]
class FormElement():
"""Une classe pour représenter un élément d'un formulaire"""
def __init__(self, wikitxt):
self.content = wikitxt
def render(self, request, parser):
return wikiutil.renderText(request, parser, self.content)
class Field(): class Field():
"""Une classe pour représenter les champs """Une classe pour représenter les champs
Attention, elle ne permet que de rendre les champs en html, et Attention, elle ne permet que de rendre les champs en html, et
permet d'effectuer des tests unitaires""" d'effectuer des tests unitaires"""
error_txt='' error_txt=''
error_msg='' error_msg=''
@ -226,6 +235,15 @@ Seules les lettres (
l'espace et le tiret '-' sont acceptés.""" % (self.input, self.id) l'espace et le tiret '-' sont acceptés.""" % (self.input, self.id)
return False return False
def is_chbre(self):
if re.match('[abcghijp][0-9]{1,3}[gd]?', self.input.lower()):
return True
else:
self.error_txt = u"""Valeur %s incorrecte pour votre chambre, celle-ci doit être de la forme Bxxx, Bxxxg ou Bxxxd, avec B la première lettre de votre batiment (P pour le Pavillon des Jardins), xxx le numéro de votre chambre et g ou d si vous êtes dans un T1 bis selon que vous soyiez à gauche ou à droite"""
return False
def is_phonenumber(self): def is_phonenumber(self):
chiffres = self.input.replace('.', '') chiffres = self.input.replace('.', '')
if re.match('(0|\+[0-9][0-9])[0-9]{9}', chiffres): if re.match('(0|\+[0-9][0-9])[0-9]{9}', chiffres):
@ -257,47 +275,24 @@ def is_valid_mac(self):
self.default = get_mac(self.ip) self.default = get_mac(self.ip)
return False return False
class FormulaireInscription(): class Formulaire():
"""Une classe qui représente le formulaire d'inscription """Une classe qui représente un formulaire.
Elle contient un champs ``champs'', qui contient une liste de Elle contient un champs ``champs'', qui contient une liste de
Fields, qui est la liste des champs qui doivent être demandés (dans Fields, qui est la liste des champs qui doivent être demandés (dans
le bon ordre l'ordre). le bon ordre l'ordre).
""" """
def __init__(self, request): def __init__(self, champs):
self.champs = champs
ip = request.remote_addr def render(self, request, parser):
mac_field = Field("mac", u"Adresse physique de votre carte réseau", check=is_valid_mac, default=get_mac(ip))
mac_field.ip = ip
self.champs = [
Field("nom", "Nom", check=is_name),
Field("prenom", u"Prénom", check=is_name),
Field("tel", u"Numéro de téléphone", check=is_phonenumber),
PasswordField("pass", u"Mot de passe", input_type='password'),
Field("dns", u"Nom de votre ordinateur", check=is_dns),
mac_field,
MenuField('etablissement', u"Établissement d'études", ETABLISSEMENTS),
Field("etablissement_autre", u"Précisez votre établissement d'études",
check=is_name, CLASS='formulaire_field_etablissement_autre'),
MenuField('annee_ens', u"Année scolaire à l'ENS", ANNEE_ENS),
MenuField('annee', u"Choisissez votre année scolaire", ANNEE_ETUDE),
MenuField('section_ens', u"Section", SECTIONS_ENS),
MenuField('labo', u"Laboratoire", LABOS),
Field("section", u"Précisez votre section", CLASS="formulaire_field_section")
]
def _create_form(request, parser, formulaire):
url = request.page.url(request) url = request.page.url(request)
ret = html.FORM(action=url, NAME="preinscription") ret = html.FORM(action=url, NAME="preinscription")
ret.append(html.INPUT(type='hidden', name='action', value='inscription')) ret.append(html.INPUT(type='hidden', name='action', value='inscription'))
f = html.UL(CLASS="formulaire_preinscription") f = html.UL(CLASS="formulaire_preinscription")
for field in formulaire.champs: for field in self.champs:
champ = field.render(request, parser) champ = field.render(request, parser)
f.append(html.LI().append(champ)) f.append(html.LI().append(champ))
@ -307,48 +302,125 @@ def _create_form(request, parser, formulaire):
return unicode(ret) return unicode(ret)
def _check_form(post, formulaire):
def check(self, post):
u"""Vérifie les paramètres postés par l'utilisateur. u"""Vérifie les paramètres postés par l'utilisateur.
Vérifie que toutes les entrées du formulaire (formulaire.fields) Vérifie que toutes les entrées du formulaire (formulaire.fields)
sont présentes et bien valides, (en appelant check() pour chaque sont présentes et bien valides, (en appelant check() pour chaque
champs). champs).
""" """
errors = [] errors = []
for field in formulaire.champs: for field in self.champs:
field.fill(post) field.fill(post)
for field in formulaire.champs: for field in self.champs:
if not field.check(): if not field.check():
errors.append(field.id) errors.append(field.id)
# est-ce que les test unitaires passent ?
return errors return errors
def _create_inscription_form(request):
"""Renvoie les champs du formulaire inscription pour créer un Formulaire."""
ip = request.remote_addr
mac_field = Field("mac", u"Adresse physique de votre carte réseau", check=is_valid_mac, default=get_mac(ip))
mac_field.ip = ip
return [
# informations personnelles
Field("nom", "Nom", check=is_name),
Field("prenom", u"Prénom", check=is_name),
Field("chbre", u"Chambre", check=is_chbre),
MenuField('etablissement', u"Établissement d'études", ETABLISSEMENTS),
Field("etablissement_autre", u"Précisez votre établissement d'études",
CLASS='formulaire_field_etablissement_autre'),
MenuField('annee_ens', u"Année scolaire à l'ENS", ANNEE_ENS),
MenuField('annee', u"Choisissez votre année scolaire", ANNEE_ETUDE),
MenuField('section_ens', u"Section", SECTIONS_ENS),
MenuField('labo', u"Laboratoire", LABOS),
Field("section", u"Précisez votre section", CLASS="formulaire_field_section"),
Field("tel", u"Numéro de téléphone", check=is_phonenumber),
# compte crans
PasswordField("pass", u"Mot de passe", input_type='password'),
# Votre machine
Field("dns", u"Nom de votre ordinateur", check=is_dns),
mac_field
]
def _perform_inscription(request, formulaire): def _perform_inscription(request, formulaire):
request.emit_http_headers(more_headers = ['Content-Type: text/plain']) rand=random.Random()
results = '' rand.seed()
for i in range(1000):
numero = rand.randint(100000, 999999)
if not os.path.exists( os.path.join( PREINSCRIPTION_DIR, str( numero ) ) ):
break
else: # JAMAIS JAMAIS exécuté
request.theme.add_msg(u"Erreur côté serveur, merci de réessayer", "error")
return request.page.send_page()
print "ok"
fichier = open (os.path.join( PREINSCRIPTION_DIR, str( numero ) ), 'w')
for field in formulaire.champs: for field in formulaire.champs:
results += '%(id)s: %(content)s\n' % field.__dict__ # if type(field) == Field:
request.write(results) content = field.content.split('\n')[0]
fichier.write(u'%s: %s\n' % (field.id, content))
fichier.close()
print "ok 2"
# tests of redundancy
request.theme.add_msg(u"Votre préinscription est réalisée, elle a le numero %d" % numero)
return Page(request, "VieCrans/PreinscriptionOk").send_page()
# form = {}
# for field in formulaire.champs:
# if type(field) == Field:
# form[field.id] = field.content
# adh = {}
# adh['nom'] = form['nom']
# adh['prenom'] = form['prenom']
# adh['chbre'] = form['chbre']
# adh['tel'] = form['tel']
# if form['etablissement'] == 'ENS':
# if int(form['annee_ens']) > 4:
# adh['etudes'] = "ENS\n%(annee_ens)s\n%(labo)s" % form
# else:
# adh['etudes'] = "ENS\n%(annee_ens)s\n%(section_ens)s" % form
# else:
# adh['etudes'] = "%(etablissement)s\n%(annee)s\n%(secion)s" %form
#
# machine = {}
# machine['macAdress'] = form['mac']
# machine['host'] = form['dns']
def execute(pagename, request): def execute(pagename, request):
request.page = Page(request, pagename) request.page = Page(request, pagename)
request.formatter.setPage(request.page) request.formatter.setPage(request.page)
request.loadTheme('crans-www') request.loadTheme('crans-www')
formulaire = FormulaireInscription(request) formulaire = Formulaire(_create_inscription_form(request))
post = request.form post = request.form
parser = wikiutil.searchAndImportPlugin(request.cfg, "parser", request.page.pi['format']) parser = wikiutil.searchAndImportPlugin(request.cfg, "parser", request.page.pi['format'])
if not request.dicts.has_member("GroupeAdmin", request.user.name) and not request.user == 'AntoineDurandGasselin': if not request.dicts.has_member("GroupeAdmin", request.user.name) and not request.user == 'AntoineDurandGasselin':
request.theme.add_msg(u"Non, car tu es méchant", "error") request.theme.add_msg(u"Non, car tu es méchant", "error")
return(page.send_page()) return(request.page.send_page())
if post.has_key('inscrire'): if post.has_key('inscrire'):
if _check_form(post, formulaire) == []: if formulaire.check(post) == []:
return(_perform_inscription(request, formulaire)) return(_perform_inscription(request, formulaire))
else:
request.theme.add_msg(u'des erreurs', 'error')
request.emit_http_headers() request.emit_http_headers()
request.theme.send_title(u"Formulaire de préinscription", pagename=pagename, html_head='<script type="text/javascript" src="/wiki/crans-www/js/passwd.js"></script>') request.theme.send_title(u"Formulaire de préinscription", pagename=pagename, html_head='<script type="text/javascript" src="/wiki/crans-www/js/passwd.js"></script>')
request.write(request.formatter.startContent("content")) request.write(request.formatter.startContent("content"))
form = _create_form(request, parser, formulaire) form = formulaire.render(request, parser)
# THIS IS A BIG HACK. IT NEEDS TO BE CLEANED UP # THIS IS A BIG HACK. IT NEEDS TO BE CLEANED UP
request.write(form) request.write(form)
request.write(request.formatter.endContent()) request.write(request.formatter.endContent())