comparison piecrust/data/base.py @ 6:f5ca5c5bed85

More Python 3 fixes, modularization, and new unit tests.
author Ludovic Chabant <ludovic@chabant.com>
date Sat, 16 Aug 2014 08:15:30 -0700
parents 474c9882decf
children 30a42341cfa8
comparison
equal deleted inserted replaced
5:474c9882decf 6:f5ca5c5bed85
2 import logging 2 import logging
3 from piecrust.data.assetor import Assetor 3 from piecrust.data.assetor import Assetor
4 4
5 5
6 logger = logging.getLogger(__name__) 6 logger = logging.getLogger(__name__)
7
8
9 class IPaginationSource(object):
10 def getItemsPerPage(self):
11 raise NotImplementedError()
12
13 def getSourceIterator(self):
14 raise NotImplementedError()
15
16 def getSorterIterator(self, it):
17 raise NotImplementedError()
18
19 def getTailIterator(self, it):
20 raise NotImplementedError()
21
22 def getPaginationFilter(self, page):
23 raise NotImplementedError()
7 24
8 25
9 class LazyPageConfigData(object): 26 class LazyPageConfigData(object):
10 """ An object that represents the configuration header of a page, 27 """ An object that represents the configuration header of a page,
11 but also allows for additional data. It's meant to be exposed 28 but also allows for additional data. It's meant to be exposed
76 93
77 def _loadCustom(self): 94 def _loadCustom(self):
78 pass 95 pass
79 96
80 97
81 def build_uri(page):
82 route = page.app.getRoute(page.source.name, page.source_metadata)
83 if route is None:
84 raise Exception("Can't get route for page: %s" % page.path)
85 return route.getUri(page.source_metadata)
86
87
88 def load_rendered_segment(data, name):
89 from piecrust.rendering import PageRenderingContext, render_page_segments
90
91 uri = build_uri(data.page)
92 try:
93 ctx = PageRenderingContext(data.page, uri)
94 segs = render_page_segments(ctx)
95 except Exception as e:
96 logger.exception("Error rendering segments for '%s': %s" % (uri, e))
97 raise
98
99 for k, v in segs.items():
100 data.mapLoader(k, None)
101 data.setValue(k, v)
102
103 if 'content.abstract' in segs:
104 data.setValue('content', segs['content.abstract'])
105 data.setValue('has_more', True)
106 if name == 'content':
107 return segs['content.abstract']
108
109 return segs[name]
110
111
112 class PaginationData(LazyPageConfigData): 98 class PaginationData(LazyPageConfigData):
113 def __init__(self, page): 99 def __init__(self, page):
114 super(PaginationData, self).__init__(page) 100 super(PaginationData, self).__init__(page)
115 101
102 def _get_uri(self):
103 page = self._page
104 route = page.app.getRoute(page.source.name, page.source_metadata)
105 if route is None:
106 raise Exception("Can't get route for page: %s" % page.path)
107 return route.getUri(page.source_metadata)
108
116 def _loadCustom(self): 109 def _loadCustom(self):
117 page_url = build_uri(self.page) 110 page_url = self._get_uri()
118 self.setValue('url', page_url) 111 self.setValue('url', page_url)
119 self.setValue('slug', page_url) 112 self.setValue('slug', page_url)
120 self.setValue('timestamp', 113 self.setValue('timestamp',
121 time.mktime(self.page.datetime.timetuple())) 114 time.mktime(self.page.datetime.timetuple()))
122 date_format = self.page.app.config.get('site/date_format') 115 date_format = self.page.app.config.get('site/date_format')
126 assetor = Assetor(self.page, page_url) 119 assetor = Assetor(self.page, page_url)
127 self.setValue('assets', assetor) 120 self.setValue('assets', assetor)
128 121
129 segment_names = self.page.config.get('segments') 122 segment_names = self.page.config.get('segments')
130 for name in segment_names: 123 for name in segment_names:
131 self.mapLoader(name, load_rendered_segment) 124 self.mapLoader(name, self._load_rendered_segment)
132 125
126 def _load_rendered_segment(self, data, name):
127 from piecrust.rendering import PageRenderingContext, render_page_segments
128
129 assert self is data
130 uri = self._get_uri()
131 try:
132 ctx = PageRenderingContext(self._page, uri)
133 segs = render_page_segments(ctx)
134 except Exception as e:
135 logger.exception("Error rendering segments for '%s': %s" % (uri, e))
136 raise
137
138 for k, v in segs.items():
139 self.mapLoader(k, None)
140 self.setValue(k, v)
141
142 if 'content.abstract' in segs:
143 self.setValue('content', segs['content.abstract'])
144 self.setValue('has_more', True)
145 if name == 'content':
146 return segs['content.abstract']
147
148 return segs[name]
149