# -*- coding: utf8 -*- import random import string from wtforms import Form, BooleanField, StringField, TextAreaField, SelectField from wtforms import SubmitField, validators, FieldList, PasswordField # import .ExtWforms from .ExtWtforms import MySelectField from wtforms import HiddenField, DecimalField, DateTimeField, FormField, DateField from wtforms.validators import ValidationError from wtforms.csrf.session import SessionCSRF from datetime import timedelta from jm2l.const import CurrentYear # What about an helper function def strip_filter(x): # strip_filter = lambda x: x.strip() if x else None if x: return x.strip() return None # get random string password with letters, digits, and symbols def get_random_string(length): csrf_characters = string.ascii_letters + string.digits + string.punctuation csrf = ''.join(random.choice(csrf_characters) for i in range(length)) return bytes(csrf, 'utf8') class MyBaseForm(Form): class Meta: csrf = True csrf_class = SessionCSRF # csrf_secret = b'lJDQtOAMC2qe89doIn8u3Mch_DgeLSKO' csrf_secret = get_random_string(32) csrf_time_limit = timedelta(minutes=60) class BlogCreateForm(MyBaseForm): title = StringField('Entry title', [validators.Length(min=1, max=255)], filters=[strip_filter]) body = TextAreaField('Entry body', [validators.Length(min=1)], filters=[strip_filter]) class BlogUpdateForm(BlogCreateForm): id = HiddenField() PLACE_TYPE = [('Aeroport', u'Aéroport'), ('Gare', 'Gare'), ('JM2L', 'JM2L'), ('Hotel', u'Hôtel'), ('Habitant', 'Habitant'), ('Restaurant', 'Restaurant'), ('Autres', 'Autres')] TIERS_ROLE = [('Exposant', 'Exposant'), ('Sponsor', 'Sponsor'), ('Donateur', 'Donateur')] YESNO = [("0", "Non"), ("1", "Oui")] EVENT_TYPE = ['Stand', 'Table ronde', 'Atelier', 'Concert', 'Conference', 'Repas'] CONF_DURATION = [(15, u'Lighting talk ( 5 min)'), (30, u'Conférence (20 min)'), (60, u'Conférence (50 min)'), (90, u'Conférence (75 min)'), ] ATELIER_DURATION = [(15, u'Lighting talk ( 5 min)'), (30, u'Conférence (20 min)'), (60, u'Conférence (50 min)'), (90, u'Conférence (75 min)'), ] class StaffArea(MyBaseForm): name = StringField(u'Pôle') description = TextAreaField('Description', [validators.optional(), validators.Length(max=1000000)], filters=[strip_filter] ) year_uid = HiddenField('year', default=str(CurrentYear)) class EditStaffArea(StaffArea): uid = HiddenField() class StaffTasks(MyBaseForm): name = StringField(u'Nom de la tâche', [validators.Required()]) area_uid = SelectField(u'Pôle concerné', coerce=int) closed_by = SelectField(u'Assigné à', coerce=int) due_date = DateField(u'Date prévue', format='%d/%m/%Y') description = TextAreaField('Description', [validators.optional(), validators.Length(max=1000000)], filters=[strip_filter]) year_uid = HiddenField('year', default=str(CurrentYear)) class EditStaffTasks(StaffTasks): uid = HiddenField() class DossPresse(MyBaseForm): year_uid = HiddenField() doss_presse = TextAreaField('Dossier de Presse', [validators.optional(), validators.Length(max=1000000)], filters=[strip_filter]) class IndexForm(MyBaseForm): year_uid = HiddenField() description = TextAreaField('Index', [validators.optional(), validators.Length(max=1000000)], filters=[strip_filter]) class TiersMember(MyBaseForm): class Meta: csrf = False year_uid = SelectField(u'Année', coerce=int, choices=list(zip(range(2006, CurrentYear + 1), range(2006, CurrentYear + 1)))) user_uid = StringField(u'user') role = StringField(u'Role') class TiersRole(MyBaseForm): class Meta: csrf = False year_uid = SelectField(u'Année', coerce=int, choices=list(zip(range(2006, CurrentYear + 1), range(2006, CurrentYear + 1)))) tiers_role = SelectField(u'Role', choices=TIERS_ROLE) class TiersChoice(MyBaseForm): class Meta: csrf = False year_uid = HiddenField() user_uid = HiddenField() tiers_uid = StringField(u'Entité') role = StringField(u'Role') class AddIntervenant(MyBaseForm): class Meta: csrf = False event_uid = HiddenField() intervenant = SelectField(u'Intervenant', coerce=int) class AddTiers(MyBaseForm): class Meta: csrf = False event_uid = HiddenField() tiers = SelectField(u'Entité', coerce=int) class ConfCreateForm(MyBaseForm): event_type = HiddenField() for_year = HiddenField() start_time = HiddenField() end_time = HiddenField() start_sel = SelectField( u'Début', coerce=int, description=u"C'est une heure indicative correspondant au mieux à vos préférences " u"personnelles. Vous pouvez prendre un créneau horaire déjà réservé si vous avez des contraintes " u"particulières. L'équipe des JM2L mettra à disposition plus de salle si nécessaire. " u"En cas de conflit," u"l'organisation se réserve le droit de changer la salle et l'heure avec votre accord." ) duration = SelectField( u'Durée', coerce=int, description=u"Précisez ici la durée de votre intervention") salle_uid = SelectField( u'Salle', coerce=int, description=u"Choisissez ici la salle en fonction du nombres de personnes potentiellement " u"intéressé par votre intervention l'organisation se réserve le droit de changer" u" la salle (avec votre accord)." ) name = StringField( u'Le nom de votre ', [validators.DataRequired(u'Vous devez spécifier un nom pour votre intérvention'), validators.Length(min=1, max=80, message='entre 1 et 80 car')], filters=[strip_filter] ) description = TextAreaField( u'Décrivez ici quelques détails à propos de votre intervention ', [validators.Optional(), validators.Length(max=1000000)], filters=[strip_filter] ) class ConfUpdateForm(ConfCreateForm): uid = HiddenField() class SalleForm(MyBaseForm): year_uid = SelectField(u'Année', coerce=int) phy_salle_id = SelectField('Salle Physique', coerce=int) place_type = SelectField('Type', choices=[('Conference', u'Conférence'), ('Stand', 'Stand'), ('Atelier', 'Atelier'), ('Table ronde', 'Table ronde'), ('MAO', 'MAO'), ('Repas', 'Repas / Snack'), ('Autres', 'Autres')]) name = StringField('Nom de la salle', [validators.Length(min=1, max=40)], filters=[strip_filter]) description = TextAreaField('Description', filters=[strip_filter]) class EditSalleForm(SalleForm): salle_id = HiddenField() class SallePhyForm(MyBaseForm): name = StringField('Nom de la salle', [validators.Length(min=1, max=40)], filters=[strip_filter]) nb_places = StringField('Nombre de places', [validators.Length(max=4)]) description = TextAreaField('Description', filters=[strip_filter]) class EditSallePhyForm(SallePhyForm): uid = HiddenField() class PlaceCreateForm(MyBaseForm): place_type = SelectField('Type', choices=PLACE_TYPE) display_name = StringField(u'Nom affiché', [validators.Length(min=1, max=20)], filters=[strip_filter]) name = StringField('Nom Complet', [validators.Length(min=1, max=80)], filters=[strip_filter]) gps_coord = StringField(u'Coordonnées GPS', [validators.Length(max=30), validators.Regexp("^[0-9]+\.?[0-9]+,[0-9]+\.?[0-9]+$", message=u"Le GPS devrait être sous la forme 43.6158372,7.0723401")], filters=[strip_filter]) adresse = TextAreaField('Adresse', [validators.Length(max=100)], filters=[strip_filter]) codePostal = StringField('Code Postal', [validators.Length(max=5)], filters=[strip_filter]) ville = StringField('Ville', [validators.Length(max=40)], filters=[strip_filter]) website = StringField('Site Web', [validators.Length(max=100)], filters=[strip_filter]) description = TextAreaField('Description', filters=[strip_filter]) created_by = HiddenField() class PlaceUpdateForm(PlaceCreateForm): place_id = HiddenField() def captcha_check(form, field): if form.meta.csrf_context.get('Captcha') != field.data: raise ValidationError(u"la vérification captcha est invalide.") class UserPasswordForm(MyBaseForm): uid = HiddenField() password = PasswordField("Mot de passe", [ validators.Length(max=128, message=u"128 car. maximum"), validators.required(message=u"Ce champ est obligatoire"), validators.EqualTo('confirm', message=u'Les password ne sont pas équivalents')], filters=[strip_filter] ) confirm = PasswordField('Confirmez') class UserRegisterForm(MyBaseForm): nom = StringField(u'Nom', [ validators.Length(max=80, message=u"80 car. maximum"), validators.required(message=u"Ce champ est obligatoire")], filters=[strip_filter] ) prenom = StringField(u'Prénom', [ validators.Length(max=80, message=u"80 car. maximum"), validators.required(message=u"Ce champ est obligatoire"), validators.Length(max=80)], filters=[strip_filter] ) mail = StringField(u'Adresse électronique', [ validators.required(message=u"Ce champ est obligatoire"), validators.Email(message=u"Essayez aussi avec une adresse e-mail valide"), validators.Length(max=100)], filters=[strip_filter], description=u"Une adresse e-mail valide." + u"Cette adresse ne sera pas rendue publique, " + u"et ne sera pas divulguée à des tiers." ) captcha = StringField(u'Captcha', [validators.Length(max=8), captcha_check], filters=[strip_filter] ) class ProfilForm(MyBaseForm): id = HiddenField() user_id = HiddenField() nom = StringField(u'Nom', [validators.Length(max=80)], filters=[strip_filter], description=u"Les espaces sont autorisés, la ponctuation n'est " + u"pas autorisée à l'exception des points, traits d'union, " + u"apostrophes et tirets bas." ) prenom = StringField(u'Prénom', [validators.Length(max=80)], filters=[strip_filter], description=u"Les espaces sont autorisés, la ponctuation n'est " + u"pas autorisée à l'exception des points, traits d'union, " + u"apostrophes et tirets bas." ) pseudo = StringField(u'Pseudo', [validators.Length(max=80)], filters=[strip_filter], description="Votre pseudo d'usage sur la toile." ) mail = StringField(u'Adresse électronique', [validators.optional(), validators.Email(), validators.Length(max=100)], filters=[strip_filter], description=u"Une adresse e-mail valide. Tous les messages de ce système" + u"seront envoyés à cette adresse. Cette adresse ne sera pas rendue publique," + u"et ne sera utilisée que si vous désirez obtenir un nouveau mot de passe ou" + u"recevoir personnellement certaines nouvelles ou avertissements." ) phone = StringField(u'Mobile', [validators.optional(), validators.Length(max=10), validators.Regexp("\d+", message=u"Le numéro de téléphone mobile ne doit contenir que des chiffres")], filters=[strip_filter], description=u"Un numéro de mobile valide. Afin de pouvoir rester en" + u"contact avec les personne de l'organisation, et pour vos échanges. " + u"Ce numéro ne sera pas publié, et ne sera utilisé que si " + u"vous désirez recevoir personnellement certaines nouvelles ou alertes." ) website = StringField(u'Site web', [validators.optional(), validators.URL(), validators.Length(max=100)], filters=[strip_filter], description="Renseignez ici votre site Web." ) gpg_key = TextAreaField(u'Ma clé GPG', [validators.optional(), validators.Length(max=9000)], filters=[strip_filter], description=u"Vous pouvez insérer votre clé GPG publique pour " + u"échanger des données sécurisées." ) soc_link = TextAreaField('Mes autres identifiants', [validators.optional(), validators.Length(max=1000000)], filters=[strip_filter], description=u"Vous pouvez insérer ici d'autres identifiants " + u"permettant aux autres de vous retrouver sur la toile (IRC, jabber, réseaux sociaux etc)." ) bio = TextAreaField('Biographie', [validators.optional(), validators.Length(max=1000000)], filters=[strip_filter] ) tiersship = FieldList(FormField(TiersChoice)) class MiamForm(MyBaseForm): RepasVendredi = SelectField(u'Je viens au dîner convivial vendredi soir', choices=YESNO, description=u"L'organisation réserve le " + u"restaurant pour ce dîner convivial. De petites " + u"animations vous seront proposées. " + u"Il nous faut savoir si on vous réserve une place !" ) RepasSamediMidi = SelectField(u'Je déjeune sur place samedi midi', choices=YESNO) RepasSamediSoir = SelectField(u'Je viens au repas de clôture samedi soir', choices=YESNO, description=u"L'organisation réserve le " + u"restaurant pour le dîner de clôture. De petites " + u"animations vous seront proposées. " + u"Il nous faut savoir si on vous réserve une place !" ) Allergies = TextAreaField(u'Allergies', [validators.Length(max=100)], filters=[strip_filter], description=u"Entrez ici vos allergies éventuelles, " + u"Ce que votre organisme ne supporte absolument pas." + u"L'organisation fera alors en sorte de les éviter ou " + u"de les identifier explicitement." ) Contraintes = TextAreaField(u'Contraintes', [validators.Length(max=100)], filters=[strip_filter], description=u"Entrez ici ce que vous n'aimez pas, " + u"Cela ne consititue pas pour vous un allérgène, " + u"mais vous n'aimez simplement pas. (Gluten / Laitage etc ...)" ) class DateStartConfidenceForm(MyBaseForm): ConfidenceLevel = [ ("0", u"exactement à"), ("1", u"approximativement à"), ("2", u"à peu près (5 à 15 min) vers"), ("3", u"à une vache près (1h) vers") ] DayChoice = [("4", "Jeudi"), ("5", "Vendredi"), ("6", "Samedi"), ("0", "Dimanche"), ("1", "Lundi")] Day = SelectField(u'Jour', choices=DayChoice) Confidence = SelectField(u'Confiance', choices=ConfidenceLevel) Hour = StringField(u'Heure', [validators.Length(max=5, message=u"doit faire au maximum 5 caractères"), validators.Regexp("\d+:\d+", message=u"doit être sous la forme HH:MM")], filters=[strip_filter]) start_time = HiddenField() class ItineraireForm(Form): start_place = SelectField(u'En partant de', coerce=int) arrival_place = SelectField(u'et à destination de', coerce=int) itin_id = HiddenField() class AddItineraireForm(Form): itin = FormField(ItineraireForm) distance = DecimalField(u'Distance', [validators.Length(min=1, max=4)], filters=[strip_filter]) duration = DateTimeField(u'Durée', [validators.Length(min=4, max=5)], filters=[strip_filter]) price = DecimalField(u'Prix approx.', [validators.Length(min=1, max=5)], filters=[strip_filter]) tr_pied = BooleanField(u'à pied') tr_velo = BooleanField(u'à vélo') tr_moto = BooleanField(u'à moto') tr_voiture = BooleanField(u'en voiture') tr_taxi = BooleanField(u'en taxi') tr_bus = BooleanField(u'en bus') tr_avion = BooleanField(u'en avion') description = TextAreaField(u'Description de l\'itinéraire') class AddMember(MyBaseForm): tiers_uid = HiddenField() nom = StringField(u'Nom', [validators.Length(max=80)], filters=[strip_filter], description=u"Les espaces sont autorisés, la ponctuation n'est " + u"pas autorisée à l'exception des points, traits d'union, " + u"apostrophes et tirets bas." ) prenom = StringField(u'Prénom', [validators.Length(max=80)], filters=[strip_filter], description=u"Les espaces sont autorisés, la ponctuation n'est " + u"pas autorisée à l'exception des points, traits d'union, " + u"apostrophes et tirets bas." ) email = StringField(u'Email', [validators.required(), validators.length(max=10), validators.Email(message='Ceci ne ressemble pas à une adresse valide')], description=u"Afin d'éviter la duplication d'information et les doublons inutile, " + u"pensez d'abord à lui demander de confirmer le mail qu'il a utilisé lors de " + u"son inscription sur le site.") add = SubmitField('Ajouter des membres') class TiersForm(MyBaseForm): name = StringField(u'Nom', [validators.Length(max=100)], filters=[strip_filter], description=u"Les espaces sont autorisés, la ponctuation n'est " + u"pas autorisée à l'exception des points, traits d'union, " + u"apostrophes et tirets bas." ) tiers_type = MySelectField('Nature', coerce=int) website = StringField(u'Site web', [validators.optional(), validators.URL(), validators.Length(max=100)], filters=[strip_filter], description="Renseignez ici le site Web." ) description = TextAreaField('Descriptif', [validators.optional(), validators.Length(max=1000000)], filters=[strip_filter], description=u"Vous pouvez insérer les détails" ) membership = FieldList(FormField(TiersMember)) roles = FieldList(FormField(TiersRole)) class UpdateTiersForm(TiersForm): uid = HiddenField() tiers_id = HiddenField() class ExchCateg(MyBaseForm): exch_type = HiddenField() exch_subtype = StringField(u'Catégorie', [validators.Length(max=80)], filters=[strip_filter], description="Le nom de la categorie" ) description = TextAreaField('Description', filters=[strip_filter]) class UpdateExchangeForm(MyBaseForm): exch_id = HiddenField() class AskCForm(ItineraireForm): ConfidenceLevel = [ ("0", u"exactement à"), ("1", u"approximativement à"), ("2", u"à peu près (5 à 15 min) vers"), ("3", u"à une vache près (1h) vers") ] DayChoice = [("4", "Jeudi"), ("5", "Vendredi"), ("6", "Samedi"), ("0", "Dimanche"), ("1", "Lundi")] Day_start = SelectField(u'Jour', choices=DayChoice) Confidence = SelectField(u'Confiance', choices=ConfidenceLevel) Hour_start = StringField(u'Heure', [validators.Length(max=5, message=u"doit faire au maximum 5 caractères"), validators.Regexp("\d+:\d+", message=u"doit être sous la forme HH:MM")], filters=[strip_filter]) start_time = HiddenField() start_place = SelectField(u'En partant de', coerce=int) arrival_place = SelectField(u'et à destination de', coerce=int) itin_id = HiddenField() class AskHForm(MyBaseForm): DayChoice = [("4", u"Jeudi à Vendredi"), ("5", u"Vendredi à Samedi"), ("6", u"Samedi à Dimanche"), ("0", u"Dimanche à Lundi")] Day_start = SelectField(u'Pour la nuit de', choices=DayChoice) start_time = HiddenField() description = TextAreaField(u'Description de vos contraintes éventuelles', filters=[strip_filter], description=u"Décrivez ici vos souhaits et éventuellement " + u"les contraintes à prendre en compte. N'hésitez pas à donner des détails." ) class AskMForm(MyBaseForm): DayChoice = [("4", "Jeudi"), ("5", "Vendredi"), ("6", "Samedi"), ("0", "Dimanche"), ("1", "Lundi")] Day_start = SelectField(u"à partir de", choices=DayChoice) Hour_start = StringField(u'vers', [validators.Length(max=5, message=u"doit faire au maximum 5 caractères"), validators.Regexp("\d+:\d+", message=u"doit être sous la forme HH:MM")], filters=[strip_filter]) start_time = HiddenField() Day_end = SelectField(u"Jusqu'à", choices=DayChoice) Hour_end = StringField(u'vers', [validators.Length(max=5, message=u"doit faire au maximum 5 caractères"), validators.Regexp("\d+:\d+", message=u"doit être sous la forme HH:MM")], filters=[strip_filter]) end_time = HiddenField() exch_categ = SelectField(u'Catégorie de matériel', coerce=int, description=u"Choisissez une catégorie de bien" ) description = TextAreaField(u'Description du bien', filters=[strip_filter], description=u"Décrivez ici les biens que vous souhaitez" + u"échanger. N'hésitez pas à donner des détails." ) class PropCForm(ItineraireForm): ConfidenceLevel = [ ("0", u"exactement à"), ("1", u"approximativement à"), ("2", u"à peu près (5 à 15 min) vers"), ("3", u"à une vache près (1h) vers") ] DayChoice = [("4", "Jeudi"), ("5", "Vendredi"), ("6", "Samedi"), ("0", "Dimanche"), ("1", "Lundi")] Day_start = SelectField(u'Jour', choices=DayChoice) Confidence = SelectField(u'Confiance', choices=ConfidenceLevel) Hour_start = StringField(u'Heure', [validators.Length(max=5, message=u"doit faire au maximum 5 caractères"), validators.Regexp("\d+:\d+", message=u"doit être sous la forme HH:MM")], filters=[strip_filter]) start_time = HiddenField() start_place = SelectField(u'En partant de', coerce=int) arrival_place = SelectField(u'et à destination de', coerce=int) itin_id = HiddenField() class PropHForm(MyBaseForm): DayChoice = [("4", u"Jeudi à Vendredi"), ("5", u"Vendredi à Samedi"), ("6", u"Samedi à Dimanche"), ("0", u"Dimanche à Lundi")] Day_start = SelectField(u'Pour la nuit de', choices=DayChoice) start_time = HiddenField() exch_categ = SelectField(u'Type de couchage', coerce=int, description=u"Indiquez ici le type de couchage proposé") description = TextAreaField(u'Quelques mots autour du logement que vous proposez', filters=[strip_filter], description=u"Décrivez ici quelques détails sur le logement que vous souhaitez " + u"proposer, les contraintes à prendre en compte. N'hésitez pas à donner des détails." ) place_id = SelectField(u'Emplacement', coerce=int, description=u"Indiquez ici une des adresses que vous avez proposé") class PropMForm(MyBaseForm): DayChoice = [("4", "Jeudi"), ("5", "Vendredi"), ("6", "Samedi"), ("0", "Dimanche"), ("1", "Lundi")] Day_start = SelectField(u"à partir de", choices=DayChoice) Hour_start = StringField(u'vers', [validators.Length(max=5, message=u"doit faire au maximum 5 caractères"), validators.Regexp("\d+:\d+", message=u"doit être sous la forme HH:MM")], filters=[strip_filter]) start_time = HiddenField() Day_end = SelectField(u"Jusqu'a ", choices=DayChoice) Hour_end = StringField(u'vers', [validators.Length(max=5, message=u"doit faire au maximum 5 caractères"), validators.Regexp("\d+:\d+", message=u"doit être sous la forme HH:MM")], filters=[strip_filter]) end_time = HiddenField() exch_categ = SelectField( u'Catégorie de matériel', coerce=int, description=u"Choisissez une catégorie de bien matériel" ) description = TextAreaField( u'Ajoutez quelques mots autour du matériel que vous proposez', filters=[strip_filter], description=u"Décrivez ici quelques détails sur le matériel " u"que vous souhaitez proposer. N'hésitez pas à donner des détails." ) class UpdateAskCForm(AskCForm, UpdateExchangeForm): pass class UpdateAskHForm(AskHForm, UpdateExchangeForm): pass class UpdateAskMForm(AskMForm, UpdateExchangeForm): pass class UpdatePropCForm(PropCForm, UpdateExchangeForm): pass class UpdatePropHForm(PropHForm, UpdateExchangeForm): pass class UpdatePropMForm(PropMForm, UpdateExchangeForm): pass