annotate piecrust/data/filters.py @ 1188:a7c43131d871

bake: Fix file write flushing problem with Python 3.8+ Writing the cache files fails in Python 3.8 because it looks like flushing behaviour has changed. We need to explicitly flush. And even then, in very rare occurrences, it looks like it can still run into racing conditions, so we do a very hacky and ugly "retry" loop when fetching cached data :(
author Ludovic Chabant <ludovic@chabant.com>
date Tue, 15 Jun 2021 22:36:23 -0700
parents afd230972167
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1 import logging
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
2
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
4 logger = logging.getLogger(__name__)
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
5
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
6
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
7 class IFilterClause(object):
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
8 def addClause(self, clause):
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
9 raise NotImplementedError()
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
10
233
4379d8f8f831 internal: Removing some dependency of filters and iterators on pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 5
diff changeset
11 def pageMatches(self, fil, page):
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
12 raise NotImplementedError()
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
13
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
14
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
15 class NotClause(IFilterClause):
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
16 def __init__(self):
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
17 self.child = None
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
18
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
19 def addClause(self, clause):
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
20 if self.child is not None:
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
21 raise Exception("'NOT' filtering clauses can only have one "
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
22 "child clause.")
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
23 self.child = clause
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
24
233
4379d8f8f831 internal: Removing some dependency of filters and iterators on pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 5
diff changeset
25 def pageMatches(self, fil, page):
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
26 if self.child is None:
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
27 raise Exception("'NOT' filtering clauses must have one child "
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
28 "clause.")
233
4379d8f8f831 internal: Removing some dependency of filters and iterators on pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 5
diff changeset
29 return not self.child.pageMatches(fil, page)
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
30
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
31
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
32 class BooleanClause(IFilterClause):
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
33 def __init__(self):
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
34 self.clauses = []
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
35
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
36 def addClause(self, clause):
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
37 self.clauses.append(clause)
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
38
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
39
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
40 class AndBooleanClause(BooleanClause):
233
4379d8f8f831 internal: Removing some dependency of filters and iterators on pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 5
diff changeset
41 def pageMatches(self, fil, page):
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
42 for c in self.clauses:
233
4379d8f8f831 internal: Removing some dependency of filters and iterators on pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 5
diff changeset
43 if not c.pageMatches(fil, page):
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
44 return False
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
45 return True
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
46
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
47
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
48 class OrBooleanClause(BooleanClause):
233
4379d8f8f831 internal: Removing some dependency of filters and iterators on pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 5
diff changeset
49 def pageMatches(self, fil, page):
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
50 for c in self.clauses:
233
4379d8f8f831 internal: Removing some dependency of filters and iterators on pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 5
diff changeset
51 if c.pageMatches(fil, page):
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
52 return True
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
53 return False
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
54
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
55
967
afd230972167 data: Improve pagination filters code, add `defined` and `not_empty`.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
56 class IsDefinedFilterClause(IFilterClause):
afd230972167 data: Improve pagination filters code, add `defined` and `not_empty`.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
57 def __init__(self, name):
afd230972167 data: Improve pagination filters code, add `defined` and `not_empty`.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
58 self.name = name
afd230972167 data: Improve pagination filters code, add `defined` and `not_empty`.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
59
afd230972167 data: Improve pagination filters code, add `defined` and `not_empty`.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
60 def pageMatches(self, fil, page):
afd230972167 data: Improve pagination filters code, add `defined` and `not_empty`.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
61 return self.name in page.config
afd230972167 data: Improve pagination filters code, add `defined` and `not_empty`.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
62
afd230972167 data: Improve pagination filters code, add `defined` and `not_empty`.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
63
afd230972167 data: Improve pagination filters code, add `defined` and `not_empty`.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
64 class IsNotEmptyFilterClause(IFilterClause):
afd230972167 data: Improve pagination filters code, add `defined` and `not_empty`.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
65 def __init__(self, name):
afd230972167 data: Improve pagination filters code, add `defined` and `not_empty`.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
66 self.name = name
afd230972167 data: Improve pagination filters code, add `defined` and `not_empty`.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
67
afd230972167 data: Improve pagination filters code, add `defined` and `not_empty`.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
68 def pageMatches(self, fil, page):
afd230972167 data: Improve pagination filters code, add `defined` and `not_empty`.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
69 return bool(page.config.get(self.name))
afd230972167 data: Improve pagination filters code, add `defined` and `not_empty`.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
70
afd230972167 data: Improve pagination filters code, add `defined` and `not_empty`.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
71
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
72 class SettingFilterClause(IFilterClause):
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
73 def __init__(self, name, value, coercer=None):
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
74 self.name = name
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
75 self.value = value
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
76 self.coercer = coercer
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
77
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
78 def addClause(self, clause):
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
79 raise Exception("Setting filter clauses can't have child clauses. "
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
80 "Use a boolean filter clause instead.")
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
81
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
82
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
83 class HasFilterClause(SettingFilterClause):
233
4379d8f8f831 internal: Removing some dependency of filters and iterators on pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 5
diff changeset
84 def pageMatches(self, fil, page):
854
08e02c2a2a1a core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents: 280
diff changeset
85 actual_value = page.config.get(self.name)
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
86 if actual_value is None or not isinstance(actual_value, list):
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
87 return False
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
88
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
89 if self.coercer:
5
474c9882decf Upgrade to Python 3.
Ludovic Chabant <ludovic@chabant.com>
parents: 3
diff changeset
90 actual_value = list(map(self.coercer, actual_value))
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
91
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
92 return self.value in actual_value
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
93
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
94
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
95 class IsFilterClause(SettingFilterClause):
233
4379d8f8f831 internal: Removing some dependency of filters and iterators on pages.
Ludovic Chabant <ludovic@chabant.com>
parents: 5
diff changeset
96 def pageMatches(self, fil, page):
854
08e02c2a2a1a core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents: 280
diff changeset
97 actual_value = page.config.get(self.name)
3
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
98 if self.coercer:
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
99 actual_value = self.coercer(actual_value)
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
100 return actual_value == self.value
f485ba500df3 Gigantic change to basically make PieCrust 2 vaguely functional.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
101
967
afd230972167 data: Improve pagination filters code, add `defined` and `not_empty`.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
102
afd230972167 data: Improve pagination filters code, add `defined` and `not_empty`.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
103 unary_ops = {'not': NotClause}
afd230972167 data: Improve pagination filters code, add `defined` and `not_empty`.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
104 binary_ops = {
afd230972167 data: Improve pagination filters code, add `defined` and `not_empty`.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
105 'and': AndBooleanClause,
afd230972167 data: Improve pagination filters code, add `defined` and `not_empty`.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
106 'or': OrBooleanClause}
afd230972167 data: Improve pagination filters code, add `defined` and `not_empty`.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
107 misc_ops = {
afd230972167 data: Improve pagination filters code, add `defined` and `not_empty`.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
108 'defined': IsDefinedFilterClause,
afd230972167 data: Improve pagination filters code, add `defined` and `not_empty`.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
109 'not_empty': IsNotEmptyFilterClause}
afd230972167 data: Improve pagination filters code, add `defined` and `not_empty`.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
110
afd230972167 data: Improve pagination filters code, add `defined` and `not_empty`.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
111
afd230972167 data: Improve pagination filters code, add `defined` and `not_empty`.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
112 class PaginationFilter(object):
afd230972167 data: Improve pagination filters code, add `defined` and `not_empty`.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
113 def __init__(self):
afd230972167 data: Improve pagination filters code, add `defined` and `not_empty`.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
114 self.root_clause = None
afd230972167 data: Improve pagination filters code, add `defined` and `not_empty`.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
115
afd230972167 data: Improve pagination filters code, add `defined` and `not_empty`.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
116 @property
afd230972167 data: Improve pagination filters code, add `defined` and `not_empty`.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
117 def is_empty(self):
afd230972167 data: Improve pagination filters code, add `defined` and `not_empty`.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
118 return self.root_clause is None
afd230972167 data: Improve pagination filters code, add `defined` and `not_empty`.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
119
afd230972167 data: Improve pagination filters code, add `defined` and `not_empty`.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
120 def addClause(self, clause):
afd230972167 data: Improve pagination filters code, add `defined` and `not_empty`.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
121 self._ensureRootClause()
afd230972167 data: Improve pagination filters code, add `defined` and `not_empty`.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
122 self.root_clause.addClause(clause)
afd230972167 data: Improve pagination filters code, add `defined` and `not_empty`.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
123
afd230972167 data: Improve pagination filters code, add `defined` and `not_empty`.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
124 def addClausesFromConfig(self, config):
afd230972167 data: Improve pagination filters code, add `defined` and `not_empty`.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
125 self._ensureRootClause()
afd230972167 data: Improve pagination filters code, add `defined` and `not_empty`.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
126 self._addClausesFromConfigRecursive(config, self.root_clause)
afd230972167 data: Improve pagination filters code, add `defined` and `not_empty`.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
127
afd230972167 data: Improve pagination filters code, add `defined` and `not_empty`.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
128 def pageMatches(self, page):
afd230972167 data: Improve pagination filters code, add `defined` and `not_empty`.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
129 if self.root_clause is None:
afd230972167 data: Improve pagination filters code, add `defined` and `not_empty`.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
130 return True
afd230972167 data: Improve pagination filters code, add `defined` and `not_empty`.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
131 return self.root_clause.pageMatches(self, page)
afd230972167 data: Improve pagination filters code, add `defined` and `not_empty`.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
132
afd230972167 data: Improve pagination filters code, add `defined` and `not_empty`.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
133 def _ensureRootClause(self):
afd230972167 data: Improve pagination filters code, add `defined` and `not_empty`.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
134 if self.root_clause is None:
afd230972167 data: Improve pagination filters code, add `defined` and `not_empty`.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
135 self.root_clause = AndBooleanClause()
afd230972167 data: Improve pagination filters code, add `defined` and `not_empty`.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
136
afd230972167 data: Improve pagination filters code, add `defined` and `not_empty`.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
137 def _addClausesFromConfigRecursive(self, config, parent_clause):
afd230972167 data: Improve pagination filters code, add `defined` and `not_empty`.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
138 for key, val in config.items():
afd230972167 data: Improve pagination filters code, add `defined` and `not_empty`.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
139 clause_class = unary_ops.get(key)
afd230972167 data: Improve pagination filters code, add `defined` and `not_empty`.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
140 if clause_class:
afd230972167 data: Improve pagination filters code, add `defined` and `not_empty`.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
141 if isinstance(val, list):
afd230972167 data: Improve pagination filters code, add `defined` and `not_empty`.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
142 if len(val) != 1:
afd230972167 data: Improve pagination filters code, add `defined` and `not_empty`.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
143 raise Exception(
afd230972167 data: Improve pagination filters code, add `defined` and `not_empty`.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
144 "Unary filter '%s' must have exactly one child "
afd230972167 data: Improve pagination filters code, add `defined` and `not_empty`.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
145 "clause." % key)
afd230972167 data: Improve pagination filters code, add `defined` and `not_empty`.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
146 val = val[0]
afd230972167 data: Improve pagination filters code, add `defined` and `not_empty`.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
147 subcl = clause_class()
afd230972167 data: Improve pagination filters code, add `defined` and `not_empty`.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
148 parent_clause.addClause(subcl)
afd230972167 data: Improve pagination filters code, add `defined` and `not_empty`.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
149 self._addClausesFromConfigRecursive(val, subcl)
afd230972167 data: Improve pagination filters code, add `defined` and `not_empty`.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
150 continue
afd230972167 data: Improve pagination filters code, add `defined` and `not_empty`.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
151
afd230972167 data: Improve pagination filters code, add `defined` and `not_empty`.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
152 clause_class = binary_ops.get(key)
afd230972167 data: Improve pagination filters code, add `defined` and `not_empty`.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
153 if clause_class:
afd230972167 data: Improve pagination filters code, add `defined` and `not_empty`.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
154 if not isinstance(val, list) or len(val) == 0:
afd230972167 data: Improve pagination filters code, add `defined` and `not_empty`.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
155 raise Exception(
afd230972167 data: Improve pagination filters code, add `defined` and `not_empty`.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
156 "Binary filter clause '%s' doesn't have an array "
afd230972167 data: Improve pagination filters code, add `defined` and `not_empty`.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
157 "of child clauses." % key)
afd230972167 data: Improve pagination filters code, add `defined` and `not_empty`.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
158 subcl = clause_class()
afd230972167 data: Improve pagination filters code, add `defined` and `not_empty`.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
159 parent_clause.addClause(subcl)
afd230972167 data: Improve pagination filters code, add `defined` and `not_empty`.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
160 for c in val:
afd230972167 data: Improve pagination filters code, add `defined` and `not_empty`.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
161 self._addClausesFromConfigRecursive(c, subcl)
afd230972167 data: Improve pagination filters code, add `defined` and `not_empty`.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
162 continue
afd230972167 data: Improve pagination filters code, add `defined` and `not_empty`.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
163
afd230972167 data: Improve pagination filters code, add `defined` and `not_empty`.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
164 clause_class = misc_ops.get(key)
afd230972167 data: Improve pagination filters code, add `defined` and `not_empty`.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
165 if clause_class:
afd230972167 data: Improve pagination filters code, add `defined` and `not_empty`.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
166 if isinstance(val, list):
afd230972167 data: Improve pagination filters code, add `defined` and `not_empty`.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
167 wrappercl = AndBooleanClause()
afd230972167 data: Improve pagination filters code, add `defined` and `not_empty`.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
168 for c in val:
afd230972167 data: Improve pagination filters code, add `defined` and `not_empty`.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
169 wrappercl.addClause(clause_class(c))
afd230972167 data: Improve pagination filters code, add `defined` and `not_empty`.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
170 parent_clause.addClause(wrappercl)
afd230972167 data: Improve pagination filters code, add `defined` and `not_empty`.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
171 else:
afd230972167 data: Improve pagination filters code, add `defined` and `not_empty`.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
172 parent_clause.addClause(clause_class(val))
afd230972167 data: Improve pagination filters code, add `defined` and `not_empty`.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
173 continue
afd230972167 data: Improve pagination filters code, add `defined` and `not_empty`.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
174
afd230972167 data: Improve pagination filters code, add `defined` and `not_empty`.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
175 if key[:4] == 'has_':
afd230972167 data: Improve pagination filters code, add `defined` and `not_empty`.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
176 setting_name = key[4:]
afd230972167 data: Improve pagination filters code, add `defined` and `not_empty`.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
177 if isinstance(val, list):
afd230972167 data: Improve pagination filters code, add `defined` and `not_empty`.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
178 wrappercl = AndBooleanClause()
afd230972167 data: Improve pagination filters code, add `defined` and `not_empty`.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
179 for c in val:
afd230972167 data: Improve pagination filters code, add `defined` and `not_empty`.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
180 wrappercl.addClause(HasFilterClause(setting_name, c))
afd230972167 data: Improve pagination filters code, add `defined` and `not_empty`.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
181 parent_clause.addClause(wrappercl)
afd230972167 data: Improve pagination filters code, add `defined` and `not_empty`.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
182 else:
afd230972167 data: Improve pagination filters code, add `defined` and `not_empty`.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
183 parent_clause.addClause(HasFilterClause(setting_name, val))
afd230972167 data: Improve pagination filters code, add `defined` and `not_empty`.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
184 continue
afd230972167 data: Improve pagination filters code, add `defined` and `not_empty`.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
185
afd230972167 data: Improve pagination filters code, add `defined` and `not_empty`.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
186 if key[:3] == 'is_':
afd230972167 data: Improve pagination filters code, add `defined` and `not_empty`.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
187 setting_name = key[3:]
afd230972167 data: Improve pagination filters code, add `defined` and `not_empty`.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
188 parent_clause.addClause(IsFilterClause(setting_name, val))
afd230972167 data: Improve pagination filters code, add `defined` and `not_empty`.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
189 continue
afd230972167 data: Improve pagination filters code, add `defined` and `not_empty`.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
190
afd230972167 data: Improve pagination filters code, add `defined` and `not_empty`.
Ludovic Chabant <ludovic@chabant.com>
parents: 854
diff changeset
191 raise Exception("Unknown filter clause: %s" % key)