diff --git a/wiki/action/inscription.py b/wiki/action/inscription.py index 7fc55653..2f25e5c4 100644 --- a/wiki/action/inscription.py +++ b/wiki/action/inscription.py @@ -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,98 +275,152 @@ 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 + 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')) - mac_field = Field("mac", u"Adresse physique de votre carte réseau", check=is_valid_mac, default=get_mac(ip)) - mac_field.ip = ip + f = html.UL(CLASS="formulaire_preinscription") + + for field in self.champs: + champ = field.render(request, parser) + f.append(html.LI().append(champ)) + + ret.append(f) + ret.append(html.HR(CLASS= "invisiblesep")) + ret.append(html.INPUT(type="submit", name="inscrire", value=u"Me préinscrire")) + + return unicode(ret) - 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) - 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: - champ = field.render(request, parser) - f.append(html.LI().append(champ)) - - ret.append(f) - ret.append(html.HR(CLASS= "invisiblesep")) - ret.append(html.INPUT(type="submit", name="inscrire", value=u"Me préinscrire")) - - return unicode(ret) - -def _check_form(post, formulaire): - u"""Vérifie les paramètres postés par l'utilisateur. + 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: - field.fill(post) - for field in formulaire.champs: - if not field.check(): - errors.append(field.id) - return errors + """ + errors = [] + for field in self.champs: + field.fill(post) + 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='') 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())