Mercurial > piecrust2
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 |