diff options
Diffstat (limited to 'accounts/forms.py')
-rw-r--r-- | accounts/forms.py | 140 |
1 files changed, 140 insertions, 0 deletions
diff --git a/accounts/forms.py b/accounts/forms.py new file mode 100644 index 0000000..deaffa8 --- /dev/null +++ b/accounts/forms.py @@ -0,0 +1,140 @@ +# -*- coding: utf-8 -*- +from account import SERVICES, NoSuchUserError +from flask import g, current_app, session, Markup +from flask.ext.wtf import Form +from wtforms import TextField, PasswordField, ValidationError, BooleanField,\ + validators +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'<a href="%s">Weitere Informationen</a>' % 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'<a href="%s">Passwort-vergessen-Funktion</a> 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)) |