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')