Mercurial > piecrust2
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 |
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) |