annotate piecrust/data/linker.py @ 1156:4ea64255eadf

sources: Add ability to force a realm on a source.
author Ludovic Chabant <ludovic@chabant.com>
date Tue, 11 Jun 2019 15:12:47 -0700
parents 1a214de1e1f7
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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)