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