from flask_wtf import FlaskForm from wtforms import StringField, PasswordField, BooleanField, TextAreaField, SubmitField, DecimalField, SelectField, RadioField from wtforms.fields.html5 import DateField, EmailField from wtforms.validators import InputRequired, Optional, Email, EqualTo from flask_wtf.file import FileField # Cuz' wtforms' FileField is shitty import app.utils.validators as vd class RegistrationForm(FlaskForm): username = StringField( 'Pseudonyme', description='Ce nom est définitif !', validators=[ InputRequired(), vd.name.valid, vd.name.available, ], ) email = EmailField( 'Adresse Email', validators=[ InputRequired(), Email(message="Adresse email invalide."), vd.email, ], ) password = PasswordField( 'Mot de passe', validators=[ InputRequired(), vd.password.is_strong, ], ) password2 = PasswordField( 'Répéter le mot de passe', validators=[ InputRequired(), EqualTo('password', message="Les mots de passe doivent être identiques."), ], ) guidelines = BooleanField( """J'accepte les CGU""", validators=[ InputRequired(), ], ) newsletter = BooleanField( 'Inscription à la newsletter', description='Un mail par trimestre environ, pour être prévenu des concours, évènements et nouveautés.', ) submit = SubmitField( "S'inscrire", ) class UpdateAccountForm(FlaskForm): avatar = FileField( 'Avatar', validators=[ Optional(), vd.file.is_image, vd.file.avatar_size, ], ) email = EmailField( 'Adresse email', validators=[ Optional(), Email(message="Addresse email invalide."), vd.email, vd.password.old_password, ], ) password = PasswordField( 'Nouveau mot de passe', validators=[ Optional(), vd.password.is_strong, vd.password.old_password, ], ) password2 = PasswordField( 'Répéter le mot de passe', validators=[ Optional(), EqualTo('password', message="Les mots de passe doivent être identiques."), ], ) old_password = PasswordField( 'Mot de passe actuel', validators=[ Optional(), ], ) birthday = DateField( 'Anniversaire', validators=[ Optional(), ], ) signature = TextAreaField( 'Signature', validators=[ Optional(), ] ) biography = TextAreaField( 'Présentation', validators=[ Optional(), ] ) title = SelectField( 'Titre', coerce=int, validators=[ Optional(), vd.own_title, ] ) newsletter = BooleanField( 'Inscription à la newsletter', description='Un mail par trimestre environ, pour être prévenu des concours, évènements et nouveautés.', ) theme = RadioField( 'Thème du site', choices=[ ('default_theme', 'Thème par défaut (clair)'), ('FK_dark_theme', 'Thème sombre de FlamingKite'), ], ) submit = SubmitField('Mettre à jour') class DeleteAccountBaseForm(FlaskForm): transfer = BooleanField( 'Conserver les posts sous forme anonyme', description="Aucune information personnelle n'est conservée ; seul le texte de posts reste. Cela permet de garder un historique fidèle des échanges.", default=True ) delete = BooleanField( 'Confirmer la suppression', validators=[ InputRequired(), ], description='Attention, cette opération est irréversible !' ) submit = SubmitField( 'Supprimer le compte', ) class DeleteAccountForm(DeleteAccountBaseForm): old_password = PasswordField( 'Mot de passe', validators=[ InputRequired(), vd.password.old_password, ], ) class AskResetPasswordForm(FlaskForm): email = EmailField( 'Adresse email', validators=[ Optional(), Email(message="Addresse email invalide."), ], ) submit = SubmitField('Valider') class ResetPasswordForm(FlaskForm): password = PasswordField( 'Mot de passe', validators=[ Optional(), vd.password.is_strong, ], ) password2 = PasswordField( 'Répéter le mot de passe', validators=[ Optional(), EqualTo('password', message="Les mots de passe doivent être identiques."), ], ) submit = SubmitField('Valider') class AdminUpdateAccountForm(FlaskForm): username = StringField( 'Pseudonyme', validators=[ Optional(), vd.name.valid, vd.name.available, ], ) avatar = FileField( 'Avatar', validators=[ Optional(), vd.file.is_image, vd.file.avatar_size, ], ) email = EmailField( 'Adresse email', validators=[ Optional(), Email(message="Addresse email invalide."), vd.email, ], ) email_confirmed = BooleanField( "Confirmer l'email", description="Si décoché, l'utilisateur devra demander explicitement un email " "de validation, ou faire valider son adresse email par un administrateur.", ) password = PasswordField( 'Mot de passe', description="L'ancien mot de passe ne pourra pas être récupéré !", validators=[ Optional(), vd.password.is_strong, ], ) xp = DecimalField( 'XP', validators=[ Optional(), ] ) birthday = DateField( 'Anniversaire', validators=[ Optional(), ], ) signature = TextAreaField( 'Signature', validators=[ Optional(), ], ) biography = TextAreaField( 'Présentation', validators=[ Optional(), ], ) title = SelectField( 'Titre', coerce=int, validators=[ Optional(), # Admin can set any title to any member! ] ) newsletter = BooleanField( 'Inscription à la newsletter', description='Un mail par trimestre environ, pour être prévenu des concours, évènements et nouveautés.', ) submit = SubmitField( 'Mettre à jour', ) class AdminAccountEditTrophyForm(FlaskForm): # Boolean inputs are generated on-the-fly from trophy list submit = SubmitField( 'Modifier', ) class AdminAccountEditGroupForm(FlaskForm): # Boolean inputs are generated on-the-fly from group list submit = SubmitField( 'Modifier', ) class AdminDeleteAccountForm(DeleteAccountBaseForm): pass