summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarian Sigler <m@qjym.de>2012-09-21 01:00:39 +0200
committerMarian Sigler <m@qjym.de>2012-09-21 01:00:39 +0200
commit6280e6f19e5aea3c2fff7e95e053c1ba63f5c22f (patch)
treeb601699a7c56c86829ac9a4f2ef88d95c3c797b0
parent597db4fa95aab501de422f410c46a91bc6c6bbbd (diff)
downloadweb-6280e6f19e5aea3c2fff7e95e053c1ba63f5c22f.tar.gz
web-6280e6f19e5aea3c2fff7e95e053c1ba63f5c22f.tar.bz2
web-6280e6f19e5aea3c2fff7e95e053c1ba63f5c22f.zip
start with settings page
-rw-r--r--app.py12
-rw-r--r--forms.py10
-rw-r--r--templates/settings.html28
-rw-r--r--utils.py27
4 files changed, 62 insertions, 15 deletions
diff --git a/app.py b/app.py
index 46e3729..46ca682 100644
--- a/app.py
+++ b/app.py
@@ -6,7 +6,7 @@ flaskext_compat.activate()
import os
from flask import Flask, request, redirect, url_for, flash, session
from utils import templated, login_required, encrypt_password, decrypt_password, login_user, logout_user
-from forms import RegisterForm, LoginForm
+from forms import RegisterForm, LoginForm, SettingsForm
app = Flask(__name__)
@@ -42,11 +42,17 @@ def register():
return {'form': form}
-@app.route('/settings')
+
+@app.route('/settings', methods=['GET', 'POST'])
@templated('settings.html')
@login_required
def settings():
- return {}
+ form = SettingsForm(request.form, mail='mail aus ldap #TODO')
+ if request.method == 'POST' and form.validate():
+ flash(u'Gespeichert. Nicht.')
+ return redirect(url_for('index'))
+
+ return {'form': form}
@app.route('/logout')
diff --git a/forms.py b/forms.py
index 695b075..3d0f9d1 100644
--- a/forms.py
+++ b/forms.py
@@ -2,10 +2,10 @@
from flask.ext.wtf import Form, validators, TextField, PasswordField
username = TextField('Benutzername', [validators.Length(min=4, max=20)])
+mail = TextField('E-Mail-Adresse', [validators.Email(), validators.Length(min=6, max=50)])
class RegisterForm(Form):
username = username
- mail = TextField('E-Mail-Adresse', [validators.Length(min=6, max=50)])
password = PasswordField('Passwort', [validators.Required(),
validators.EqualTo('password_confirm', message=u'Passwörter stimmen nicht überein')])
password_confirm = PasswordField(u'Passwort bestätigen')
@@ -14,3 +14,11 @@ class RegisterForm(Form):
class LoginForm(Form):
username = username
password = PasswordField('Passwort', [validators.Required()])
+
+
+class SettingsForm(Form):
+ old_password = PasswordField('Passwort', [validators.Required()])
+ password = PasswordField('Neues Passwort', [validators.Required(),
+ validators.EqualTo('password_confirm', message=u'Passwörter stimmen nicht überein')])
+ password_confirm = PasswordField(u'Passwort bestätigen')
+ mail = mail
diff --git a/templates/settings.html b/templates/settings.html
new file mode 100644
index 0000000..addd137
--- /dev/null
+++ b/templates/settings.html
@@ -0,0 +1,28 @@
+{%- extends 'base.html' %}
+{%- from '_macros.html' import render_field %}
+{%- set title = 'Account erstellen' %}
+{%- block content %}
+<form action="" method="post">
+ <h2>Globale Einstellungen ändern</h2>
+ <p>
+ <dl>
+ {{ render_field(form.old_password) }}
+ {{ render_field(form.mail) }}
+ {{ render_field(form.password) }}
+ {{ render_field(form.password_confirm) }}
+ </dl>
+ {{ form.csrf_token }}
+ <input type="submit" value="Speichern" />
+
+ <h2>Dienste verwalten</h2>
+ <ul>
+ {%- for service in services %}
+ <li>
+ <strong>{{ service.name }}</strong>
+ {%- if service.own_password %}
+ ändern, löschen
+ {%- else %}
+ setzen
+ {%- endif %}
+</form>
+{%- endblock %}
diff --git a/utils.py b/utils.py
index a252d61..39d07de 100644
--- a/utils.py
+++ b/utils.py
@@ -1,15 +1,17 @@
# -*- coding: utf-8 -*-
from functools import wraps
-from flask import request, render_template, session
+from flask import flash, request, redirect, render_template, session, url_for
from random import randint
from Crypto.Cipher import AES
+from werkzeug.exceptions import Forbidden
-# from http://flask.pocoo.org/docs/patterns/viewdecorators/#templating-decorator
+
+# using http://flask.pocoo.org/docs/patterns/viewdecorators/
def templated(template=None):
- def decorator(f):
+ def templated_(f):
@wraps(f)
- def decorated_function(*args, **kwargs):
+ def templated__(*args, **kwargs):
template_name = template
if template_name is None:
template_name = request.endpoint \
@@ -20,8 +22,16 @@ def templated(template=None):
elif not isinstance(ctx, dict):
return ctx
return render_template(template_name, **ctx)
- return decorated_function
- return decorator
+ return templated__
+ return templated_
+
+def login_required(f):
+ @wraps(f)
+ def login_required_(*args, **kwargs):
+ if 'username' not in session:
+ raise Forbidden
+ return f(*args, **kwargs)
+ return login_required_
def login_user(username, password):
@@ -64,10 +74,5 @@ def decrypt_password(ciphertext):
return encryptor.decrypt(ciphertext[16:]).rstrip('\0')
-def login_required(func):
- #TODO
- return func
-
-
# circular import
from app import app