Mercurial > piecrust2
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