comparison piecrust/data/filters.py @ 854:08e02c2a2a1a

core: Keep refactoring, this time to prepare for generator sources. - Make a few APIs simpler. - Content pipelines create their own jobs, so that generator sources can keep aborting in `getContents`, but rely on their pipeline to generate pages for baking.
author Ludovic Chabant <ludovic@chabant.com>
date Sun, 04 Jun 2017 23:34:28 -0700
parents 8c0c53a315ae
children afd230972167
comparison
equal deleted inserted replaced
853:f070a4fc033c 854:08e02c2a2a1a
2 2
3 3
4 logger = logging.getLogger(__name__) 4 logger = logging.getLogger(__name__)
5 5
6 6
7 def page_value_accessor(page, name):
8 return page.config.get(name)
9
10
11 class PaginationFilter(object): 7 class PaginationFilter(object):
12 def __init__(self, value_accessor=None): 8 def __init__(self):
13 self.root_clause = None 9 self.root_clause = None
14 self.value_accessor = value_accessor or self._default_value_accessor
15 10
16 @property 11 @property
17 def is_empty(self): 12 def is_empty(self):
18 return self.root_clause is None 13 return self.root_clause is None
19 14
79 parent_clause.addClause(IsFilterClause(setting_name, val)) 74 parent_clause.addClause(IsFilterClause(setting_name, val))
80 75
81 else: 76 else:
82 raise Exception("Unknown filter clause: %s" % key) 77 raise Exception("Unknown filter clause: %s" % key)
83 78
84 @staticmethod
85 def _default_value_accessor(item, name):
86 try:
87 return getattr(item, name)
88 except AttributeError:
89 return None
90
91 79
92 class IFilterClause(object): 80 class IFilterClause(object):
93 def addClause(self, clause): 81 def addClause(self, clause):
94 raise NotImplementedError() 82 raise NotImplementedError()
95 83
149 "Use a boolean filter clause instead.") 137 "Use a boolean filter clause instead.")
150 138
151 139
152 class HasFilterClause(SettingFilterClause): 140 class HasFilterClause(SettingFilterClause):
153 def pageMatches(self, fil, page): 141 def pageMatches(self, fil, page):
154 actual_value = fil.value_accessor(page, self.name) 142 actual_value = page.config.get(self.name)
155 if actual_value is None or not isinstance(actual_value, list): 143 if actual_value is None or not isinstance(actual_value, list):
156 return False 144 return False
157 145
158 if self.coercer: 146 if self.coercer:
159 actual_value = list(map(self.coercer, actual_value)) 147 actual_value = list(map(self.coercer, actual_value))
161 return self.value in actual_value 149 return self.value in actual_value
162 150
163 151
164 class IsFilterClause(SettingFilterClause): 152 class IsFilterClause(SettingFilterClause):
165 def pageMatches(self, fil, page): 153 def pageMatches(self, fil, page):
166 actual_value = fil.value_accessor(page, self.name) 154 actual_value = page.config.get(self.name)
167 if self.coercer: 155 if self.coercer:
168 actual_value = self.coercer(actual_value) 156 actual_value = self.coercer(actual_value)
169 return actual_value == self.value 157 return actual_value == self.value
170 158