Commit 08c4dfa3 authored by Sergey Shubin's avatar Sergey Shubin

Implemented page size changeable by user

parent d1191c27
...@@ -42,8 +42,9 @@ class ViewArgs(object): ...@@ -42,8 +42,9 @@ class ViewArgs(object):
""" """
List view arguments. List view arguments.
""" """
def __init__(self, page=None, sort=None, sort_desc=None, search=None, filters=None, extra_args=None): def __init__(self, page=None, page_size=None, sort=None, sort_desc=None, search=None, filters=None, extra_args=None):
self.page = page self.page = page
self.page_size = page_size
self.sort = sort self.sort = sort
self.sort_desc = bool(sort_desc) self.sort_desc = bool(sort_desc)
self.search = search self.search = search
...@@ -61,6 +62,7 @@ class ViewArgs(object): ...@@ -61,6 +62,7 @@ class ViewArgs(object):
flt = None flt = None
kwargs.setdefault('page', self.page) kwargs.setdefault('page', self.page)
kwargs.setdefault('page_size', self.page_size)
kwargs.setdefault('sort', self.sort) kwargs.setdefault('sort', self.sort)
kwargs.setdefault('sort_desc', self.sort_desc) kwargs.setdefault('sort_desc', self.sort_desc)
kwargs.setdefault('search', self.search) kwargs.setdefault('search', self.search)
...@@ -719,12 +721,17 @@ class BaseModelView(BaseView, ActionsMixin): ...@@ -719,12 +721,17 @@ class BaseModelView(BaseView, ActionsMixin):
for supported types. for supported types.
""" """
# Various settings # Pagination settings
page_size = 20 page_size = 20
""" """
Default page size for pagination. Default page size for pagination.
""" """
can_set_page_size = False
"""
Allows to select page size via dropdown list
"""
def __init__(self, model, def __init__(self, model,
name=None, category=None, endpoint=None, url=None, static_folder=None, name=None, category=None, endpoint=None, url=None, static_folder=None,
menu_class_name=None, menu_icon_type=None, menu_icon_value=None): menu_class_name=None, menu_icon_type=None, menu_icon_value=None):
...@@ -1646,6 +1653,7 @@ class BaseModelView(BaseView, ActionsMixin): ...@@ -1646,6 +1653,7 @@ class BaseModelView(BaseView, ActionsMixin):
Return arguments from query string. Return arguments from query string.
""" """
return ViewArgs(page=request.args.get('page', 0, type=int), return ViewArgs(page=request.args.get('page', 0, type=int),
page_size=request.args.get('page_size', 0, type=int),
sort=request.args.get('sort', None, type=int), sort=request.args.get('sort', None, type=int),
sort_desc=request.args.get('desc', None, type=int), sort_desc=request.args.get('desc', None, type=int),
search=request.args.get('search', None), search=request.args.get('search', None),
...@@ -1668,6 +1676,9 @@ class BaseModelView(BaseView, ActionsMixin): ...@@ -1668,6 +1676,9 @@ class BaseModelView(BaseView, ActionsMixin):
kwargs = dict(page=page, sort=view_args.sort, desc=desc, search=view_args.search) kwargs = dict(page=page, sort=view_args.sort, desc=desc, search=view_args.search)
kwargs.update(view_args.extra_args) kwargs.update(view_args.extra_args)
if view_args.page_size:
kwargs['page_size'] = view_args.page_size
if view_args.filters: if view_args.filters:
for i, pair in enumerate(view_args.filters): for i, pair in enumerate(view_args.filters):
idx, flt_name, value = pair idx, flt_name, value = pair
...@@ -1821,9 +1832,12 @@ class BaseModelView(BaseView, ActionsMixin): ...@@ -1821,9 +1832,12 @@ class BaseModelView(BaseView, ActionsMixin):
if sort_column is not None: if sort_column is not None:
sort_column = sort_column[0] sort_column = sort_column[0]
# Get page size
page_size = view_args.page_size or self.page_size
# Get count and data # Get count and data
count, data = self.get_list(view_args.page, sort_column, view_args.sort_desc, count, data = self.get_list(view_args.page, sort_column, view_args.sort_desc,
view_args.search, view_args.filters) view_args.search, view_args.filters, page_size=page_size)
list_forms = {} list_forms = {}
if self.column_editable_list: if self.column_editable_list:
...@@ -1831,9 +1845,9 @@ class BaseModelView(BaseView, ActionsMixin): ...@@ -1831,9 +1845,9 @@ class BaseModelView(BaseView, ActionsMixin):
list_forms[self.get_pk_value(row)] = self.list_form(obj=row) list_forms[self.get_pk_value(row)] = self.list_form(obj=row)
# Calculate number of pages # Calculate number of pages
if count is not None and self.page_size: if count is not None and page_size:
num_pages = int(ceil(count / float(self.page_size))) num_pages = int(ceil(count / float(page_size)))
elif not self.page_size: elif not page_size:
num_pages = 0 # hide pager for unlimited page_size num_pages = 0 # hide pager for unlimited page_size
else: else:
num_pages = None # use simple pager num_pages = None # use simple pager
...@@ -1852,6 +1866,12 @@ class BaseModelView(BaseView, ActionsMixin): ...@@ -1852,6 +1866,12 @@ class BaseModelView(BaseView, ActionsMixin):
return self._get_list_url(view_args.clone(sort=column, sort_desc=desc)) return self._get_list_url(view_args.clone(sort=column, sort_desc=desc))
def page_size_url(s):
if not s:
s = self.page_size
return self._get_list_url(view_args.clone(page_size=s))
# Actions # Actions
actions, actions_confirmation = self.get_actions_list() actions, actions_confirmation = self.get_actions_list()
...@@ -1877,8 +1897,10 @@ class BaseModelView(BaseView, ActionsMixin): ...@@ -1877,8 +1897,10 @@ class BaseModelView(BaseView, ActionsMixin):
count=count, count=count,
pager_url=pager_url, pager_url=pager_url,
num_pages=num_pages, num_pages=num_pages,
can_set_page_size=self.can_set_page_size,
page_size_url=page_size_url,
page=view_args.page, page=view_args.page,
page_size=self.page_size, page_size=page_size,
# Sorting # Sorting
sort_column=view_args.sort, sort_column=view_args.sort,
......
...@@ -68,3 +68,14 @@ ...@@ -68,3 +68,14 @@
{% endif %} {% endif %}
</form> </form>
{% endmacro %} {% endmacro %}
{% macro page_size_form(generator, btn_class='dropdown-toggle') %}
<a class="{{ btn_class }}" data-toggle="dropdown" href="javascript:void(0)">
{{ page_size }} {{ _gettext('items') }}<b class="caret"></b>
</a>
<ul class="dropdown-menu">
<li><a href="{{ generator(20) }}">20 {{ _gettext('items') }}</a></li>
<li><a href="{{ generator(50) }}">50 {{ _gettext('items') }}</a></li>
<li><a href="{{ generator(100) }}">100 {{ _gettext('items') }}</a></li>
</ul>
{% endmacro %}
...@@ -39,6 +39,12 @@ ...@@ -39,6 +39,12 @@
</li> </li>
{% endif %} {% endif %}
{% if can_set_page_size %}
<li class="dropdown">
{{ model_layout.page_size_form(page_size_url) }}
</li>
{% endif %}
{% if actions %} {% if actions %}
<li class="dropdown"> <li class="dropdown">
{{ actionlib.dropdown(actions) }} {{ actionlib.dropdown(actions) }}
......
...@@ -66,3 +66,14 @@ ...@@ -66,3 +66,14 @@
{% endif %} {% endif %}
</form> </form>
{% endmacro %} {% endmacro %}
{% macro page_size_form(generator, btn_class='dropdown-toggle') %}
<a class="{{ btn_class }}" data-toggle="dropdown" href="javascript:void(0)">
{{ page_size }} {{ _gettext('items') }}<b class="caret"></b>
</a>
<ul class="dropdown-menu">
<li><a href="{{ generator(20) }}">20 {{ _gettext('items') }}</a></li>
<li><a href="{{ generator(50) }}">50 {{ _gettext('items') }}</a></li>
<li><a href="{{ generator(100) }}">100 {{ _gettext('items') }}</a></li>
</ul>
{% endmacro %}
...@@ -39,6 +39,12 @@ ...@@ -39,6 +39,12 @@
</li> </li>
{% endif %} {% endif %}
{% if can_set_page_size %}
<li class="dropdown">
{{ model_layout.page_size_form(page_size_url) }}
</li>
{% endif %}
{% if actions %} {% if actions %}
<li class="dropdown"> <li class="dropdown">
{{ actionlib.dropdown(actions) }} {{ actionlib.dropdown(actions) }}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment