diff --git a/mo/web/org_users.py b/mo/web/org_users.py index 59c7993bd35260b4e66e6c465c96eccded6a5aa2..86fcfcb6508207b0aa92b7e604113e407a7a4462 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 0000000000000000000000000000000000000000..00e5e329c262d641486460345543d315ba5ad88f --- /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)