[wiki/inscription.py] le checking marche
Ignore-this: b729df196ba555c36378988f522f72b4 * Reste à formatter et renvoyer les résultats * Rajouter tous les champs que l'on veut * Rajouter du js pour faire plus web2.0 darcs-hash:20090618013315-bd074-28f063d952bcebea89c9ae6724e0e84b2f8dfae9.gz
This commit is contained in:
parent
76bb8ade3d
commit
42ef9c2aa3
1 changed files with 175 additions and 42 deletions
|
@ -30,7 +30,7 @@ SXXo )XZX: |i> ._%i>~~+|ii| .i| ._s_ass,,. ._a%ssssssss
|
||||||
License: GPLv3
|
License: GPLv3
|
||||||
"""
|
"""
|
||||||
|
|
||||||
import re, locale, base64, sys
|
import re, locale, base64, sys, unicodedata
|
||||||
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
|
||||||
|
@ -38,39 +38,151 @@ from MoinMoin import wikiutil
|
||||||
from MoinMoin.widget import html
|
from MoinMoin.widget import html
|
||||||
from MoinMoin.Page import Page
|
from MoinMoin.Page import Page
|
||||||
from MoinMoin.PageEditor import PageEditor
|
from MoinMoin.PageEditor import PageEditor
|
||||||
|
from MoinMoin.formatter.text_html import Formatter
|
||||||
|
|
||||||
CHAMPS = ["nom Nom", u"prenom Prénom", "dob Date de naissance",
|
class Field():
|
||||||
u"etudes Choisir une filière", u"tel Numéro de téléphone",
|
"""Une classe pour représenter les champs
|
||||||
"chbre Chambre (ex: J042g, M666)", u"section Filière d'études",
|
|
||||||
u"annee année", "mail Adresse mail", "dns Nom de machine fixe"]
|
|
||||||
#"mac Adresse MAC"]
|
|
||||||
|
|
||||||
def _create_form(request):
|
Attention, elle ne permet que de rendre les champs en html, et
|
||||||
|
permet d'effectuer des tests unitaires"""
|
||||||
|
|
||||||
|
error_txt=''
|
||||||
|
error_msg=''
|
||||||
|
error_field=''
|
||||||
|
|
||||||
|
def __init__(self, id, prompt, default = "", input_type = "text", check=None):
|
||||||
|
self.id = id
|
||||||
|
self.prompt = html.Text(prompt)
|
||||||
|
self.default = default
|
||||||
|
self.input_type = input_type
|
||||||
|
if check != None: self.check_hook = check
|
||||||
|
else: self.check_hook = (lambda x: True)
|
||||||
|
|
||||||
|
def fill(self, string):
|
||||||
|
self.input = string[0]
|
||||||
|
|
||||||
|
def check(self):
|
||||||
|
self.error_txt= '' # Devrait pourtant être déjà vide
|
||||||
|
|
||||||
|
self.default = self.input
|
||||||
|
ok = self.check_hook(self)
|
||||||
|
|
||||||
|
if ok:
|
||||||
|
self.content = self.__dict__.get('content', self.input) # des fois qu'on ait oublié de le faire
|
||||||
|
if self.content != self.default and self.default == self.input:
|
||||||
|
self.default = self.content
|
||||||
|
|
||||||
|
if not self.error_txt and not ok:
|
||||||
|
self.error_txt = u'Valeur %s incorrecte pour le champ %s.' % (self.input, self.id)
|
||||||
|
return ok
|
||||||
|
|
||||||
|
def render(self, request, parser):
|
||||||
|
champ = html.UL()
|
||||||
|
champ.append(html.LI().append(self.prompt))
|
||||||
|
|
||||||
|
input = html.INPUT(type=self.input_type,name=self.id,value=self.default)
|
||||||
|
champ.append(html.LI().append(input))
|
||||||
|
|
||||||
|
if self.error_txt:
|
||||||
|
error = wikiutil.renderText(request, parser, self.error_txt)
|
||||||
|
champ.append(html.LI().append(error))
|
||||||
|
|
||||||
|
if self.error_msg:
|
||||||
|
request.add_msg(self.error_msg)
|
||||||
|
|
||||||
|
return champ
|
||||||
|
|
||||||
|
def is_name(self):
|
||||||
|
"""Vérifie que le champ input de l'objet passé en argument est un nom valide."""
|
||||||
|
analysed_content = unicodedata.normalize('NFKD', unicode.decode(self.input))
|
||||||
|
try: stripped_content = analysed_content.encode('ASCII', 'ignore')
|
||||||
|
except UnicodeEncodeError: stripped_content = '<ugly utf-8>'
|
||||||
|
if re.match('[-a-zA-Z _]*', stripped_content):
|
||||||
|
return True
|
||||||
|
else:
|
||||||
|
self.error_txt = u"""Valeur %s incorrecte pour le champ %s.
|
||||||
|
Seules les lettres (éventuellement accentuées),
|
||||||
|
l'espace et le tiret '-' sont acceptés.""" % (self.input, self.id)
|
||||||
|
return False
|
||||||
|
|
||||||
|
def is_phonenumber(self):
|
||||||
|
chiffres = self.input.replace('.', '')
|
||||||
|
if re.match('(0|\+[0-9][0-9])[0-9]{9}', chiffres):
|
||||||
|
return True
|
||||||
|
else:
|
||||||
|
self.content = ''
|
||||||
|
return True
|
||||||
|
|
||||||
|
def is_dns(self):
|
||||||
|
dns = self.input.lower()
|
||||||
|
if re.match('[a-z][-a-z0-9_]*', dns):
|
||||||
|
return True
|
||||||
|
else:
|
||||||
|
return False
|
||||||
|
|
||||||
|
def get_mac(ip):
|
||||||
|
"Récupère la mac"
|
||||||
|
mac= 'XX' + ':XX'*5
|
||||||
|
if AddrInNet(ip, '138.231.136.0/21'):
|
||||||
|
status, mac = gso("/usr/sbin/arp %s | perl -nle '{print $& if /00(:[0-9a-f]{2}){5}/}'" % ip) # gruik, gruik, grUUIIIk !
|
||||||
|
mac= mac.strip()
|
||||||
|
return mac
|
||||||
|
|
||||||
|
def is_valid_mac(self):
|
||||||
|
mac = self.input.lower()
|
||||||
|
if re.search("00((:|-|)[a-f0-9][a-f0-9]){5}", mac):
|
||||||
|
return True
|
||||||
|
else:
|
||||||
|
self.default = get_mac(self.ip)
|
||||||
|
return False
|
||||||
|
|
||||||
|
class FormulaireInscription():
|
||||||
|
"""Une classe qui représente le formulaire d'inscription
|
||||||
|
|
||||||
|
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):
|
||||||
|
|
||||||
|
ip = request.remote_addr
|
||||||
|
|
||||||
|
def erase_password(self):
|
||||||
|
self.default = ''
|
||||||
|
return True
|
||||||
|
|
||||||
|
pass2_field = Field("pass2", u"Mot de passe", input_type='password', check=erase_password)
|
||||||
|
|
||||||
|
def is_correctpassword(self):
|
||||||
|
self.default = ''
|
||||||
|
if pass2_field.input == self.input:
|
||||||
|
return True
|
||||||
|
else:
|
||||||
|
self.error_txt=u'Attention les mots de passe diffèrent'
|
||||||
|
return False
|
||||||
|
|
||||||
|
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),
|
||||||
|
Field("pass1", u"Mot de passe", input_type='password', check=is_correctpassword),
|
||||||
|
pass2_field,
|
||||||
|
Field("dns", u"Nom de votre ordinateur", check=is_dns),
|
||||||
|
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
def _create_form(request, parser, formulaire):
|
||||||
url = request.page.url(request)
|
url = request.page.url(request)
|
||||||
ret = html.FORM(action=url)
|
ret = html.FORM(action=url)
|
||||||
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 lbl, txt in [c.split(' ', 1) for c in CHAMPS]:
|
for field in formulaire.champs:
|
||||||
champ = html.UL()
|
champ = field.render(request, parser)
|
||||||
champ.append(html.LI().append(html.Text(txt)))
|
|
||||||
champ.append(html.LI().append(html.INPUT(type="text", name=lbl)))
|
|
||||||
f.append(html.LI().append(champ))
|
|
||||||
|
|
||||||
# On récupère l'adrese MAC
|
|
||||||
ip = request.remote_addr
|
|
||||||
if not AddrInNet(ip, '138.231.136.0/21'): request.theme.add_msg(
|
|
||||||
u"tu n'es pas dans le bon sous-réseau, je ne peux pas deviner ton adresse MAC", 'error')
|
|
||||||
status, mac = gso("/usr/sbin/arp %s | perl -nle '{print $& if /00(:\S\S)*/}'" % ip) # gruik, gruik, grUUIIIk !
|
|
||||||
mac= mac.strip()
|
|
||||||
if status: request.theme.add_msg(u"Problème d'arp (ou de perl...)", 'error')
|
|
||||||
if not re.match("00(:[a-fA-F0-9][a-fA-F0-9]){5}", mac):
|
|
||||||
request.theme.add_msg(u"Mac non valide: %s" % mac)
|
|
||||||
mac = 'XX:XX:XX:XX:XX:XX'
|
|
||||||
champ = html.UL()
|
|
||||||
champ.append(html.LI().append(html.Text("Adresse MAC")))
|
|
||||||
champ.append(html.LI().append(html.INPUT(type="text", name='mac', value=mac)))
|
|
||||||
f.append(html.LI().append(champ))
|
f.append(html.LI().append(champ))
|
||||||
|
|
||||||
ret.append(f)
|
ret.append(f)
|
||||||
|
@ -78,22 +190,43 @@ def _create_form(request):
|
||||||
|
|
||||||
return unicode(ret)
|
return unicode(ret)
|
||||||
|
|
||||||
|
def _check_form(post, formulaire):
|
||||||
|
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:
|
||||||
|
field.fill(post.get(field.id, ''))
|
||||||
|
for field in formulaire.champs:
|
||||||
|
if not field.check():
|
||||||
|
errors.append(field.id)
|
||||||
|
return errors
|
||||||
|
|
||||||
|
def _perform_inscription(page, formulaire):
|
||||||
|
return(page.send_page())
|
||||||
|
|
||||||
def execute(pagename, request):
|
def execute(pagename, request):
|
||||||
page = Page(request, pagename)
|
request.page = Page(request, pagename)
|
||||||
form = request.form
|
request.formatter.setPage(request.page)
|
||||||
if not request.dicts.has_member("GroupeAdmin", request.user.name):
|
formulaire = FormulaireInscription(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")
|
request.theme.add_msg(u"Non, car tu es méchant", "error")
|
||||||
return(page.send_page())
|
return(page.send_page())
|
||||||
|
|
||||||
if form.has_key('inscrire'):
|
if post.has_key('inscrire'):
|
||||||
request.theme.add_msg(u"Un peu de patience, je ne suis pas encore implémenté", "error")
|
if _check_form(post, formulaire) == []:
|
||||||
return(page.send_page())
|
_perform_inscription(request.page, formulaire)
|
||||||
else: # show create form
|
|
||||||
request.emit_http_headers()
|
request.emit_http_headers()
|
||||||
form = _create_form(request)
|
|
||||||
request.theme.send_title(u"Formulaire de préinscription", pagename=pagename)
|
request.theme.send_title(u"Formulaire de préinscription", pagename=pagename)
|
||||||
request.write(request.formatter.startContent("content"))
|
request.write(request.formatter.startContent("content"))
|
||||||
|
|
||||||
|
form = _create_form(request, parser, formulaire)
|
||||||
# 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