annotate piecrust/data/linker.py @ 1188:a7c43131d871

bake: Fix file write flushing problem with Python 3.8+ Writing the cache files fails in Python 3.8 because it looks like flushing behaviour has changed. We need to explicitly flush. And even then, in very rare occurrences, it looks like it can still run into racing conditions, so we do a very hacky and ugly "retry" loop when fetching cached data :(
author Ludovic Chabant <ludovic@chabant.com>
date Tue, 15 Jun 2021 22:36:23 -0700
parents 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)