Mercurial > piecrust2
changeset 1055:7e4742a60d14
data: Add new properties and folder support to the `family` data endpoint.
* Add `root` and `myself`.
* Return groups as part of the children.
author | Ludovic Chabant <ludovic@chabant.com> |
---|---|
date | Wed, 31 Jan 2018 08:53:27 -0800 |
parents | 75f1b4460491 |
children | f6b0c6fe6e47 |
files | piecrust/data/linker.py piecrust/data/paginationdata.py |
diffstat | 2 files changed, 66 insertions(+), 7 deletions(-) [+] |
line wrap: on
line diff
--- a/piecrust/data/linker.py Wed Jan 31 08:50:39 2018 -0800 +++ b/piecrust/data/linker.py Wed Jan 31 08:53:27 2018 -0800 @@ -41,6 +41,18 @@ return None @property + def root(self): + a = self.ancestors + if a: + return a[-1] + return self.myself + + @property + def myself(self): + page = self._source.app.getPage(self._source, self._content_item) + return self._makePageData(page) + + @property def ancestors(self): if self._ancestors is None: src = self._source @@ -53,7 +65,7 @@ REL_LOGICAL_PARENT_ITEM) if pi is not None: pipage = app.getPage(src, pi) - self._ancestors.append(PaginationData(pipage)) + self._ancestors.append(self._makePageData(pipage)) cur_group = src.getRelatedContents( pi, REL_PARENT_GROUP) else: @@ -67,10 +79,14 @@ for i in self._getAllSiblings(): if not i.is_group: ipage = app.getPage(src, i) - ipage_data = PaginationData(ipage) - ipage_data._setValue('is_self', - i.spec == self._content_item.spec) + ipage_data = self._makePageData(ipage) yield ipage_data + else: + yield self._makeGroupData(i) + + @property + def has_children(self): + return bool(self.children) @property def children(self): @@ -79,7 +95,9 @@ for i in self._getAllChildren(): if not i.is_group: ipage = app.getPage(src, i) - yield PaginationData(ipage) + yield self._makePageData(ipage) + else: + yield self._makeGroupData(i) def forpath(self, path): # TODO: generalize this for sources that aren't file-system based. @@ -97,7 +115,9 @@ for i in src.getContents(group): if not i.is_group: ipage = app.getPage(src, i) - yield PaginationData(ipage) + yield self._makePageData(ipage) + else: + yield self._makeGroupData(i) return None def _getAllSiblings(self): @@ -123,6 +143,12 @@ self._content_item, REL_PARENT_GROUP) return self._parent_group + def _makePageData(self, page): + return _PageData(self, page) + + def _makeGroupData(self, group): + return _GroupData(self._source, group) + def _debugRenderAncestors(self): return [i.title for i in self.ancestors] @@ -132,3 +158,28 @@ def _debugRenderChildren(self): return [i.title for i in self.children] + +class _PageData(PaginationData): + def __init__(self, linker, page): + super().__init__(page) + self._linker = linker + + def _load(self): + super()._load() + self._mapValue('is_page', True) + self._mapValue( + 'is_self', + self._page.content_spec == self._linker._content_item.spec) + + self._mapLoader('is_dir', lambda d, n: self._linker.has_children) + self._mapLoader('is_group', lambda d, n: self._linker.has_children) + + +class _GroupData: + def __init__(self, source, group_item): + self._source = source + self._group_item = group_item + self.is_page = False + self.is_dir = True + self.is_group = True + self.family = Linker(source, group_item)
--- a/piecrust/data/paginationdata.py Wed Jan 31 08:50:39 2018 -0800 +++ b/piecrust/data/paginationdata.py Wed Jan 31 08:53:27 2018 -0800 @@ -9,8 +9,10 @@ class PaginationData(LazyPageConfigData): - def __init__(self, page): + def __init__(self, page, extra_data=None): super().__init__(page) + if extra_data: + self._values.update(extra_data) def _load(self): from piecrust.uriutil import split_uri @@ -30,6 +32,7 @@ self._mapLoader('timestamp', _load_timestamp) self._mapLoader('mtime', _load_content_mtime) self._mapLoader('assets', _load_assets) + self._mapLoader('family', _load_family) segment_names = page.config.get('segments') for name in segment_names: @@ -42,6 +45,11 @@ return Assetor(data._page) +def _load_family(data, name): + from piecrust.data.linker import Linker + return Linker(data._page.source, data._page.content_item) + + def _load_date(data, name): page = data._page date_format = page.app.config.get('site/date_format')