annotate piecrust/data/filters.py @ 1186:2ead9dcb6bec

prepare: Fix scaffolding refactor code. For some reason the previous commit was missing some changes.
author Ludovic Chabant <ludovic@chabant.com>
date Fri, 23 Oct 2020 23:50:42 -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)