From 3f8291b7c3e73be526a4cfdc892eac8004850c76 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20Setni=C4=8Dka?= <setnicka@seznam.cz> Date: Sun, 3 Jan 2021 20:48:35 +0100 Subject: [PATCH] =?UTF-8?q?Util:=20Vylep=C5=A1en=C3=BD=20PagerForm?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Ostatní formy z něj mohou dědit. --- mo/web/org_users.py | 24 ++---------------------- mo/web/util.py | 27 +++++++++++++++++++++++++++ 2 files changed, 29 insertions(+), 22 deletions(-) create mode 100644 mo/web/util.py diff --git a/mo/web/org_users.py b/mo/web/org_users.py index 59c7993b..86fcfcb6 100644 --- a/mo/web/org_users.py +++ b/mo/web/org_users.py @@ -4,7 +4,6 @@ import werkzeug.exceptions import wtforms from sqlalchemy import or_ -from typing import Optional from wtforms import validators from wtforms.validators import Required @@ -15,13 +14,7 @@ import mo.rights import mo.util import mo.users from mo.web import app - - -class PagerForm(FlaskForm): - limit = wtforms.IntegerField() - offset = wtforms.IntegerField() - next = wtforms.SubmitField("Další") - previous = wtforms.SubmitField("Předchozí") +from mo.web.util import PagerForm class UsersFilterForm(PagerForm): @@ -104,20 +97,7 @@ def org_users(): q = q.filter(db.User.user_id.in_(participation_filter)) # print(str(q)) - count = q.count() - - if not filter.offset.data: - filter.offset.data = 0 - if not filter.limit.data: - filter.limit.data = 50 - - if filter.previous.data: - filter.offset.data = max(0, filter.offset.data - 50) - if filter.next.data: - filter.offset.data = min(count // 50 * 50, filter.offset.data + 50) - - q = q.offset(filter.offset.data) - q = q.limit(filter.limit.data) + (count, q) = filter.apply_limits(q, pagesize=50) users = q.all() return render_template( diff --git a/mo/web/util.py b/mo/web/util.py new file mode 100644 index 00000000..00e5e329 --- /dev/null +++ b/mo/web/util.py @@ -0,0 +1,27 @@ +from flask_wtf import FlaskForm +import wtforms +from sqlalchemy.orm.query import Query + + +class PagerForm(FlaskForm): + limit = wtforms.IntegerField() + offset = wtforms.IntegerField() + next = wtforms.SubmitField("Další") + previous = wtforms.SubmitField("Předchozí") + + def apply_limits(self, query: Query, pagesize: int = 50) -> (int, Query): + count = query.count() + if not self.offset.data: + self.offset.data = 0 + if not self.limit.data: + self.limit.data = pagesize + + if self.previous.data: + self.offset.data = max(0, self.offset.data - pagesize) + if self.next.data: + self.offset.data = min(count // pagesize * pagesize, self.offset.data + pagesize) + + query = query.offset(self.offset.data) + query = query.limit(self.limit.data) + + return (count, query) -- GitLab