Mercurial > piecrust2
diff 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 |
line wrap: on
line diff
--- a/piecrust/data/base.py Tue Feb 03 21:04:55 2015 -0800 +++ b/piecrust/data/base.py Wed Feb 04 23:49:52 2015 -0800 @@ -26,6 +26,9 @@ def getPaginationFilter(self, page): raise NotImplementedError() + def getSetting(self, item, setting_name): + raise NotImplementedError() + class LazyPageConfigData(object): """ An object that represents the configuration header of a page, @@ -44,16 +47,22 @@ def page(self): return self._page + def get(self, name): + try: + return self._getValue(name) + except KeyError: + return None + def __getattr__(self, name): try: - return self.getValue(name) + return self._getValue(name) except KeyError: raise AttributeError def __getitem__(self, name): - return self.getValue(name) + return self._getValue(name) - def getValue(self, name): + def _getValue(self, name): self._load() if self._loaders: @@ -76,7 +85,10 @@ return self._values[name] - def setValue(self, name, value): + def _setValue(self, name, value): + if self._values is None: + raise Exception("Can't call _setValue before this data has been " + "loaded") self._values[name] = value def mapLoader(self, attr_name, loader): @@ -130,17 +142,17 @@ def _loadCustom(self): page_url = self._get_uri() - self.setValue('url', page_url) - self.setValue('slug', get_slug(self._page.app, page_url)) - self.setValue( + self._setValue('url', page_url) + self._setValue('slug', get_slug(self._page.app, page_url)) + self._setValue( 'timestamp', time.mktime(self.page.datetime.timetuple())) date_format = self.page.app.config.get('site/date_format') if date_format: - self.setValue('date', self.page.datetime.strftime(date_format)) + self._setValue('date', self.page.datetime.strftime(date_format)) assetor = Assetor(self.page, page_url) - self.setValue('assets', assetor) + self._setValue('assets', assetor) segment_names = self.page.config.get('segments') for name in segment_names: @@ -174,11 +186,11 @@ for k, v in segs.items(): self.mapLoader(k, None) - self.setValue(k, v) + self._setValue(k, v) if 'content.abstract' in segs: - self.setValue('content', segs['content.abstract']) - self.setValue('has_more', True) + self._setValue('content', segs['content.abstract']) + self._setValue('has_more', True) if name == 'content': return segs['content.abstract']