From 1f98d945110b7cd467811e784eead280edcdee9e Mon Sep 17 00:00:00 2001 From: Alexander Sulfrian Date: Sun, 10 Jan 2016 15:33:52 +0100 Subject: One URL for public/member group view. The group is now always reachable with a consistent URL regardless of membership of the current_user. If the user is no member the public view is rendered with the possibility to join the group. --- .../2016-01-10_1a81cf0e0862_initial_migration.py | 4 +- models.py | 4 +- templates/all.html | 22 ---------- templates/browse.html | 22 ++++++++++ templates/group.html | 12 ++++-- templates/group_delete.html | 2 +- templates/index.html | 2 +- views.py | 49 ++++++++-------------- 8 files changed, 54 insertions(+), 63 deletions(-) delete mode 100644 templates/all.html create mode 100644 templates/browse.html diff --git a/migrations/versions/2016-01-10_1a81cf0e0862_initial_migration.py b/migrations/versions/2016-01-10_1a81cf0e0862_initial_migration.py index 4ee4051..c6439df 100644 --- a/migrations/versions/2016-01-10_1a81cf0e0862_initial_migration.py +++ b/migrations/versions/2016-01-10_1a81cf0e0862_initial_migration.py @@ -21,7 +21,7 @@ def upgrade(): sa.Column('id', sa.Integer(), nullable=False), sa.Column('name', sa.String(length=255), nullable=False), sa.Column('email', sa.String(length=255), nullable=False), - sa.Column('last_login', sa.DateTime(timezone=True), server_default='CURRENT_TIMESTAMP', nullable=False), + sa.Column('last_login', sa.DateTime(timezone=True), nullable=False), sa.Column('active', sa.Boolean(), server_default='1', nullable=False), sa.Column('admin', sa.Boolean(), server_default='0', nullable=False), sa.PrimaryKeyConstraint('id'), @@ -42,7 +42,7 @@ def upgrade(): sa.Column('id', sa.Integer(), nullable=False), sa.Column('name', sa.String(length=255), nullable=False), sa.Column('group_id', sa.Integer(), nullable=False), - sa.Column('created', sa.DateTime(timezone=True), server_default='CURRENT_TIMESTAMP', nullable=False), + sa.Column('created', sa.DateTime(timezone=True), nullable=False), sa.Column('public', sa.Boolean(), server_default='0', nullable=False), sa.Column('password', sa.String(length=255), nullable=True), sa.ForeignKeyConstraint(['group_id'], ['groups.id'], ), diff --git a/models.py b/models.py index 564c27c..252cb20 100644 --- a/models.py +++ b/models.py @@ -30,7 +30,7 @@ class User(UserMixin, APIMixin, SessionMixin, db.Model): id = column(db.Integer, primary_key=True) name = column(db.String(255), unique=True) email = column(db.String(255)) - last_login = column(db.DateTime(timezone=True), server_default=func.now()) + last_login = column(db.DateTime(timezone=True), default=func.now()) active = column(db.Boolean, default=True, server_default=expression.true()) admin = column(db.Boolean, default=False, @@ -148,7 +148,7 @@ class Pad(APIMixin, SessionMixin, db.Model): id = column(db.Integer, primary_key=True) name = column(db.String(255)) group_id = column(db.Integer, db.ForeignKey('groups.id')) - created = column(db.DateTime(timezone=True), server_default=func.now()) + created = column(db.DateTime(timezone=True), default=func.now()) public = column(db.Boolean, default=False, server_default=expression.false()) password = column(db.String(255), default='', diff --git a/templates/all.html b/templates/all.html deleted file mode 100644 index 128c115..0000000 --- a/templates/all.html +++ /dev/null @@ -1,22 +0,0 @@ -{% extends "layout.html" %} -{% from "_pagination.html" import render_pagination %} - -{% block head %}Public groups{% endblock %} - -{% block content %} -
-
-

Public groups

-
- -
- {% for group in groups %} - {{group}} - {% endfor %} -
- - -
-{% endblock %} diff --git a/templates/browse.html b/templates/browse.html new file mode 100644 index 0000000..34bd10d --- /dev/null +++ b/templates/browse.html @@ -0,0 +1,22 @@ +{% extends "layout.html" %} +{% from "_pagination.html" import render_pagination %} + +{% block head %}Public groups{% endblock %} + +{% block content %} +
+
+

Public groups

+
+ +
+ {% for group in groups %} + {{group}} + {% endfor %} +
+ + +
+{% endblock %} diff --git a/templates/group.html b/templates/group.html index 38e078f..1d3205c 100644 --- a/templates/group.html +++ b/templates/group.html @@ -24,7 +24,7 @@ {% endif %} -{% if not public_view %} +{% if membership.active %}
{% endif %} diff --git a/templates/group_delete.html b/templates/group_delete.html index 543c0f9..951b640 100644 --- a/templates/group_delete.html +++ b/templates/group_delete.html @@ -16,7 +16,7 @@

Are you sure you want to delete the group {{group}}?

- +

This will permanently delete all pads of this group and all information about the group members. diff --git a/templates/index.html b/templates/index.html index f79fb68..11105e0 100644 --- a/templates/index.html +++ b/templates/index.html @@ -16,7 +16,7 @@

diff --git a/views.py b/views.py index 9117146..457be01 100644 --- a/views.py +++ b/views.py @@ -73,13 +73,12 @@ def index(): return dict(groups=groups, create_form=form) -@app.route('/_all/', defaults={'page': 1}) -@app.route('/_all/_page/') +@app.route('/_browse/', defaults={'page': 1}) +@app.route('/_browse/') @templated() @login_required -def all(page): +def browse(page): public_groups = Group.query.filter( - ~Group.members.any(Member.user == current_user), Group.browsable == True, ) @@ -90,28 +89,6 @@ def all(page): 'breadcrumbs': [{'text': 'Public groups'}]} -@app.route('/_all//', methods=['GET', 'POST']) -@templated('group.html') -@login_required -def public_group(group_name): - group = Group.query.filter( - ~Group.members.any(Member.user == current_user), - Group.name == group_name, - Group.browsable == True, - ).first_or_404() - - if request.method == 'POST': - Member.create(user=current_user, group=group) - db.session.commit() - return redirect(url_for('all')) - - return {'group': group, - 'public_view': True, - 'breadcrumbs': [ - {'text': 'Public groups', 'href': url_for('all')}, - {'text': group}]} - - @app.route('//_delete/', methods=['GET', 'POST']) @templated() @login_required @@ -337,7 +314,7 @@ def pad(group_name, pad_name): 'host': 'https://%s' % urlparse(request.url).hostname} -@app.route('//') +@app.route('//', methods=['GET', 'POST']) @templated() @login_required def group(group_name): @@ -345,14 +322,22 @@ def group(group_name): Group.name == group_name, ).first_or_404() - member = Member.query.filter( + membership = Member.query.filter( Member.user == current_user, Member.group == group, - Member.active == True, - ).first_or_404() + ).first() + + if membership is None and request.method == 'POST': + membership = Member.create(user=current_user, group=group) + db.session.commit() + + breadcrumbs = [{'text': group}] + if group.browsable and (membership is None or not membership.active): + breadcrumbs.insert(0, {'text': 'Public groups', + 'href': url_for('browse')}) return {'group': group, + 'membership': membership, 'pads': group.pads, - 'admin': member.admin, 'members': group.members, - 'breadcrumbs': [{'text': group}]} + 'breadcrumbs': breadcrumbs} -- cgit v1.2.3-1-g7c22