Mercurial > piecrust2
diff piecrust/data/iterators.py @ 226:e9dc18a275ff
data: Add ability for `IPaginationSource`s to specify how to get settings.
The `IPaginationSource` has a new `getSettingAccessor` method that returns how
to access settings values on items in the pagination source. A default accessor
is also available, which uses standard attribute lookup.
Also clean some stuff in `LazyPageConfigData`.
author | Ludovic Chabant <ludovic@chabant.com> |
---|---|
date | Wed, 04 Feb 2015 23:49:52 -0800 |
parents | 53b9df2263dc |
children | 8015fb40c28b |
line wrap: on
line diff
--- a/piecrust/data/iterators.py Tue Feb 03 21:04:55 2015 -0800 +++ b/piecrust/data/iterators.py Wed Feb 04 23:49:52 2015 -0800 @@ -80,16 +80,24 @@ self.it = it self.name = name self.reverse = reverse - self.value_accessor = value_accessor + self.value_accessor = value_accessor or self._default_value_accessor def __iter__(self): return iter(sorted(self.it, key=self._key_getter, reverse=self.reverse)) def _key_getter(self, item): - if self.value_accessor: - return self.value_accessor(item, self.name) - return item.config.get(self.name) + key = self.value_accessor(item, self.name) + if key is None: + return 0 + return key + + @staticmethod + def _default_value_accessor(item, name): + try: + return getattr(item, name) + except AttributeError: + return None class PaginationFilterIterator(object): @@ -125,7 +133,7 @@ # Apply any filter first, before we start sorting or slicing. if pagination_filter is not None: self._simpleNonSortedWrap(PaginationFilterIterator, - pagination_filter) + pagination_filter) if offset > 0 or limit > 0: self.slice(offset, limit) @@ -207,8 +215,11 @@ self._ensureUnlocked() self._unload() if setting_name is not None: + accessor = None + if not isinstance(self._source, IPaginationSource): + accessor = self._source.getSettingAccessor() self._pages = SettingSortIterator(self._pages, setting_name, - reverse) + reverse, accessor) else: self._pages = NaturalSortIterator(self._pages, reverse) self._has_sorter = True