comparison piecrust/data/base.py @ 226:e9dc18a275ff

data: Add ability for `IPaginationSource`s to specify how to get settings. The `IPaginationSource` has a new `getSettingAccessor` method that returns how to access settings values on items in the pagination source. A default accessor is also available, which uses standard attribute lookup. Also clean some stuff in `LazyPageConfigData`.
author Ludovic Chabant <ludovic@chabant.com>
date Wed, 04 Feb 2015 23:49:52 -0800
parents 1187739e5a19
children 8015fb40c28b
comparison
equal deleted inserted replaced
225:a75d024ee839 226:e9dc18a275ff
24 raise NotImplementedError() 24 raise NotImplementedError()
25 25
26 def getPaginationFilter(self, page): 26 def getPaginationFilter(self, page):
27 raise NotImplementedError() 27 raise NotImplementedError()
28 28
29 def getSetting(self, item, setting_name):
30 raise NotImplementedError()
31
29 32
30 class LazyPageConfigData(object): 33 class LazyPageConfigData(object):
31 """ An object that represents the configuration header of a page, 34 """ An object that represents the configuration header of a page,
32 but also allows for additional data. It's meant to be exposed 35 but also allows for additional data. It's meant to be exposed
33 to the templating system. 36 to the templating system.
42 45
43 @property 46 @property
44 def page(self): 47 def page(self):
45 return self._page 48 return self._page
46 49
50 def get(self, name):
51 try:
52 return self._getValue(name)
53 except KeyError:
54 return None
55
47 def __getattr__(self, name): 56 def __getattr__(self, name):
48 try: 57 try:
49 return self.getValue(name) 58 return self._getValue(name)
50 except KeyError: 59 except KeyError:
51 raise AttributeError 60 raise AttributeError
52 61
53 def __getitem__(self, name): 62 def __getitem__(self, name):
54 return self.getValue(name) 63 return self._getValue(name)
55 64
56 def getValue(self, name): 65 def _getValue(self, name):
57 self._load() 66 self._load()
58 67
59 if self._loaders: 68 if self._loaders:
60 loader = self._loaders.get(name) 69 loader = self._loaders.get(name)
61 if loader is not None: 70 if loader is not None:
74 if len(self._loaders) == 0: 83 if len(self._loaders) == 0:
75 self._loaders = None 84 self._loaders = None
76 85
77 return self._values[name] 86 return self._values[name]
78 87
79 def setValue(self, name, value): 88 def _setValue(self, name, value):
89 if self._values is None:
90 raise Exception("Can't call _setValue before this data has been "
91 "loaded")
80 self._values[name] = value 92 self._values[name] = value
81 93
82 def mapLoader(self, attr_name, loader): 94 def mapLoader(self, attr_name, loader):
83 if loader is None: 95 if loader is None:
84 if self._loaders is None or attr_name not in self._loaders: 96 if self._loaders is None or attr_name not in self._loaders:
128 raise Exception("Can't get route for page: %s" % page.path) 140 raise Exception("Can't get route for page: %s" % page.path)
129 return route.getUri(page.source_metadata, page) 141 return route.getUri(page.source_metadata, page)
130 142
131 def _loadCustom(self): 143 def _loadCustom(self):
132 page_url = self._get_uri() 144 page_url = self._get_uri()
133 self.setValue('url', page_url) 145 self._setValue('url', page_url)
134 self.setValue('slug', get_slug(self._page.app, page_url)) 146 self._setValue('slug', get_slug(self._page.app, page_url))
135 self.setValue( 147 self._setValue(
136 'timestamp', 148 'timestamp',
137 time.mktime(self.page.datetime.timetuple())) 149 time.mktime(self.page.datetime.timetuple()))
138 date_format = self.page.app.config.get('site/date_format') 150 date_format = self.page.app.config.get('site/date_format')
139 if date_format: 151 if date_format:
140 self.setValue('date', self.page.datetime.strftime(date_format)) 152 self._setValue('date', self.page.datetime.strftime(date_format))
141 153
142 assetor = Assetor(self.page, page_url) 154 assetor = Assetor(self.page, page_url)
143 self.setValue('assets', assetor) 155 self._setValue('assets', assetor)
144 156
145 segment_names = self.page.config.get('segments') 157 segment_names = self.page.config.get('segments')
146 for name in segment_names: 158 for name in segment_names:
147 self.mapLoader(name, self._load_rendered_segment) 159 self.mapLoader(name, self._load_rendered_segment)
148 160
172 for name in self.page.config.get('segments'): 184 for name in self.page.config.get('segments'):
173 segs[name] = "<unavailable: current page>" 185 segs[name] = "<unavailable: current page>"
174 186
175 for k, v in segs.items(): 187 for k, v in segs.items():
176 self.mapLoader(k, None) 188 self.mapLoader(k, None)
177 self.setValue(k, v) 189 self._setValue(k, v)
178 190
179 if 'content.abstract' in segs: 191 if 'content.abstract' in segs:
180 self.setValue('content', segs['content.abstract']) 192 self._setValue('content', segs['content.abstract'])
181 self.setValue('has_more', True) 193 self._setValue('has_more', True)
182 if name == 'content': 194 if name == 'content':
183 return segs['content.abstract'] 195 return segs['content.abstract']
184 196
185 return segs[name] 197 return segs[name]
186 198