diff options
author | Alexander Sulfrian <alex@spline.inf.fu-berlin.de> | 2014-11-19 02:38:09 +0100 |
---|---|---|
committer | Alexander Sulfrian <alex@spline.inf.fu-berlin.de> | 2014-11-19 02:48:45 +0100 |
commit | dacfc5fe13dc6b46fa90e5ef9fb07509afd5d777 (patch) | |
tree | 105012c6c041d9bc98045846dd82c6ab262875cd | |
parent | 2d04a1bd8efe3c440ecf66a22b3ae138ed8eaabe (diff) | |
download | padlite-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.py | 40 | ||||
-rw-r--r-- | templates/_pagination.html | 27 | ||||
-rw-r--r-- | templates/all.html | 22 | ||||
-rw-r--r-- | templates/index.html | 4 | ||||
-rw-r--r-- | views.py | 14 |
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) }}">«</a></li> + {% else %} + <li class="disabled"><a href="#">«</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) }}">»</a></li> + {% else %} + <li class="disabled"><a href="#">»</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"> @@ -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 |