diff piecrust/data/filters.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 474c9882decf
children 8c0c53a315ae
line wrap: on
line diff
--- a/piecrust/data/filters.py	Wed Feb 11 08:31:36 2015 -0800
+++ b/piecrust/data/filters.py	Wed Feb 11 20:36:18 2015 -0800
@@ -5,8 +5,9 @@
 
 
 class PaginationFilter(object):
-    def __init__(self):
+    def __init__(self, value_accessor=None):
         self.root_clause = None
+        self.value_accessor = value_accessor or self._default_value_accessor
 
     @property
     def is_empty(self):
@@ -23,7 +24,7 @@
     def pageMatches(self, page):
         if self.root_clause is None:
             return True
-        return self.root_clause.pageMatches(page)
+        return self.root_clause.pageMatches(self, page)
 
     def _ensureRootClause(self):
         if self.root_clause is None:
@@ -76,13 +77,19 @@
             else:
                 raise Exception("Unknown filter clause: %s" % key)
 
+    @staticmethod
+    def _default_value_accessor(item, name):
+        try:
+            return getattr(item, name)
+        except AttributeError:
+            return None
 
 
 class IFilterClause(object):
     def addClause(self, clause):
         raise NotImplementedError()
 
-    def pageMatches(self, page):
+    def pageMatches(self, fil, page):
         raise NotImplementedError()
 
 
@@ -96,11 +103,11 @@
                             "child clause.")
         self.child = clause
 
-    def pageMatches(self, page):
+    def pageMatches(self, fil, page):
         if self.child is None:
             raise Exception("'NOT' filtering clauses must have one child "
                             "clause.")
-        return not self.child.pageMatches(page)
+        return not self.child.pageMatches(fil, page)
 
 
 class BooleanClause(IFilterClause):
@@ -112,17 +119,17 @@
 
 
 class AndBooleanClause(BooleanClause):
-    def pageMatches(self, page):
+    def pageMatches(self, fil, page):
         for c in self.clauses:
-            if not c.pageMatches(page):
+            if not c.pageMatches(fil, page):
                 return False
         return True
 
 
 class OrBooleanClause(BooleanClause):
-    def pageMatches(self, page):
+    def pageMatches(self, fil, page):
         for c in self.clauses:
-            if c.pageMatches(page):
+            if c.pageMatches(fil, page):
                 return True
         return False
 
@@ -139,8 +146,8 @@
 
 
 class HasFilterClause(SettingFilterClause):
-    def pageMatches(self, page):
-        actual_value = page.config.get(self.name)
+    def pageMatches(self, fil, page):
+        actual_value = fil.value_accessor(page, self.name)
         if actual_value is None or not isinstance(actual_value, list):
             return False
 
@@ -151,8 +158,8 @@
 
 
 class IsFilterClause(SettingFilterClause):
-    def pageMatches(self, page):
-        actual_value = page.config.get(self.name)
+    def pageMatches(self, fil, page):
+        actual_value = fil.value_accessor(page, self.name)
         if self.coercer:
             actual_value = self.coercer(actual_value)
         return actual_value == self.value