summaryrefslogtreecommitdiffstats
path: root/accounts/forms.py
diff options
context:
space:
mode:
Diffstat (limited to 'accounts/forms.py')
-rw-r--r--accounts/forms.py140
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))