Mercurial > piecrust2
annotate piecrust/data/linker.py @ 1143:1c324407bd1f
internal: Cleanup in the paginator's code.
author | Ludovic Chabant <ludovic@chabant.com> |
---|---|
date | Tue, 05 Jun 2018 21:59:41 -0700 |
parents | 1a214de1e1f7 |
children |
rev | line source |
---|---|
172
4fc1d306046b
linker: Actually implement the `Linker` class, and use it in the page data.
Ludovic Chabant <ludovic@chabant.com>
parents:
3
diff
changeset
|
1 import logging |
440
32c7c2d219d2
performance: Refactor how data is managed to reduce copying.
Ludovic Chabant <ludovic@chabant.com>
parents:
411
diff
changeset
|
2 from piecrust.data.paginationdata import PaginationData |
854
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
853
diff
changeset
|
3 from piecrust.sources.base import ( |
1079
00a0a65d08e6
data: Fix debug rendering of the family data.
Ludovic Chabant <ludovic@chabant.com>
parents:
1058
diff
changeset
|
4 REL_PARENT_GROUP, REL_LOGICAL_PARENT_ITEM, REL_LOGICAL_CHILD_GROUP) |
172
4fc1d306046b
linker: Actually implement the `Linker` class, and use it in the page data.
Ludovic Chabant <ludovic@chabant.com>
parents:
3
diff
changeset
|
5 |
4fc1d306046b
linker: Actually implement the `Linker` class, and use it in the page data.
Ludovic Chabant <ludovic@chabant.com>
parents:
3
diff
changeset
|
6 |
4fc1d306046b
linker: Actually implement the `Linker` class, and use it in the page data.
Ludovic Chabant <ludovic@chabant.com>
parents:
3
diff
changeset
|
7 logger = logging.getLogger(__name__) |
4fc1d306046b
linker: Actually implement the `Linker` class, and use it in the page data.
Ludovic Chabant <ludovic@chabant.com>
parents:
3
diff
changeset
|
8 |
4fc1d306046b
linker: Actually implement the `Linker` class, and use it in the page data.
Ludovic Chabant <ludovic@chabant.com>
parents:
3
diff
changeset
|
9 |
854
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
853
diff
changeset
|
10 _unloaded = object() |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
853
diff
changeset
|
11 |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
853
diff
changeset
|
12 |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
853
diff
changeset
|
13 class Linker: |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
853
diff
changeset
|
14 """ A template-exposed data class that lets the user navigate the |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
853
diff
changeset
|
15 logical hierarchy of pages in a page source. |
247
d9d5c5de02a8
data: Add a top level wrapper for `Linker`.
Ludovic Chabant <ludovic@chabant.com>
parents:
242
diff
changeset
|
16 """ |
408
fd8e39254da0
debug: Better debug info output for iterators, providers, and linkers.
Ludovic Chabant <ludovic@chabant.com>
parents:
404
diff
changeset
|
17 debug_render = ['parent', 'ancestors', 'siblings', 'children', 'root', |
fd8e39254da0
debug: Better debug info output for iterators, providers, and linkers.
Ludovic Chabant <ludovic@chabant.com>
parents:
404
diff
changeset
|
18 'forpath'] |
1079
00a0a65d08e6
data: Fix debug rendering of the family data.
Ludovic Chabant <ludovic@chabant.com>
parents:
1058
diff
changeset
|
19 debug_render_invoke = ['ancestors', 'siblings', 'children'] |
590
3cca1f6bd610
debug: Fix how the linker shows children/siblings/etc. in the debug window.
Ludovic Chabant <ludovic@chabant.com>
parents:
518
diff
changeset
|
20 debug_render_redirect = { |
852
4850f8c21b6e
core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents:
590
diff
changeset
|
21 'ancestors': '_debugRenderAncestors', |
4850f8c21b6e
core: Start of the big refactor for PieCrust 3.0.
Ludovic Chabant <ludovic@chabant.com>
parents:
590
diff
changeset
|
22 'siblings': '_debugRenderSiblings', |
1079
00a0a65d08e6
data: Fix debug rendering of the family data.
Ludovic Chabant <ludovic@chabant.com>
parents:
1058
diff
changeset
|
23 'children': '_debugRenderChildren'} |
408
fd8e39254da0
debug: Better debug info output for iterators, providers, and linkers.
Ludovic Chabant <ludovic@chabant.com>
parents:
404
diff
changeset
|
24 |
866
d9059257743c
refactor: Make the linker work again.
Ludovic Chabant <ludovic@chabant.com>
parents:
862
diff
changeset
|
25 def __init__(self, source, content_item): |
d9059257743c
refactor: Make the linker work again.
Ludovic Chabant <ludovic@chabant.com>
parents:
862
diff
changeset
|
26 self._source = source |
d9059257743c
refactor: Make the linker work again.
Ludovic Chabant <ludovic@chabant.com>
parents:
862
diff
changeset
|
27 self._content_item = content_item |
854
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
853
diff
changeset
|
28 |
866
d9059257743c
refactor: Make the linker work again.
Ludovic Chabant <ludovic@chabant.com>
parents:
862
diff
changeset
|
29 self._parent_group = _unloaded |
854
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
853
diff
changeset
|
30 self._ancestors = None |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
853
diff
changeset
|
31 self._siblings = None |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
853
diff
changeset
|
32 self._children = None |
404
27b10024f8d8
linker: Add ability to return the parent and ancestors of a page.
Ludovic Chabant <ludovic@chabant.com>
parents:
402
diff
changeset
|
33 |
27b10024f8d8
linker: Add ability to return the parent and ancestors of a page.
Ludovic Chabant <ludovic@chabant.com>
parents:
402
diff
changeset
|
34 @property |
27b10024f8d8
linker: Add ability to return the parent and ancestors of a page.
Ludovic Chabant <ludovic@chabant.com>
parents:
402
diff
changeset
|
35 def parent(self): |
866
d9059257743c
refactor: Make the linker work again.
Ludovic Chabant <ludovic@chabant.com>
parents:
862
diff
changeset
|
36 a = self.ancestors |
d9059257743c
refactor: Make the linker work again.
Ludovic Chabant <ludovic@chabant.com>
parents:
862
diff
changeset
|
37 if a: |
d9059257743c
refactor: Make the linker work again.
Ludovic Chabant <ludovic@chabant.com>
parents:
862
diff
changeset
|
38 return a[0] |
d9059257743c
refactor: Make the linker work again.
Ludovic Chabant <ludovic@chabant.com>
parents:
862
diff
changeset
|
39 return None |
404
27b10024f8d8
linker: Add ability to return the parent and ancestors of a page.
Ludovic Chabant <ludovic@chabant.com>
parents:
402
diff
changeset
|
40 |
27b10024f8d8
linker: Add ability to return the parent and ancestors of a page.
Ludovic Chabant <ludovic@chabant.com>
parents:
402
diff
changeset
|
41 @property |
1055
7e4742a60d14
data: Add new properties and folder support to the `family` data endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
989
diff
changeset
|
42 def root(self): |
7e4742a60d14
data: Add new properties and folder support to the `family` data endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
989
diff
changeset
|
43 a = self.ancestors |
7e4742a60d14
data: Add new properties and folder support to the `family` data endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
989
diff
changeset
|
44 if a: |
7e4742a60d14
data: Add new properties and folder support to the `family` data endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
989
diff
changeset
|
45 return a[-1] |
7e4742a60d14
data: Add new properties and folder support to the `family` data endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
989
diff
changeset
|
46 return self.myself |
7e4742a60d14
data: Add new properties and folder support to the `family` data endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
989
diff
changeset
|
47 |
7e4742a60d14
data: Add new properties and folder support to the `family` data endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
989
diff
changeset
|
48 @property |
7e4742a60d14
data: Add new properties and folder support to the `family` data endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
989
diff
changeset
|
49 def myself(self): |
7e4742a60d14
data: Add new properties and folder support to the `family` data endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
989
diff
changeset
|
50 page = self._source.app.getPage(self._source, self._content_item) |
7e4742a60d14
data: Add new properties and folder support to the `family` data endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
989
diff
changeset
|
51 return self._makePageData(page) |
7e4742a60d14
data: Add new properties and folder support to the `family` data endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
989
diff
changeset
|
52 |
7e4742a60d14
data: Add new properties and folder support to the `family` data endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
989
diff
changeset
|
53 @property |
404
27b10024f8d8
linker: Add ability to return the parent and ancestors of a page.
Ludovic Chabant <ludovic@chabant.com>
parents:
402
diff
changeset
|
54 def ancestors(self): |
854
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
853
diff
changeset
|
55 if self._ancestors is None: |
866
d9059257743c
refactor: Make the linker work again.
Ludovic Chabant <ludovic@chabant.com>
parents:
862
diff
changeset
|
56 src = self._source |
d9059257743c
refactor: Make the linker work again.
Ludovic Chabant <ludovic@chabant.com>
parents:
862
diff
changeset
|
57 app = src.app |
d9059257743c
refactor: Make the linker work again.
Ludovic Chabant <ludovic@chabant.com>
parents:
862
diff
changeset
|
58 |
854
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
853
diff
changeset
|
59 self._ancestors = [] |
977
84fc72a17f7a
sources: Changes in related contents management.
Ludovic Chabant <ludovic@chabant.com>
parents:
866
diff
changeset
|
60 cur_group = self._getParentGroup() |
866
d9059257743c
refactor: Make the linker work again.
Ludovic Chabant <ludovic@chabant.com>
parents:
862
diff
changeset
|
61 while cur_group: |
d9059257743c
refactor: Make the linker work again.
Ludovic Chabant <ludovic@chabant.com>
parents:
862
diff
changeset
|
62 pi = src.getRelatedContents(cur_group, |
d9059257743c
refactor: Make the linker work again.
Ludovic Chabant <ludovic@chabant.com>
parents:
862
diff
changeset
|
63 REL_LOGICAL_PARENT_ITEM) |
854
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
853
diff
changeset
|
64 if pi is not None: |
866
d9059257743c
refactor: Make the linker work again.
Ludovic Chabant <ludovic@chabant.com>
parents:
862
diff
changeset
|
65 pipage = app.getPage(src, pi) |
1055
7e4742a60d14
data: Add new properties and folder support to the `family` data endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
989
diff
changeset
|
66 self._ancestors.append(self._makePageData(pipage)) |
977
84fc72a17f7a
sources: Changes in related contents management.
Ludovic Chabant <ludovic@chabant.com>
parents:
866
diff
changeset
|
67 cur_group = src.getRelatedContents( |
84fc72a17f7a
sources: Changes in related contents management.
Ludovic Chabant <ludovic@chabant.com>
parents:
866
diff
changeset
|
68 pi, REL_PARENT_GROUP) |
854
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
853
diff
changeset
|
69 else: |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
853
diff
changeset
|
70 break |
08e02c2a2a1a
core: Keep refactoring, this time to prepare for generator sources.
Ludovic Chabant <ludovic@chabant.com>
parents:
853
diff
changeset
|
71 return self._ancestors |
247
d9d5c5de02a8
data: Add a top level wrapper for `Linker`.
Ludovic Chabant <ludovic@chabant.com>
parents:
242
diff
changeset
|
72 |
d9d5c5de02a8
data: Add a top level wrapper for `Linker`.
Ludovic Chabant <ludovic@chabant.com>
parents:
242
diff
changeset
|
73 @property |
d9d5c5de02a8
data: Add a top level wrapper for `Linker`.
Ludovic Chabant <ludovic@chabant.com>
parents:
242
diff
changeset
|
74 def siblings(self): |
977
84fc72a17f7a
sources: Changes in related contents management.
Ludovic Chabant <ludovic@chabant.com>
parents:
866
diff
changeset
|
75 src = self._source |
84fc72a17f7a
sources: Changes in related contents management.
Ludovic Chabant <ludovic@chabant.com>
parents:
866
diff
changeset
|
76 app = src.app |
1058
f6b975db2545
data: Make `family` properties return lists instead of generators.
Ludovic Chabant <ludovic@chabant.com>
parents:
1055
diff
changeset
|
77 sibs = [] |
977
84fc72a17f7a
sources: Changes in related contents management.
Ludovic Chabant <ludovic@chabant.com>
parents:
866
diff
changeset
|
78 for i in self._getAllSiblings(): |
979
45ad976712ec
tests: Big push to get the tests to pass again.
Ludovic Chabant <ludovic@chabant.com>
parents:
977
diff
changeset
|
79 if not i.is_group: |
977
84fc72a17f7a
sources: Changes in related contents management.
Ludovic Chabant <ludovic@chabant.com>
parents:
866
diff
changeset
|
80 ipage = app.getPage(src, i) |
1055
7e4742a60d14
data: Add new properties and folder support to the `family` data endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
989
diff
changeset
|
81 ipage_data = self._makePageData(ipage) |
1058
f6b975db2545
data: Make `family` properties return lists instead of generators.
Ludovic Chabant <ludovic@chabant.com>
parents:
1055
diff
changeset
|
82 sibs.append(ipage_data) |
1079
00a0a65d08e6
data: Fix debug rendering of the family data.
Ludovic Chabant <ludovic@chabant.com>
parents:
1058
diff
changeset
|
83 return sibs |
00a0a65d08e6
data: Fix debug rendering of the family data.
Ludovic Chabant <ludovic@chabant.com>
parents:
1058
diff
changeset
|
84 |
00a0a65d08e6
data: Fix debug rendering of the family data.
Ludovic Chabant <ludovic@chabant.com>
parents:
1058
diff
changeset
|
85 @property |
00a0a65d08e6
data: Fix debug rendering of the family data.
Ludovic Chabant <ludovic@chabant.com>
parents:
1058
diff
changeset
|
86 def siblings_all(self): |
00a0a65d08e6
data: Fix debug rendering of the family data.
Ludovic Chabant <ludovic@chabant.com>
parents:
1058
diff
changeset
|
87 src = self._source |
00a0a65d08e6
data: Fix debug rendering of the family data.
Ludovic Chabant <ludovic@chabant.com>
parents:
1058
diff
changeset
|
88 app = src.app |
00a0a65d08e6
data: Fix debug rendering of the family data.
Ludovic Chabant <ludovic@chabant.com>
parents:
1058
diff
changeset
|
89 sibs = [] |
00a0a65d08e6
data: Fix debug rendering of the family data.
Ludovic Chabant <ludovic@chabant.com>
parents:
1058
diff
changeset
|
90 for i in self._getAllSiblings(): |
00a0a65d08e6
data: Fix debug rendering of the family data.
Ludovic Chabant <ludovic@chabant.com>
parents:
1058
diff
changeset
|
91 if not i.is_group: |
00a0a65d08e6
data: Fix debug rendering of the family data.
Ludovic Chabant <ludovic@chabant.com>
parents:
1058
diff
changeset
|
92 ipage = app.getPage(src, i) |
00a0a65d08e6
data: Fix debug rendering of the family data.
Ludovic Chabant <ludovic@chabant.com>
parents:
1058
diff
changeset
|
93 ipage_data = self._makePageData(ipage) |
00a0a65d08e6
data: Fix debug rendering of the family data.
Ludovic Chabant <ludovic@chabant.com>
parents:
1058
diff
changeset
|
94 sibs.append(ipage_data) |
1055
7e4742a60d14
data: Add new properties and folder support to the `family` data endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
989
diff
changeset
|
95 else: |
1058
f6b975db2545
data: Make `family` properties return lists instead of generators.
Ludovic Chabant <ludovic@chabant.com>
parents:
1055
diff
changeset
|
96 sibs.append(self._makeGroupData(i)) |
f6b975db2545
data: Make `family` properties return lists instead of generators.
Ludovic Chabant <ludovic@chabant.com>
parents:
1055
diff
changeset
|
97 return sibs |
1055
7e4742a60d14
data: Add new properties and folder support to the `family` data endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
989
diff
changeset
|
98 |
7e4742a60d14
data: Add new properties and folder support to the `family` data endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
989
diff
changeset
|
99 @property |
7e4742a60d14
data: Add new properties and folder support to the `family` data endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
989
diff
changeset
|
100 def has_children(self): |
1123
1a214de1e1f7
data: Fix bug with page family data not returning correct `is_dir` value.
Ludovic Chabant <ludovic@chabant.com>
parents:
1079
diff
changeset
|
101 return bool(self._getAllChildren()) |
247
d9d5c5de02a8
data: Add a top level wrapper for `Linker`.
Ludovic Chabant <ludovic@chabant.com>
parents:
242
diff
changeset
|
102 |
d9d5c5de02a8
data: Add a top level wrapper for `Linker`.
Ludovic Chabant <ludovic@chabant.com>
parents:
242
diff
changeset
|
103 @property |
d9d5c5de02a8
data: Add a top level wrapper for `Linker`.
Ludovic Chabant <ludovic@chabant.com>
parents:
242
diff
changeset
|
104 def children(self): |
977
84fc72a17f7a
sources: Changes in related contents management.
Ludovic Chabant <ludovic@chabant.com>
parents:
866
diff
changeset
|
105 src = self._source |
84fc72a17f7a
sources: Changes in related contents management.
Ludovic Chabant <ludovic@chabant.com>
parents:
866
diff
changeset
|
106 app = src.app |
1058
f6b975db2545
data: Make `family` properties return lists instead of generators.
Ludovic Chabant <ludovic@chabant.com>
parents:
1055
diff
changeset
|
107 childs = [] |
977
84fc72a17f7a
sources: Changes in related contents management.
Ludovic Chabant <ludovic@chabant.com>
parents:
866
diff
changeset
|
108 for i in self._getAllChildren(): |
84fc72a17f7a
sources: Changes in related contents management.
Ludovic Chabant <ludovic@chabant.com>
parents:
866
diff
changeset
|
109 if not i.is_group: |
84fc72a17f7a
sources: Changes in related contents management.
Ludovic Chabant <ludovic@chabant.com>
parents:
866
diff
changeset
|
110 ipage = app.getPage(src, i) |
1058
f6b975db2545
data: Make `family` properties return lists instead of generators.
Ludovic Chabant <ludovic@chabant.com>
parents:
1055
diff
changeset
|
111 childs.append(self._makePageData(ipage)) |
f6b975db2545
data: Make `family` properties return lists instead of generators.
Ludovic Chabant <ludovic@chabant.com>
parents:
1055
diff
changeset
|
112 return childs |
f6b975db2545
data: Make `family` properties return lists instead of generators.
Ludovic Chabant <ludovic@chabant.com>
parents:
1055
diff
changeset
|
113 |
f6b975db2545
data: Make `family` properties return lists instead of generators.
Ludovic Chabant <ludovic@chabant.com>
parents:
1055
diff
changeset
|
114 @property |
1079
00a0a65d08e6
data: Fix debug rendering of the family data.
Ludovic Chabant <ludovic@chabant.com>
parents:
1058
diff
changeset
|
115 def children_all(self): |
1058
f6b975db2545
data: Make `family` properties return lists instead of generators.
Ludovic Chabant <ludovic@chabant.com>
parents:
1055
diff
changeset
|
116 src = self._source |
f6b975db2545
data: Make `family` properties return lists instead of generators.
Ludovic Chabant <ludovic@chabant.com>
parents:
1055
diff
changeset
|
117 app = src.app |
f6b975db2545
data: Make `family` properties return lists instead of generators.
Ludovic Chabant <ludovic@chabant.com>
parents:
1055
diff
changeset
|
118 childs = [] |
f6b975db2545
data: Make `family` properties return lists instead of generators.
Ludovic Chabant <ludovic@chabant.com>
parents:
1055
diff
changeset
|
119 for i in self._getAllChildren(): |
f6b975db2545
data: Make `family` properties return lists instead of generators.
Ludovic Chabant <ludovic@chabant.com>
parents:
1055
diff
changeset
|
120 if not i.is_group: |
f6b975db2545
data: Make `family` properties return lists instead of generators.
Ludovic Chabant <ludovic@chabant.com>
parents:
1055
diff
changeset
|
121 ipage = app.getPage(src, i) |
f6b975db2545
data: Make `family` properties return lists instead of generators.
Ludovic Chabant <ludovic@chabant.com>
parents:
1055
diff
changeset
|
122 childs.append(self._makePageData(ipage)) |
1055
7e4742a60d14
data: Add new properties and folder support to the `family` data endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
989
diff
changeset
|
123 else: |
1058
f6b975db2545
data: Make `family` properties return lists instead of generators.
Ludovic Chabant <ludovic@chabant.com>
parents:
1055
diff
changeset
|
124 childs.append(self._makeGroupData(i)) |
f6b975db2545
data: Make `family` properties return lists instead of generators.
Ludovic Chabant <ludovic@chabant.com>
parents:
1055
diff
changeset
|
125 return childs |
404
27b10024f8d8
linker: Add ability to return the parent and ancestors of a page.
Ludovic Chabant <ludovic@chabant.com>
parents:
402
diff
changeset
|
126 |
866
d9059257743c
refactor: Make the linker work again.
Ludovic Chabant <ludovic@chabant.com>
parents:
862
diff
changeset
|
127 def forpath(self, path): |
d9059257743c
refactor: Make the linker work again.
Ludovic Chabant <ludovic@chabant.com>
parents:
862
diff
changeset
|
128 # TODO: generalize this for sources that aren't file-system based. |
1058
f6b975db2545
data: Make `family` properties return lists instead of generators.
Ludovic Chabant <ludovic@chabant.com>
parents:
1055
diff
changeset
|
129 item = self._source.findContentFromRoute({'slug': path}) |
866
d9059257743c
refactor: Make the linker work again.
Ludovic Chabant <ludovic@chabant.com>
parents:
862
diff
changeset
|
130 return Linker(self._source, item) |
d9059257743c
refactor: Make the linker work again.
Ludovic Chabant <ludovic@chabant.com>
parents:
862
diff
changeset
|
131 |
1058
f6b975db2545
data: Make `family` properties return lists instead of generators.
Ludovic Chabant <ludovic@chabant.com>
parents:
1055
diff
changeset
|
132 def childrenof(self, path, with_groups=False): |
866
d9059257743c
refactor: Make the linker work again.
Ludovic Chabant <ludovic@chabant.com>
parents:
862
diff
changeset
|
133 # TODO: generalize this for sources that aren't file-system based. |
d9059257743c
refactor: Make the linker work again.
Ludovic Chabant <ludovic@chabant.com>
parents:
862
diff
changeset
|
134 src = self._source |
d9059257743c
refactor: Make the linker work again.
Ludovic Chabant <ludovic@chabant.com>
parents:
862
diff
changeset
|
135 app = src.app |
1058
f6b975db2545
data: Make `family` properties return lists instead of generators.
Ludovic Chabant <ludovic@chabant.com>
parents:
1055
diff
changeset
|
136 item = src.findContentFromRoute({'slug': path}) |
f6b975db2545
data: Make `family` properties return lists instead of generators.
Ludovic Chabant <ludovic@chabant.com>
parents:
1055
diff
changeset
|
137 if item is None: |
f6b975db2545
data: Make `family` properties return lists instead of generators.
Ludovic Chabant <ludovic@chabant.com>
parents:
1055
diff
changeset
|
138 raise ValueError("No such content: %s" % path) |
f6b975db2545
data: Make `family` properties return lists instead of generators.
Ludovic Chabant <ludovic@chabant.com>
parents:
1055
diff
changeset
|
139 |
f6b975db2545
data: Make `family` properties return lists instead of generators.
Ludovic Chabant <ludovic@chabant.com>
parents:
1055
diff
changeset
|
140 group = self._source.getRelatedContents(item, |
f6b975db2545
data: Make `family` properties return lists instead of generators.
Ludovic Chabant <ludovic@chabant.com>
parents:
1055
diff
changeset
|
141 REL_LOGICAL_CHILD_GROUP) |
866
d9059257743c
refactor: Make the linker work again.
Ludovic Chabant <ludovic@chabant.com>
parents:
862
diff
changeset
|
142 if group is not None: |
1058
f6b975db2545
data: Make `family` properties return lists instead of generators.
Ludovic Chabant <ludovic@chabant.com>
parents:
1055
diff
changeset
|
143 childs = [] |
866
d9059257743c
refactor: Make the linker work again.
Ludovic Chabant <ludovic@chabant.com>
parents:
862
diff
changeset
|
144 for i in src.getContents(group): |
d9059257743c
refactor: Make the linker work again.
Ludovic Chabant <ludovic@chabant.com>
parents:
862
diff
changeset
|
145 if not i.is_group: |
d9059257743c
refactor: Make the linker work again.
Ludovic Chabant <ludovic@chabant.com>
parents:
862
diff
changeset
|
146 ipage = app.getPage(src, i) |
1058
f6b975db2545
data: Make `family` properties return lists instead of generators.
Ludovic Chabant <ludovic@chabant.com>
parents:
1055
diff
changeset
|
147 childs.append(self._makePageData(ipage)) |
f6b975db2545
data: Make `family` properties return lists instead of generators.
Ludovic Chabant <ludovic@chabant.com>
parents:
1055
diff
changeset
|
148 elif with_groups: |
f6b975db2545
data: Make `family` properties return lists instead of generators.
Ludovic Chabant <ludovic@chabant.com>
parents:
1055
diff
changeset
|
149 childs.append(self._makeGroupData(i)) |
f6b975db2545
data: Make `family` properties return lists instead of generators.
Ludovic Chabant <ludovic@chabant.com>
parents:
1055
diff
changeset
|
150 return childs |
866
d9059257743c
refactor: Make the linker work again.
Ludovic Chabant <ludovic@chabant.com>
parents:
862
diff
changeset
|
151 return None |
d9059257743c
refactor: Make the linker work again.
Ludovic Chabant <ludovic@chabant.com>
parents:
862
diff
changeset
|
152 |
977
84fc72a17f7a
sources: Changes in related contents management.
Ludovic Chabant <ludovic@chabant.com>
parents:
866
diff
changeset
|
153 def _getAllSiblings(self): |
84fc72a17f7a
sources: Changes in related contents management.
Ludovic Chabant <ludovic@chabant.com>
parents:
866
diff
changeset
|
154 if self._siblings is None: |
84fc72a17f7a
sources: Changes in related contents management.
Ludovic Chabant <ludovic@chabant.com>
parents:
866
diff
changeset
|
155 self._siblings = list(self._source.getContents( |
84fc72a17f7a
sources: Changes in related contents management.
Ludovic Chabant <ludovic@chabant.com>
parents:
866
diff
changeset
|
156 self._getParentGroup())) |
84fc72a17f7a
sources: Changes in related contents management.
Ludovic Chabant <ludovic@chabant.com>
parents:
866
diff
changeset
|
157 return self._siblings |
84fc72a17f7a
sources: Changes in related contents management.
Ludovic Chabant <ludovic@chabant.com>
parents:
866
diff
changeset
|
158 |
84fc72a17f7a
sources: Changes in related contents management.
Ludovic Chabant <ludovic@chabant.com>
parents:
866
diff
changeset
|
159 def _getAllChildren(self): |
84fc72a17f7a
sources: Changes in related contents management.
Ludovic Chabant <ludovic@chabant.com>
parents:
866
diff
changeset
|
160 if self._children is None: |
84fc72a17f7a
sources: Changes in related contents management.
Ludovic Chabant <ludovic@chabant.com>
parents:
866
diff
changeset
|
161 child_group = self._source.getRelatedContents( |
1079
00a0a65d08e6
data: Fix debug rendering of the family data.
Ludovic Chabant <ludovic@chabant.com>
parents:
1058
diff
changeset
|
162 self._content_item, REL_LOGICAL_CHILD_GROUP) |
977
84fc72a17f7a
sources: Changes in related contents management.
Ludovic Chabant <ludovic@chabant.com>
parents:
866
diff
changeset
|
163 if child_group is not None: |
84fc72a17f7a
sources: Changes in related contents management.
Ludovic Chabant <ludovic@chabant.com>
parents:
866
diff
changeset
|
164 self._children = list( |
84fc72a17f7a
sources: Changes in related contents management.
Ludovic Chabant <ludovic@chabant.com>
parents:
866
diff
changeset
|
165 self._source.getContents(child_group)) |
84fc72a17f7a
sources: Changes in related contents management.
Ludovic Chabant <ludovic@chabant.com>
parents:
866
diff
changeset
|
166 else: |
84fc72a17f7a
sources: Changes in related contents management.
Ludovic Chabant <ludovic@chabant.com>
parents:
866
diff
changeset
|
167 self._children = [] |
84fc72a17f7a
sources: Changes in related contents management.
Ludovic Chabant <ludovic@chabant.com>
parents:
866
diff
changeset
|
168 return self._children |
84fc72a17f7a
sources: Changes in related contents management.
Ludovic Chabant <ludovic@chabant.com>
parents:
866
diff
changeset
|
169 |
84fc72a17f7a
sources: Changes in related contents management.
Ludovic Chabant <ludovic@chabant.com>
parents:
866
diff
changeset
|
170 def _getParentGroup(self): |
866
d9059257743c
refactor: Make the linker work again.
Ludovic Chabant <ludovic@chabant.com>
parents:
862
diff
changeset
|
171 if self._parent_group is _unloaded: |
977
84fc72a17f7a
sources: Changes in related contents management.
Ludovic Chabant <ludovic@chabant.com>
parents:
866
diff
changeset
|
172 self._parent_group = self._source.getRelatedContents( |
84fc72a17f7a
sources: Changes in related contents management.
Ludovic Chabant <ludovic@chabant.com>
parents:
866
diff
changeset
|
173 self._content_item, REL_PARENT_GROUP) |
84fc72a17f7a
sources: Changes in related contents management.
Ludovic Chabant <ludovic@chabant.com>
parents:
866
diff
changeset
|
174 return self._parent_group |
866
d9059257743c
refactor: Make the linker work again.
Ludovic Chabant <ludovic@chabant.com>
parents:
862
diff
changeset
|
175 |
1055
7e4742a60d14
data: Add new properties and folder support to the `family` data endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
989
diff
changeset
|
176 def _makePageData(self, page): |
1123
1a214de1e1f7
data: Fix bug with page family data not returning correct `is_dir` value.
Ludovic Chabant <ludovic@chabant.com>
parents:
1079
diff
changeset
|
177 is_self = page.content_spec == self._content_item.spec |
1a214de1e1f7
data: Fix bug with page family data not returning correct `is_dir` value.
Ludovic Chabant <ludovic@chabant.com>
parents:
1079
diff
changeset
|
178 return _PageData(page, is_self) |
1055
7e4742a60d14
data: Add new properties and folder support to the `family` data endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
989
diff
changeset
|
179 |
7e4742a60d14
data: Add new properties and folder support to the `family` data endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
989
diff
changeset
|
180 def _makeGroupData(self, group): |
7e4742a60d14
data: Add new properties and folder support to the `family` data endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
989
diff
changeset
|
181 return _GroupData(self._source, group) |
7e4742a60d14
data: Add new properties and folder support to the `family` data endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
989
diff
changeset
|
182 |
590
3cca1f6bd610
debug: Fix how the linker shows children/siblings/etc. in the debug window.
Ludovic Chabant <ludovic@chabant.com>
parents:
518
diff
changeset
|
183 def _debugRenderAncestors(self): |
866
d9059257743c
refactor: Make the linker work again.
Ludovic Chabant <ludovic@chabant.com>
parents:
862
diff
changeset
|
184 return [i.title for i in self.ancestors] |
590
3cca1f6bd610
debug: Fix how the linker shows children/siblings/etc. in the debug window.
Ludovic Chabant <ludovic@chabant.com>
parents:
518
diff
changeset
|
185 |
3cca1f6bd610
debug: Fix how the linker shows children/siblings/etc. in the debug window.
Ludovic Chabant <ludovic@chabant.com>
parents:
518
diff
changeset
|
186 def _debugRenderSiblings(self): |
866
d9059257743c
refactor: Make the linker work again.
Ludovic Chabant <ludovic@chabant.com>
parents:
862
diff
changeset
|
187 return [i.title for i in self.siblings] |
590
3cca1f6bd610
debug: Fix how the linker shows children/siblings/etc. in the debug window.
Ludovic Chabant <ludovic@chabant.com>
parents:
518
diff
changeset
|
188 |
3cca1f6bd610
debug: Fix how the linker shows children/siblings/etc. in the debug window.
Ludovic Chabant <ludovic@chabant.com>
parents:
518
diff
changeset
|
189 def _debugRenderChildren(self): |
866
d9059257743c
refactor: Make the linker work again.
Ludovic Chabant <ludovic@chabant.com>
parents:
862
diff
changeset
|
190 return [i.title for i in self.children] |
590
3cca1f6bd610
debug: Fix how the linker shows children/siblings/etc. in the debug window.
Ludovic Chabant <ludovic@chabant.com>
parents:
518
diff
changeset
|
191 |
1055
7e4742a60d14
data: Add new properties and folder support to the `family` data endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
989
diff
changeset
|
192 |
7e4742a60d14
data: Add new properties and folder support to the `family` data endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
989
diff
changeset
|
193 class _PageData(PaginationData): |
1123
1a214de1e1f7
data: Fix bug with page family data not returning correct `is_dir` value.
Ludovic Chabant <ludovic@chabant.com>
parents:
1079
diff
changeset
|
194 def __init__(self, page, is_self): |
1055
7e4742a60d14
data: Add new properties and folder support to the `family` data endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
989
diff
changeset
|
195 super().__init__(page) |
1123
1a214de1e1f7
data: Fix bug with page family data not returning correct `is_dir` value.
Ludovic Chabant <ludovic@chabant.com>
parents:
1079
diff
changeset
|
196 self.is_self = is_self |
1a214de1e1f7
data: Fix bug with page family data not returning correct `is_dir` value.
Ludovic Chabant <ludovic@chabant.com>
parents:
1079
diff
changeset
|
197 self.is_page = True |
1055
7e4742a60d14
data: Add new properties and folder support to the `family` data endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
989
diff
changeset
|
198 |
7e4742a60d14
data: Add new properties and folder support to the `family` data endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
989
diff
changeset
|
199 def _load(self): |
7e4742a60d14
data: Add new properties and folder support to the `family` data endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
989
diff
changeset
|
200 super()._load() |
1123
1a214de1e1f7
data: Fix bug with page family data not returning correct `is_dir` value.
Ludovic Chabant <ludovic@chabant.com>
parents:
1079
diff
changeset
|
201 self._mapLoader('is_dir', lambda d, n: self.family.has_children) |
1a214de1e1f7
data: Fix bug with page family data not returning correct `is_dir` value.
Ludovic Chabant <ludovic@chabant.com>
parents:
1079
diff
changeset
|
202 self._mapLoader('is_group', lambda d, n: self.family.has_children) |
1055
7e4742a60d14
data: Add new properties and folder support to the `family` data endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
989
diff
changeset
|
203 |
7e4742a60d14
data: Add new properties and folder support to the `family` data endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
989
diff
changeset
|
204 |
7e4742a60d14
data: Add new properties and folder support to the `family` data endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
989
diff
changeset
|
205 class _GroupData: |
7e4742a60d14
data: Add new properties and folder support to the `family` data endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
989
diff
changeset
|
206 def __init__(self, source, group_item): |
7e4742a60d14
data: Add new properties and folder support to the `family` data endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
989
diff
changeset
|
207 self._source = source |
7e4742a60d14
data: Add new properties and folder support to the `family` data endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
989
diff
changeset
|
208 self._group_item = group_item |
7e4742a60d14
data: Add new properties and folder support to the `family` data endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
989
diff
changeset
|
209 self.is_page = False |
7e4742a60d14
data: Add new properties and folder support to the `family` data endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
989
diff
changeset
|
210 self.is_dir = True |
7e4742a60d14
data: Add new properties and folder support to the `family` data endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
989
diff
changeset
|
211 self.is_group = True |
7e4742a60d14
data: Add new properties and folder support to the `family` data endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
989
diff
changeset
|
212 self.family = Linker(source, group_item) |