Mercurial > piecrust2
annotate piecrust/data/filters.py @ 1149:be74ba54a06f
admin: Improvements to micropub endpoint's photo handling.
- Add `.jpg` extension to photos that don't have any extension.
- Add photos in the config section instead of the body, so that the layout
can put them in separate `u-photo` tags.
author | Ludovic Chabant <ludovic@chabant.com> |
---|---|
date | Tue, 10 Jul 2018 21:03:58 -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) |