From 4b63fae4d6adebd68617d99374263cde51ec885c Mon Sep 17 00:00:00 2001 From: relikd Date: Fri, 25 Nov 2022 19:18:02 +0100 Subject: [PATCH] fix: dont use query for children total count --- lektor_groupby/backref.py | 1 - lektor_groupby/pagination.py | 19 ++++++++++++++----- lektor_groupby/query.py | 5 +++++ lektor_groupby/vobj.py | 7 ++++--- 4 files changed, 23 insertions(+), 9 deletions(-) diff --git a/lektor_groupby/backref.py b/lektor_groupby/backref.py index 6a1bba9..5c1b9d1 100644 --- a/lektor_groupby/backref.py +++ b/lektor_groupby/backref.py @@ -65,7 +65,6 @@ class VGroups: if not ctx: raise NotImplementedError("Shouldn't happen, where is my context?") builder = ctx.build_state.builder - # TODO: fix record_dependency -> process in non-capturing context GroupByRef.of(builder).make_once(keys) # ensure did cluster before use # find groups proc_list = [record] diff --git a/lektor_groupby/pagination.py b/lektor_groupby/pagination.py index afa3cd4..a086806 100644 --- a/lektor_groupby/pagination.py +++ b/lektor_groupby/pagination.py @@ -1,20 +1,29 @@ from lektor import datamodel -from typing import TYPE_CHECKING, Any +from typing import TYPE_CHECKING, Any, Dict if TYPE_CHECKING: + from lektor.environment import Environment from lektor.pagination import Pagination from lektor.sourceobj import SourceObject class PaginationConfig(datamodel.PaginationConfig): # because original method does not work for virtual sources. + def __init__(self, env: 'Environment', config: Dict[str, Any], total: int): + super().__init__(env, **config) + self._total_items_count = total + @staticmethod - def get_record_for_page(source: 'SourceObject', page_num: int) -> Any: - for_page = getattr(source, '__for_page__', None) + def get_record_for_page(record: 'SourceObject', page_num: int) -> Any: + for_page = getattr(record, '__for_page__', None) if callable(for_page): return for_page(page_num) - return datamodel.PaginationConfig.get_record_for_page(source, page_num) + return datamodel.PaginationConfig.get_record_for_page(record, page_num) + + def count_total_items(self, record: 'SourceObject') -> int: + ''' Override super() to prevent a record.children query. ''' + return self._total_items_count if TYPE_CHECKING: - def get_pagination_controller(self, source: 'SourceObject') \ + def get_pagination_controller(self, record: 'SourceObject') \ -> 'Pagination': ... diff --git a/lektor_groupby/query.py b/lektor_groupby/query.py index f9baacb..fa8e14b 100644 --- a/lektor_groupby/query.py +++ b/lektor_groupby/query.py @@ -58,6 +58,11 @@ class FixedRecordsQuery(Query): return len(self.__child_paths) return super().count() # type: ignore[no-any-return] + @property + def total(self) -> int: + ''' Return total entries count (without any filter). ''' + return len(self.__child_paths) + def get(self, path: str, page_num: Optional[int] = None) \ -> Optional['Record']: ''' Return Record with given path ''' diff --git a/lektor_groupby/vobj.py b/lektor_groupby/vobj.py index 8756fa8..23c510b 100644 --- a/lektor_groupby/vobj.py +++ b/lektor_groupby/vobj.py @@ -100,7 +100,8 @@ class GroupBySource(VirtualSourceObject): @cached_property def _pagination_config(self) -> 'PaginationConfig': # Generate `PaginationConfig` once we need it - return PaginationConfig(self.record.pad.env, **self.config.pagination) + return PaginationConfig(self.record.pad.env, self.config.pagination, + self._query.total) @cached_property def pagination(self) -> 'Pagination': @@ -185,10 +186,10 @@ class GroupBySource(VirtualSourceObject): # Properties & Helper # ----------------------- - @cached_property + @property def children(self) -> FixedRecordsQuery: ''' Return query of children of type Record. ''' - return self._query.request_page(self.page_num) + return self._query def __getitem__(self, key: str) -> Any: # Used for virtual path resolver