summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlexander Sulfrian <alex@spline.inf.fu-berlin.de>2014-11-19 02:38:09 +0100
committerAlexander Sulfrian <alex@spline.inf.fu-berlin.de>2014-11-19 02:48:45 +0100
commitdacfc5fe13dc6b46fa90e5ef9fb07509afd5d777 (patch)
tree105012c6c041d9bc98045846dd82c6ab262875cd
parent2d04a1bd8efe3c440ecf66a22b3ae138ed8eaabe (diff)
downloadpadlite-teams-dacfc5fe13dc6b46fa90e5ef9fb07509afd5d777.tar.gz
padlite-teams-dacfc5fe13dc6b46fa90e5ef9fb07509afd5d777.tar.bz2
padlite-teams-dacfc5fe13dc6b46fa90e5ef9fb07509afd5d777.zip
templates/all: add paginated list of all browsable groups
-rw-r--r--pagination.py40
-rw-r--r--templates/_pagination.html27
-rw-r--r--templates/all.html22
-rw-r--r--templates/index.html4
-rw-r--r--views.py14
5 files changed, 107 insertions, 0 deletions
diff --git a/pagination.py b/pagination.py
new file mode 100644
index 0000000..58fb869
--- /dev/null
+++ b/pagination.py
@@ -0,0 +1,40 @@
+from math import ceil
+from app import app
+from flask import url_for, request
+
+class Pagination(object):
+ def __init__(self, page, per_page, total_count):
+ self.page = page
+ self.per_page = per_page
+ self.total_count = total_count
+
+ @property
+ def pages(self):
+ return int(ceil(self.total_count / float(self.per_page)))
+
+ @property
+ def has_prev(self):
+ return self.page > 1
+
+ @property
+ def has_next(self):
+ return self.page < self.pages
+
+ def iter_pages(self, left_edge=2, left_current=2,
+ right_current=5, right_edge=2):
+ last = 0
+ for num in xrange(1, self.pages + 1):
+ if num <= left_edge or \
+ (num > self.page - left_current - 1 and \
+ num < self.page + right_current) or \
+ num > self.pages - right_edge:
+ if last + 1 != num:
+ yield None
+ yield num
+ last = num
+
+def url_for_other_page(page):
+ args = request.view_args.copy()
+ args['page'] = page
+ return url_for(request.endpoint, **args)
+app.jinja_env.globals['url_for_other_page'] = url_for_other_page
diff --git a/templates/_pagination.html b/templates/_pagination.html
new file mode 100644
index 0000000..f53df57
--- /dev/null
+++ b/templates/_pagination.html
@@ -0,0 +1,27 @@
+{% macro render_pagination(pagination) %}
+<ul class="pagination" style="margin-top: 5px; margin-bottom: 0; padding: 0">
+ {% if pagination.has_prev %}
+ <li><a href="{{ url_for_other_page(pagination.page - 1) }}">&laquo;</a></li>
+ {% else %}
+ <li class="disabled"><a href="#">&laquo;</a></li>
+ {% endif %}
+
+ {%- for page in pagination.iter_pages(1, 4, 4, 1) %}
+ {% if page %}
+ {% if page != pagination.page %}
+ <li><a href="{{ url_for_other_page(page) }}">{{ page }}</a></li>
+ {% else %}
+ <li class="active"><a href="#">{{ page }}</a></li>
+ {% endif %}
+ {% else %}
+ <li class="disabled"><a href="#">…</a></li>
+ {% endif %}
+ {%- endfor %}
+
+ {% if pagination.has_next %}
+ <li><a href="{{ url_for_other_page(pagination.page + 1) }}">&raquo;</a></li>
+ {% else %}
+ <li class="disabled"><a href="#">&raquo;</a></li>
+ {% endif %}
+</ul>
+{% endmacro %}
diff --git a/templates/all.html b/templates/all.html
new file mode 100644
index 0000000..d50bf56
--- /dev/null
+++ b/templates/all.html
@@ -0,0 +1,22 @@
+{% extends "layout.html" %}
+{% from "_pagination.html" import render_pagination %}
+
+{% block head %}Public groups{% endblock %}
+
+{% block content %}
+<div class="panel panel-default">
+ <div class="panel-heading">
+ <h3 class="panel-title">Public groups</h3>
+ </div>
+
+ <div class="list-group">
+ {% for group in groups %}
+ <span class="list-group-item">{{group}}</span>
+ {% endfor %}
+ </div>
+
+ <div class="panel-footer text-center">
+ {{ render_pagination(pagination) }}
+ </div>
+</div>
+{% endblock %}
diff --git a/templates/index.html b/templates/index.html
index c6583a1..1c4e612 100644
--- a/templates/index.html
+++ b/templates/index.html
@@ -14,6 +14,10 @@
<a class="list-group-item" href="{{ url_for('group', group_name=group.name) }}">{{group}}</a>
{% endfor %}
</div>
+
+ <div class="panel-footer">
+ <a href="{{ url_for('all') }}">Find public browsable groups</a>
+ </div>
</div>
<div class="panel panel-default">
diff --git a/views.py b/views.py
index f52697c..d36e1ab 100644
--- a/views.py
+++ b/views.py
@@ -5,6 +5,7 @@ from flask_peewee.utils import get_object_or_404
from models import Group, Member
from forms import CreateGroup, DeleteForm, ChangeGroup
from utils import templated
+from pagination import Pagination
from filters import *
def get_group_or_404(*query):
@@ -27,6 +28,19 @@ def index():
return {'groups': groups, 'create_form': form}
+@app.route('/_all/', defaults={'page': 1})
+@app.route('/_all/_page/<int:page>')
+@templated('all.html')
+def all(page):
+ user_groups = Group.select().join(Member).where(Member.user == g.user)
+ public_groups = Group.select().where(~(Group.id << user_groups)).where(Group.browsable == True)
+ count = public_groups.count()
+ return {'groups': public_groups.paginate(page, 10),
+ 'count': count,
+ 'pagination': Pagination(page, 10, count),
+ 'breadcrumbs': [{'text': 'Public groups'}]}
+
+
@app.route('/<group_name>/_delete/', methods=['GET', 'POST'])
@templated('group_delete.html')
@auth.login_required