From ad2becf6f97c08d911ee3c9e555c1ce0b4d01927 Mon Sep 17 00:00:00 2001 From: Fabian Freyer Date: Tue, 4 Apr 2017 15:11:20 +0200 Subject: [PATCH 1/8] admin: implement simple user profiles --- app/user/admin.py | 10 ++++++ app/user/templates/admin/listUsers.html | 2 +- app/user/templates/admin/profile.html | 41 +++++++++++++++++++++++++ 3 files changed, 52 insertions(+), 1 deletion(-) create mode 100644 app/user/templates/admin/profile.html diff --git a/app/user/admin.py b/app/user/admin.py index 3b8db1e..5240dd5 100644 --- a/app/user/admin.py +++ b/app/user/admin.py @@ -30,6 +30,16 @@ def list_users(): users = users ) +@user_blueprint.route('/admin/user/') +@login_required +@groups_required('admin') +def profile(username): + user = User.get(username) + if not user: + flash('Invalid user name!', 'error') + return redirect(url_for('user.list_users')) + return render_template('admin/profile.html', user=user) + @user_blueprint.route('/admin/user//delete', methods=['GET', 'POST']) @login_required @confirm(title='Delete User?', diff --git a/app/user/templates/admin/listUsers.html b/app/user/templates/admin/listUsers.html index 2567855..ceedd53 100644 --- a/app/user/templates/admin/listUsers.html +++ b/app/user/templates/admin/listUsers.html @@ -71,7 +71,7 @@

Users

{% for user in users %} - {{ user.username }} + {{ user.username }} {{ user.full_name }} {{ user.mail }} diff --git a/app/user/templates/admin/profile.html b/app/user/templates/admin/profile.html new file mode 100644 index 0000000..ea025f9 --- /dev/null +++ b/app/user/templates/admin/profile.html @@ -0,0 +1,41 @@ +{% extends "base.html" %} + +{% block title %}{{ user.name }}{% endblock %} + +{% block content %} +
+ + +
+

General information

+
+
+ +

{{ user.firstName }}

+
+
+ +

{{ user.surname }}

+
+
+ + +
+
+
+ +
+

Groups

+
    + {% for group in user.groups %} +
  • +

    {{ group.group_name }}

    +

    {{ group.description }}

    +
  • + {% endfor %} +
+
+
+{% endblock %} From 4f8c95dbbe3becc42b0af89c4f1d033e5caa22d7 Mon Sep 17 00:00:00 2001 From: Fabian Freyer Date: Wed, 5 Apr 2017 20:29:32 +0200 Subject: [PATCH 2/8] Confirmation page: redirect back to referrer by default --- app/templates/confirm.html | 2 +- app/views.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/templates/confirm.html b/app/templates/confirm.html index c2c57b4..38b7b77 100644 --- a/app/templates/confirm.html +++ b/app/templates/confirm.html @@ -12,7 +12,7 @@

{% if data.prompt %}{{ data.prompt }}{% el {{ wtf.form_errors(form) }} {% if data.back %}
- + Back {{ form.submit(class='btn btn-lg btn-primary btn-danger', value=data.action) }} diff --git a/app/views.py b/app/views.py index 87a08b1..b88b04b 100644 --- a/app/views.py +++ b/app/views.py @@ -48,7 +48,7 @@ def f(*args, **kwargs): data={ 'title': title, 'action': action, - 'back': back, + 'back': url_for(back) if back else get_redirect_target(), 'prompt': prompt, 'text': text }) From 7eb94b4ef61127e63c068ad3ff1ca6e7b3f55d68 Mon Sep 17 00:00:00 2001 From: Fabian Freyer Date: Wed, 5 Apr 2017 20:39:42 +0200 Subject: [PATCH 3/8] Groups: Implement administrative join/leave views --- app/user/admin.py | 36 +++++++++++++++++++++++++-- app/user/templates/admin/profile.html | 23 +++++++++++++++-- 2 files changed, 55 insertions(+), 4 deletions(-) diff --git a/app/user/admin.py b/app/user/admin.py index 5240dd5..8f1eb7d 100644 --- a/app/user/admin.py +++ b/app/user/admin.py @@ -6,7 +6,8 @@ from wtforms.fields.html5 import EmailField from app.views import confirm, is_safe_url from . import groups_required, user_blueprint -from .models import User +from .models import User, Group +from ldap3.core.exceptions import LDAPAttributeOrValueExistsResult class UserEditForm(FlaskForm): username = StringField('Username') @@ -38,7 +39,8 @@ def profile(username): if not user: flash('Invalid user name!', 'error') return redirect(url_for('user.list_users')) - return render_template('admin/profile.html', user=user) + all_groups = Group.query() + return render_template('admin/profile.html', user=user, groups=all_groups) @user_blueprint.route('/admin/user//delete', methods=['GET', 'POST']) @login_required @@ -99,3 +101,33 @@ def edit_user(username, back_url = None): form = form, user = user ) + +@user_blueprint.route('/admin/user//join/') +@login_required +@groups_required('admin') +def join(username, group_name): + try: + group = Group.get(group_name) + if not group: + raise AttributeError("group does not exist") + group.join(User.get(username)) + group.save() + except LDAPAttributeOrValueExistsResult: + flash("{} is already a member of {}".format(username, group_name)) + except AttributeError: + abort(404) + return redirect(url_for('user.profile', username=username)) + +@user_blueprint.route('/admin/user//leave/', methods=['GET', 'POST']) +@login_required +@groups_required('admin') +@confirm(title='Leave group?', + prompt='Are you sure you want to remove this user from the group?', + action='Remove') +def leave(username, group_name): + group = Group.get(group_name) + if not group: + raise AttributeError("group does not exist") + group.leave(User.get(username)) + group.save() + return redirect(url_for('user.profile', username=username)) diff --git a/app/user/templates/admin/profile.html b/app/user/templates/admin/profile.html index ea025f9..d24cce3 100644 --- a/app/user/templates/admin/profile.html +++ b/app/user/templates/admin/profile.html @@ -27,11 +27,30 @@

{{ user.full_name }} {{ user.username }}

-

Groups

+
+

+ Groups +
+ + +
+

+
    {% for group in user.groups %}
  • -

    {{ group.group_name }}

    +

    {{ group.group_name }} + + + Leave +

    {{ group.description }}

  • {% endfor %} From 3a6ce858334b4166ada807b57cbe86311986dcfa Mon Sep 17 00:00:00 2001 From: Fabian Freyer Date: Wed, 5 Apr 2017 20:40:16 +0200 Subject: [PATCH 4/8] Fix docstring from Group.delete --- app/user/models.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/user/models.py b/app/user/models.py index d883646..d1e2ba7 100644 --- a/app/user/models.py +++ b/app/user/models.py @@ -46,7 +46,7 @@ def create(username, givenName, surname, password, mail = None): def delete(self): """ - Remove a user. + Delete a group. """ for group in self.groups: group.leave(self) From e3b9514bd6bde1eecbfd9a156b81270fa8213334 Mon Sep 17 00:00:00 2001 From: Fabian Freyer Date: Wed, 5 Apr 2017 22:00:07 +0200 Subject: [PATCH 5/8] Group: Add group profile page --- app/user/admin.py | 11 +++++++ app/user/templates/admin/group.html | 41 +++++++++++++++++++++++++++ app/user/templates/admin/profile.html | 9 ++++-- 3 files changed, 59 insertions(+), 2 deletions(-) create mode 100644 app/user/templates/admin/group.html diff --git a/app/user/admin.py b/app/user/admin.py index 8f1eb7d..a69670f 100644 --- a/app/user/admin.py +++ b/app/user/admin.py @@ -131,3 +131,14 @@ def leave(username, group_name): group.leave(User.get(username)) group.save() return redirect(url_for('user.profile', username=username)) + +@user_blueprint.route('/admin/group/') +@login_required +@groups_required('admin') +def group_page(group_name): + group = Group.get(group_name) + if not group: + flash('Invalid group name!', 'error') + # FIXME: list_groups + return redirect(url_for('user.list_users')) + return render_template('admin/group.html', group=group) diff --git a/app/user/templates/admin/group.html b/app/user/templates/admin/group.html new file mode 100644 index 0000000..c9963d3 --- /dev/null +++ b/app/user/templates/admin/group.html @@ -0,0 +1,41 @@ +{% extends "base.html" %} + +{% block title %}{{ group.group_name }}{% endblock %} + +{% block content %} +
    + + +
    +

    General information

    +
    +
    + +

    {{ group.dn }}

    +
    +
    +
    + +
    +
    +

    Members

    +
    + +
    +
    +{% endblock %} diff --git a/app/user/templates/admin/profile.html b/app/user/templates/admin/profile.html index d24cce3..979eb5f 100644 --- a/app/user/templates/admin/profile.html +++ b/app/user/templates/admin/profile.html @@ -21,7 +21,11 @@

    {{ user.full_name }} {{ user.username }}

- + +
+
+ +

{{ user.dn }}

@@ -45,7 +49,8 @@