[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:
parent
7932aa5a3f
commit
81299a838f
1 changed files with 133 additions and 61 deletions
|
@ -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())
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue