Mercurial > piecrust2
comparison piecrust/data/builder.py @ 3:f485ba500df3
Gigantic change to basically make PieCrust 2 vaguely functional.
- Serving works, with debug window.
- Baking works, multi-threading, with dependency handling.
- Various things not implemented yet.
| author | Ludovic Chabant <ludovic@chabant.com> |
|---|---|
| date | Sun, 10 Aug 2014 23:43:16 -0700 |
| parents | |
| children | 474c9882decf |
comparison
equal
deleted
inserted
replaced
| 2:40fa08b261b9 | 3:f485ba500df3 |
|---|---|
| 1 import time | |
| 2 import logging | |
| 3 from piecrust.configuration import merge_dicts | |
| 4 from piecrust.data.assetor import Assetor | |
| 5 from piecrust.data.debug import build_debug_info | |
| 6 from piecrust.data.linker import Linker | |
| 7 from piecrust.data.paginator import Paginator | |
| 8 | |
| 9 | |
| 10 logger = logging.getLogger(__name__) | |
| 11 | |
| 12 | |
| 13 class DataBuildingContext(object): | |
| 14 def __init__(self, page, uri, page_num=1): | |
| 15 self.page = page | |
| 16 self.uri = uri | |
| 17 self.page_num = page_num | |
| 18 self.pagination_source = None | |
| 19 self.pagination_filter = None | |
| 20 | |
| 21 | |
| 22 def build_page_data(ctx): | |
| 23 page = ctx.page | |
| 24 app = page.app | |
| 25 | |
| 26 pgn_source = ctx.pagination_source or get_default_pagination_source(page) | |
| 27 paginator = Paginator(page, pgn_source, ctx.uri, ctx.page_num, | |
| 28 ctx.pagination_filter) | |
| 29 assetor = Assetor(page, ctx.uri) | |
| 30 linker = Linker(page) | |
| 31 data = { | |
| 32 'piecrust': build_piecrust_data(), | |
| 33 'page': dict(page.config.get()), | |
| 34 'assets': assetor, | |
| 35 'pagination': paginator, | |
| 36 'siblings': linker, | |
| 37 'family': linker | |
| 38 } | |
| 39 page_data = data['page'] | |
| 40 page_data['url'] = ctx.uri | |
| 41 page_data['timestamp'] = time.mktime(page.datetime.timetuple()) | |
| 42 date_format = app.config.get('site/date_format') | |
| 43 if date_format: | |
| 44 page_data['date'] = page.datetime.strftime(date_format) | |
| 45 | |
| 46 #TODO: handle slugified taxonomy terms. | |
| 47 | |
| 48 site_data = build_site_data(page) | |
| 49 merge_dicts(data, site_data) | |
| 50 | |
| 51 # Do this at the end because we want all the data to be ready to be | |
| 52 # displayed in the debugger window. | |
| 53 if (app.debug and app.config.get('site/enable_debug_info') and | |
| 54 not app.config.get('baker/is_baking')): | |
| 55 data['piecrust']['debug_info'] = build_debug_info(page, data) | |
| 56 | |
| 57 return data | |
| 58 | |
| 59 | |
| 60 def build_layout_data(page, page_data, contents): | |
| 61 data = dict(page_data) | |
| 62 for name, txt in contents.iteritems(): | |
| 63 if name in data: | |
| 64 logger.warning("Content segment '%s' will hide existing data." % | |
| 65 name) | |
| 66 data[name] = txt | |
| 67 return data | |
| 68 | |
| 69 | |
| 70 try: | |
| 71 from piecrust.__version__ import VERSION | |
| 72 except ImportError: | |
| 73 from piecrust import APP_VERSION as VERSION | |
| 74 | |
| 75 | |
| 76 def build_piecrust_data(): | |
| 77 data = { | |
| 78 'version': VERSION, | |
| 79 'url': 'http://bolt80.com/piecrust/', | |
| 80 'branding': 'Baked with <em><a href="%s">PieCrust</a> %s</em>.' % ( | |
| 81 'http://bolt80.com/piecrust/', VERSION) | |
| 82 } | |
| 83 return data | |
| 84 | |
| 85 | |
| 86 def build_site_data(page): | |
| 87 app = page.app | |
| 88 data = dict(app.config.get()) | |
| 89 for source in app.sources: | |
| 90 endpoint_bits = source.data_endpoint.split('/') | |
| 91 endpoint = data | |
| 92 for e in endpoint_bits[:-1]: | |
| 93 if e not in endpoint: | |
| 94 endpoint[e] = {} | |
| 95 endpoint = endpoint[e] | |
| 96 user_data = endpoint.get(endpoint_bits[-1]) | |
| 97 provider = source.buildDataProvider(page, user_data) | |
| 98 if endpoint_bits[-1] in endpoint: | |
| 99 provider.user_data = endpoint[endpoint_bits[-1]] | |
| 100 endpoint[endpoint_bits[-1]] = provider | |
| 101 return data | |
| 102 | |
| 103 | |
| 104 def get_default_pagination_source(page): | |
| 105 app = page.app | |
| 106 source_name = page.config.get('source') or page.config.get('blog') | |
| 107 logger.debug("Got source name %s for page %s" % (source_name, page.path)) | |
| 108 if source_name is None: | |
| 109 blog_names = app.config.get('site/blogs') | |
| 110 if blog_names is not None: | |
| 111 source_name = blog_names[0] | |
| 112 else: | |
| 113 source_name = app.sources[0].name | |
| 114 source = app.getSource(source_name) | |
| 115 return source | |
| 116 |
