diff piecrust/data/iterators.py @ 233:4379d8f8f831

internal: Removing some dependency of filters and iterators on pages.
author Ludovic Chabant <ludovic@chabant.com>
date Wed, 11 Feb 2015 20:36:18 -0800
parents 8015fb40c28b
children f130365568ff
line wrap: on
line diff
--- a/piecrust/data/iterators.py	Wed Feb 11 08:31:36 2015 -0800
+++ b/piecrust/data/iterators.py	Wed Feb 11 20:36:18 2015 -0800
@@ -46,23 +46,19 @@
 
 
 class SettingFilterIterator(object):
-    def __init__(self, it, fil_conf, page_accessor=None):
+    def __init__(self, it, fil_conf, setting_accessor=None):
         self.it = it
         self.fil_conf = fil_conf
         self._fil = None
-        self.page_accessor = page_accessor
+        self.setting_accessor = setting_accessor
 
     def __iter__(self):
         if self._fil is None:
-            self._fil = PaginationFilter()
+            self._fil = PaginationFilter(self.setting_accessor)
             self._fil.addClausesFromConfig(self.fil_conf)
 
         for i in self.it:
-            if self.page_accessor:
-                page = self.page_accessor(i)
-            else:
-                page = i
-            if self._fil.pageMatches(page):
+            if self._fil.pageMatches(i):
                 yield i
 
 
@@ -174,19 +170,25 @@
         if name[:3] == 'is_' or name[:3] == 'in_':
             def is_filter(value):
                 conf = {'is_%s' % name[3:]: value}
-                return self._simpleNonSortedWrap(SettingFilterIterator, conf)
+                accessor = self._getSettingAccessor()
+                return self._simpleNonSortedWrap(SettingFilterIterator, conf,
+                                                 accessor)
             return is_filter
 
         if name[:4] == 'has_':
             def has_filter(value):
                 conf = {name: value}
-                return self._simpleNonSortedWrap(SettingFilterIterator, conf)
+                accessor = self._getSettingAccessor()
+                return self._simpleNonSortedWrap(SettingFilterIterator, conf,
+                                                 accessor)
             return has_filter
 
         if name[:5] == 'with_':
             def has_filter(value):
                 conf = {'has_%s' % name[5:]: value}
-                return self._simpleNonSortedWrap(SettingFilterIterator, conf)
+                accessor = self._getSettingAccessor()
+                return self._simpleNonSortedWrap(SettingFilterIterator, conf,
+                                                 accessor)
             return has_filter
 
         return self.__getattribute__(name)
@@ -209,15 +211,15 @@
             raise Exception("Couldn't find filter '%s' in the configuration "
                             "header for page: %s" %
                             (filter_name, self._current_page.path))
-        return self._simpleNonSortedWrap(SettingFilterIterator, filter_conf)
+        accessor = self._getSettingAccessor()
+        return self._simpleNonSortedWrap(SettingFilterIterator, filter_conf,
+                                         accessor)
 
     def sort(self, setting_name=None, reverse=False):
         self._ensureUnlocked()
         self._unload()
         if setting_name is not None:
-            accessor = None
-            if isinstance(self._source, IPaginationSource):
-                accessor = self._source.getSettingAccessor()
+            accessor = self._getSettingAccessor()
             self._pages = SettingSortIterator(self._pages, setting_name,
                                               reverse, accessor)
         else:
@@ -253,6 +255,12 @@
         self._pages = it_class(self._pages, *args, **kwargs)
         return self
 
+    def _getSettingAccessor(self):
+        accessor = None
+        if isinstance(self._source, IPaginationSource):
+            accessor = self._source.getSettingAccessor()
+        return accessor
+
     def _ensureUnlocked(self):
         if self._locked:
             raise Exception(