# -*- coding: utf-8 -*- from account import SERVICES, NoSuchUserError from flask import g, current_app, session, Markup from flask.ext.wtf import Form, validators, TextField, PasswordField,\ ValidationError, BooleanField from functools import partial from utils import _username_re, _username_exclude_re, decrypt_password,\ NotRegexp, url_for username = partial(TextField, 'Benutzername', [validators.Regexp(_username_re, message=u'Benutzername darf nur aus a-z und - bestehen (2-16 Zeichen)')]) class RegisterForm(Form): username = TextField('Benutzername', [ validators.Regexp(_username_re, message=u'Benutzername darf nur aus ' u'a-z, Zahlen und - bestehen (2-16 Zeichen, am Anfang nur a-z).'), NotRegexp(_username_exclude_re, message=u'Dieser Benutzername ist nicht erlaubt.'), ]) mail = TextField('E-Mail-Adresse', [validators.Email(), validators.Length(min=6, max=50)]) question = TextField('Hauptstadt von Deutschland?', [validators.AnyOf(('Berlin', 'berlin'), message=u'Bitte beantworte die Frage.')]) def validate_username(form, field): try: g.ldap.get_by_uid(field.data) except NoSuchUserError: if current_app.username_blacklist: if field.data.lower() in current_app.username_blacklist: raise ValidationError(Markup(u'Dieser Benutzername ist momentan nicht erlaubt. ' u'Weitere Informationen' % url_for('about'))) else: raise ValidationError(u'Dieser Benutzername ist schon vergeben.') def validate_mail(form, field): try: g.ldap.get_by_mail(field.data) except NoSuchUserError: pass else: raise ValidationError(Markup(u'Ein Benutzername mit dieser Adresse existiert bereits. ' u'Falls du deinen Benutzernamen vergessen hast, kannst du die ' u'Passwort-vergessen-Funktion benutzen.' % url_for('lost_password'))) class AdminCreateAccountForm(RegisterForm): def validate_username(form, field): try: g.ldap.get_by_uid(field.data) except NoSuchUserError: return else: raise ValidationError(u'Dieser Benutzername ist schon vergeben') question = None class RegisterCompleteForm(Form): password = PasswordField('Passwort', [validators.Required(), validators.EqualTo('password_confirm', message=u'Passwörter stimmen nicht überein')]) password_confirm = PasswordField(u'Passwort bestätigen') # n.b. this form is also used in lost_password_complete class LoginForm(Form): username = TextField(u'Benutzername') password = PasswordField('Passwort', [validators.Required()]) class LostPasswordForm(Form): username_or_mail = TextField(u'Benutzername oder E-Mail') def validate_username_or_mail(form, field): if '@' not in field.data: try: form.user = g.ldap.get_by_uid(field.data) except NoSuchUserError: raise ValidationError(u'Es gibt keinen Benutzer mit diesem Namen.') else: try: form.user = g.ldap.get_by_mail(field.data) except NoSuchUserError: raise ValidationError(u'Es gibt keinen Benutzer mit dieser Adresse.') class SettingsForm(Form): old_password = PasswordField('Altes Passwort') password = PasswordField('Neues Passwort', [validators.Optional(), validators.EqualTo('password_confirm', message=u'Passwörter stimmen nicht überein')]) password_confirm = PasswordField(u'Passwort bestätigen') mail = TextField('E-Mail-Adresse', [validators.Optional(), validators.Email(), validators.Length(min=6, max=50)]) def validate_old_password(form, field): if form.password.data: if not field.data: raise ValidationError(u'Gib bitte dein altes Passwort ein, um ein neues zu setzen.') if field.data != decrypt_password(session['password']): raise ValidationError(u'Altes Passwort ist falsch.') def validate_mail(form, field): results = g.ldap.find_by_mail(field.data) for user in results: if user.uid != g.user.uid: raise ValidationError(u'Diese E-Mail-Adresse wird schon von einem anderen Account benutzt!') def get_servicepassword(self, service_id): return getattr(self, 'password_%s' % service_id) def get_servicepasswordconfirm(self, service_id): return getattr(self, 'password_confirm_%s' % service_id) def get_servicedelete(self, service_id): return getattr(self, 'delete_%s' % service_id) class AdminDisableAccountForm(Form): username = TextField(u'Benutzername') def validate_username(form, field): try: form.user = g.ldap.get_by_uid(field.data) except NoSuchUserError: raise ValidationError(u'Dieser Benutzername existiert nicht') #TODO: find out how we can use app.all_services in that early state for service in SERVICES: setattr(SettingsForm, 'password_%s' % service.id, PasswordField(u'Passwort für %s' % service.name, [ validators.Optional(), validators.EqualTo('password_confirm_%s' % service.id, message=u'Passwörter stimmen nicht überein'), ])) setattr(SettingsForm, 'password_confirm_%s' % service.id, PasswordField(u'Passwort für %s (Bestätigung)' % service.name)) setattr(SettingsForm, 'delete_%s' % service.id, BooleanField(u'Passwort für %s löschen' % service.name))