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