[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
"""
import re, locale, base64, sys, unicodedata
import os, re, locale, base64, sys, unicodedata, random
from commands import getstatusoutput as gso
sys.path.append("/usr/scripts/gestion")
from iptools import AddrInNet
@ -40,6 +40,7 @@ from MoinMoin.Page import Page
from MoinMoin.PageEditor import PageEditor
from MoinMoin.formatter.text_html import Formatter
PREINSCRIPTION_DIR = '/var/local/wiki/data/preinscription/'
ETABLISSEMENTS = [ ("ENS", u"ENS Cachan"),
("IUT Cachan", u"IUT Cachan"),
("Maximilien Sorre", u"Maximilien Sorre"),
@ -102,11 +103,19 @@ SECTIONS_ENS = [ ("A0", u"A0 - Informatique"),
("D3", u"D3 - Sciences sociales"),
("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():
"""Une classe pour représenter les champs
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_msg=''
@ -226,6 +235,15 @@ Seules les lettres (
l'espace et le tiret '-' sont acceptés.""" % (self.input, self.id)
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):
chiffres = self.input.replace('.', '')
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)
return False
class FormulaireInscription():
"""Une classe qui représente le formulaire d'inscription
class Formulaire():
"""Une classe qui représente un formulaire.
Elle contient un champs ``champs'', qui contient une liste de
Fields, qui est la liste des champs qui doivent être demandés (dans
le bon ordre l'ordre).
"""
def __init__(self, request):
def __init__(self, champs):
self.champs = champs
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
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):
def render(self, request, parser):
url = request.page.url(request)
ret = html.FORM(action=url, NAME="preinscription")
ret.append(html.INPUT(type='hidden', name='action', value='inscription'))
f = html.UL(CLASS="formulaire_preinscription")
for field in formulaire.champs:
for field in self.champs:
champ = field.render(request, parser)
f.append(html.LI().append(champ))
@ -307,48 +302,125 @@ def _create_form(request, parser, formulaire):
return unicode(ret)
def _check_form(post, formulaire):
def check(self, post):
u"""Vérifie les paramètres postés par l'utilisateur.
Vérifie que toutes les entrées du formulaire (formulaire.fields)
sont présentes et bien valides, (en appelant check() pour chaque
champs).
"""
"""
errors = []
for field in formulaire.champs:
for field in self.champs:
field.fill(post)
for field in formulaire.champs:
for field in self.champs:
if not field.check():
errors.append(field.id)
# est-ce que les test unitaires passent ?
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):
request.emit_http_headers(more_headers = ['Content-Type: text/plain'])
results = ''
rand=random.Random()
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:
results += '%(id)s: %(content)s\n' % field.__dict__
request.write(results)
# if type(field) == Field:
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):
request.page = Page(request, pagename)
request.formatter.setPage(request.page)
request.loadTheme('crans-www')
formulaire = FormulaireInscription(request)
formulaire = Formulaire(_create_inscription_form(request))
post = request.form
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':
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 _check_form(post, formulaire) == []:
if formulaire.check(post) == []:
return(_perform_inscription(request, formulaire))
else:
request.theme.add_msg(u'des erreurs', 'error')
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.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
request.write(form)
request.write(request.formatter.endContent())