summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--app.py20
-rw-r--r--static/bootstrap-form.css67
-rw-r--r--templates/_macros.html17
-rw-r--r--templates/base.html6
-rw-r--r--templates/index.html10
-rw-r--r--templates/register.html13
-rw-r--r--templates/register_complete.html24
-rw-r--r--templates/settings.html21
-rw-r--r--utils.py14
9 files changed, 141 insertions, 51 deletions
diff --git a/app.py b/app.py
index e07c853..f1f9ef1 100644
--- a/app.py
+++ b/app.py
@@ -16,10 +16,12 @@ app.config.from_object('default_settings')
if 'SPLINE_ACCOUNT_WEB_SETTINGS' in os.environ:
app.config.from_envvar('SPLINE_ACCOUNT_WEB_SETTINGS')
+app.all_services = account.SERVICES #TODO: take that from our json file or so
+
@app.before_request
def ldap_connect():
g.ldap = account.AccountService(account.LDAP_HOST, account.LDAP_BASE_DN,
- account.LDAP_ADMIN_USER, account.LDAP_ADMIN_PASS, account.SERVICES)
+ account.LDAP_ADMIN_USER, account.LDAP_ADMIN_PASS, app.all_services)
g.user = None
@@ -47,7 +49,9 @@ def index():
@app.route('/register', methods=['GET', 'POST'])
@templated('register.html')
+@logout_required
def register():
+ #TODO: check for double uids
form = RegisterForm(request.form)
if request.method == 'POST' and form.validate():
username = form.username.data
@@ -73,7 +77,9 @@ def register():
@app.route('/register/<token>', methods=['GET', 'POST'])
@templated('register_complete.html')
+@logout_required
def register_complete(token):
+ #TODO: check for double uids
username, mail = http_verify_confirmation('register', token.encode('ascii'), timeout=3*24*60*60)
@@ -135,10 +141,17 @@ def settings():
else:
flash(u'Nichts geändert')
- return {'form': form}
-@login_required
+ # (name, changed)
+ services = [(name, name in g.user.services) for name in app.all_services]
+
+ return {
+ 'form': form,
+ 'services': services,
+ }
+
@app.route('/settings/change_mail/<token>')
+@login_required
def change_mail(token):
username, mail = http_verify_confirmation('change_mail', token.encode('ascii'), timeout=3*24*60*60)
@@ -154,6 +167,7 @@ def change_mail(token):
@app.route('/logout')
def logout():
logout_user()
+ flash(u'Erfolgreich ausgeloggt.', 'success')
return redirect(url_for('index'))
diff --git a/static/bootstrap-form.css b/static/bootstrap-form.css
new file mode 100644
index 0000000..8c84910
--- /dev/null
+++ b/static/bootstrap-form.css
@@ -0,0 +1,67 @@
+/*!
+ * based on
+ * Bootstrap v2.1.1
+ *
+ * Copyright 2012 Twitter, Inc
+ * Licensed under the Apache License v2.0
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Designed and built with all the love in the world @twitter by @mdo and @fat.
+ */
+
+
+.form-horizontal .control-label,
+.form-horizontal label {
+ float: left;
+ width: 10em;
+ text-align: right;
+}
+
+.form-horizontal input,
+.form-horizontal textarea,
+.form-horizontal select {
+ display: inline-block;
+ *display: inline;
+ /* IE7 inline-block hack */
+
+ *zoom: 1;
+ margin-bottom: 0;
+ vertical-align: middle;
+}
+.control-group {
+ margin-bottom: .4em;
+}
+.form-horizontal .control-group:before,
+.form-horizontal .control-group:after {
+ display: table;
+ content: "";
+ line-height: 0;
+}
+.form-horizontal .control-group:after {
+ clear: both;
+}
+.form-horizontal .control-label {
+ float: left;
+ width: 10em;
+ text-align: right;
+}
+.form-horizontal .controls {
+ *display: inline-block;
+ *padding-left: 20px;
+ margin-left: 11em;
+ *margin-left: 0;
+}
+.form-horizontal .controls:first-child {
+ *padding-left: 11em;
+}
+.form-horizontal .help-block {
+ margin-bottom: 0;
+}
+.form-horizontal input + .help-block,
+.form-horizontal select + .help-block,
+.form-horizontal textarea + .help-block {
+ margin-top: 10px;
+}
+.form-horizontal .form-actions {
+ padding-left: 11em;
+}
diff --git a/templates/_macros.html b/templates/_macros.html
index 2c933be..8298040 100644
--- a/templates/_macros.html
+++ b/templates/_macros.html
@@ -1,16 +1,19 @@
{% macro render_field(field) %}
- <dt>{{ field.label }}
- <dd>{{ field(**kwargs)|safe }}
- {% if field.errors|length == 1 %}
+<div class="control-group">
+ {{ field.label }}
+ <div class="controls">
+ {{ field(**kwargs)|safe }}
+ {%- if field.errors|length == 1 %}
<div class="errors">
{{ field.errors.0 }}
</div>
- {% elif field.errors %}
+ {% elif field.errors %}
<ul class="errors">
{% for error in field.errors %}
<li>{{ error }}</li>
{% endfor %}
</ul>
- {% endif %}
- </dd>
-{% endmacro %}
+ {% endif %}
+ </div>
+</div>
+{%- endmacro %}
diff --git a/templates/base.html b/templates/base.html
index 1886d12..c3ed80b 100644
--- a/templates/base.html
+++ b/templates/base.html
@@ -1,4 +1,4 @@
-{%- set styles = ['layout.css'] + styles|default([]) %}
+{%- set styles = ['layout.css', 'bootstrap-form.css'] + styles|default([]) %}
{%- set scripts = [] + scripts|default([]) %}
<!doctype html>
<html>
@@ -19,11 +19,13 @@
<h2>{{ title }}</h2>
{% endif %}
+ {%- if not no_login_message %}
{%- if g.user %}
<p>Logged in as {{ g.user.uid }}. <a href="{{ url_for('logout') }}">Log out</a></p>
{%- else %}
<p>Not logged in. <a href="{{ url_for('index') }}">Log in</a></p>
{%- endif %}
+ {%- endif %}
{% with messages = get_flashed_messages(with_categories=true) %}
{% if messages %}
@@ -36,7 +38,5 @@
{% endwith %}
{% block content %}{% endblock %}
-
- <pre>{{ session.__repr__() }}</pre>
</body>
</html>
diff --git a/templates/index.html b/templates/index.html
index 6147883..abcbb1d 100644
--- a/templates/index.html
+++ b/templates/index.html
@@ -6,13 +6,11 @@
<p>Hallo {{ session.username }}. <a href="{{ url_for('settings') }}">Einstellungen</a></p>
{%- else %}
<p><a href="/register">Account erstellen</a></p>
-<form action="{{ url_for('index') }}" method="post">
- <dl>
- {{ render_field(form.username) }}
- {{ render_field(form.password) }}
- </dl>
+<form action="{{ url_for('index') }}" method="post" class="form-horizontal">
+ {{ render_field(form.username) }}
+ {{ render_field(form.password) }}
{{ form.csrf_token }}
- <input type="submit" value="Login" />
+ <div class="form-actions"><input type="submit" value="Login" /></div>
</form>
{%- endif %}
{%- endblock %}
diff --git a/templates/register.html b/templates/register.html
index e04baac..cdd101d 100644
--- a/templates/register.html
+++ b/templates/register.html
@@ -1,14 +1,13 @@
{%- extends 'base.html' %}
{%- from '_macros.html' import render_field %}
{%- set title = 'Account erstellen' %}
+{%- set no_login_message = true %}
{%- block content %}
-<form action="{{ url_for('register') }}" method="post">
- <dl>
- {{ form.errors }}
- {{ render_field(form.username) }}
- {{ render_field(form.mail) }}
- </dl>
+<form action="{{ url_for('register') }}" method="post" class="form-horizontal">
+ {{ form.errors }}
+ {{ render_field(form.username) }}
+ {{ render_field(form.mail) }}
{{ form.csrf_token }}
- <input type="submit" value="E-Mail-Adresse bestätigen" />
+ <div class="form-actions"><input type="submit" value="E-Mail-Adresse bestätigen" /></div>
</form>
{%- endblock %}
diff --git a/templates/register_complete.html b/templates/register_complete.html
index f44e43a..9320995 100644
--- a/templates/register_complete.html
+++ b/templates/register_complete.html
@@ -1,21 +1,25 @@
{%- extends 'base.html' %}
{%- from '_macros.html' import render_field %}
{%- set title = 'Account erstellen' %}
+{%- set no_login_message = true %}
{%- block content %}
-<form action="{{ url_for('register_complete', token=token) }}" method="post">
+<form action="{{ url_for('register_complete', token=token) }}" method="post" class="form-horizontal">
<p>
Deine E-Mail-Adresse wurde erfolgreich bestätigt.
Bitte setze nun ein Passwort, um die Registrierung abzuschließen.
</p>
- <dl>
- <dt>Benutzername</dt>
- <dd><input readonly="readonly" value="{{ username }}" /></dd>
- <dt>E-Mail-Adresse</dt>
- <dd><input readonly="readonly" value="{{ mail }}" /></dd>
- {{ render_field(form.password) }}
- {{ render_field(form.password_confirm) }}
- </dl>
+ <p><strong>Achtung:</strong> Bitte fürs erste keine wertvollen Passwörter verwenden, das ist noch alpha!</p>
+ <div class="control-group">
+ <div class="control-label">Benutzername</div>
+ <div class="controls"><input readonly="readonly" value="{{ username }}" /></div>
+ </div>
+ <div class="control-group">
+ <div class="control-label">E-Mail-Adresse</div>
+ <div class="controls"><input readonly="readonly" value="{{ mail }}" /></div>
+ </div>
+ {{ render_field(form.password) }}
+ {{ render_field(form.password_confirm) }}
{{ form.csrf_token }}
- <input type="submit" value="Registrieren" />
+ <div class="form-actions"><input type="submit" value="Registrieren" /></div>
</form>
{%- endblock %}
diff --git a/templates/settings.html b/templates/settings.html
index 29391b2..13d63f4 100644
--- a/templates/settings.html
+++ b/templates/settings.html
@@ -2,24 +2,21 @@
{%- from '_macros.html' import render_field %}
{%- set title = 'Einstellungen' %}
{%- block content %}
-<form action="{{ url_for('settings') }}" method="post">
+<form action="{{ url_for('settings') }}" method="post" class="form-horizontal">
<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>
+ {{ render_field(form.old_password) }}
+ {{ render_field(form.mail) }}
+ {{ render_field(form.password) }}
+ {{ render_field(form.password_confirm) }}
{{ form.csrf_token }}
- <input type="submit" value="Speichern" />
+ <div class="form-actions"><input type="submit" value="Speichern" /></div>
<h2>Dienste verwalten</h2>
<ul>
- {%- for service in services %}
+ {%- for service, changed in services %}
<li>
- <strong>{{ service.name }}</strong>
- {%- if service.own_password %}
+ <strong>{{ service }}</strong>
+ {%- if changed %}
ändern, löschen
{%- else %}
setzen
diff --git a/utils.py b/utils.py
index a20b034..6f81da8 100644
--- a/utils.py
+++ b/utils.py
@@ -41,10 +41,18 @@ def login_required(f):
@wraps(f)
def login_required_(*args, **kwargs):
if not g.user:
- raise Forbidden
+ raise Forbidden(u'Bitte einloggen!')
return f(*args, **kwargs)
return login_required_
+def logout_required(f):
+ @wraps(f)
+ def logout_required_(*args, **kwargs):
+ if g.user:
+ raise Forbidden(u'Diese Seite ist nur für nicht eingeloggte Benutzer gedacht!')
+ return f(*args, **kwargs)
+ return logout_required_
+
def login_user(username, password):
try:
@@ -140,9 +148,9 @@ def http_verify_confirmation(*args, **kwargs):
try:
return verify_confirmation(*args, **kwargs)
except ConfirmationInvalid:
- raise Forbidden(u'Ungültiger Bestätigungslink')
+ raise Forbidden(u'Ungültiger Bestätigungslink.')
except ConfirmationTimeout:
- raise Forbidden(u'Bestätigungslink ist zu alt')
+ raise Forbidden(u'Bestätigungslink ist zu alt.')
def send_mail(recipient, subject, body, sender=None):