Mercurial > piecrust2
annotate piecrust/generation/base.py @ 837:ad8f48a31c62
assets: Fix crash when a page doesn't have assets.
author | Ludovic Chabant <ludovic@chabant.com> |
---|---|
date | Sun, 05 Feb 2017 22:52:01 -0800 |
parents | 69d16e1afb95 |
children |
rev | line source |
---|---|
785
661f7ba15762
bug: Fix possible crash with overlapping pages.
Ludovic Chabant <ludovic@chabant.com>
parents:
723
diff
changeset
|
1 import logging |
711
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
2 from werkzeug.utils import cached_property |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
3 from piecrust.baking.records import BakeRecordEntry |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
4 from piecrust.baking.worker import save_factory, JOB_BAKE |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
5 from piecrust.configuration import ConfigurationError |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
6 from piecrust.routing import create_route_metadata |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
7 from piecrust.sources.pageref import PageRef |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
8 |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
9 |
785
661f7ba15762
bug: Fix possible crash with overlapping pages.
Ludovic Chabant <ludovic@chabant.com>
parents:
723
diff
changeset
|
10 logger = logging.getLogger(__name__) |
661f7ba15762
bug: Fix possible crash with overlapping pages.
Ludovic Chabant <ludovic@chabant.com>
parents:
723
diff
changeset
|
11 |
661f7ba15762
bug: Fix possible crash with overlapping pages.
Ludovic Chabant <ludovic@chabant.com>
parents:
723
diff
changeset
|
12 |
711
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
13 class InvalidRecordExtraKey(Exception): |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
14 pass |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
15 |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
16 |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
17 class PageGeneratorBakeContext(object): |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
18 def __init__(self, app, record, pool, generator): |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
19 self._app = app |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
20 self._record = record |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
21 self._pool = pool |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
22 self._generator = generator |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
23 self._job_queue = [] |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
24 self._is_running = False |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
25 |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
26 def getRecordExtraKey(self, seed): |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
27 return '%s:%s' % (self._generator.name, seed) |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
28 |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
29 def matchesRecordExtraKey(self, extra_key): |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
30 return (extra_key is not None and |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
31 extra_key.startswith(self._generator.name + ':')) |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
32 |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
33 def getSeedFromRecordExtraKey(self, extra_key): |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
34 if not self.matchesRecordExtraKey(extra_key): |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
35 raise InvalidRecordExtraKey("Invalid extra key: %s" % extra_key) |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
36 return extra_key[len(self._generator.name) + 1:] |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
37 |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
38 def getAllPageRecords(self): |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
39 return self._record.transitions.values() |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
40 |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
41 def getBakedPageRecords(self): |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
42 for prev, cur in self.getAllPageRecords(): |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
43 if cur and cur.was_any_sub_baked: |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
44 yield (prev, cur) |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
45 |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
46 def collapseRecord(self, entry): |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
47 self._record.collapseEntry(entry) |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
48 |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
49 def queueBakeJob(self, page_fac, route, extra_route_metadata, seed): |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
50 if self._is_running: |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
51 raise Exception("The job queue is running.") |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
52 |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
53 extra_key = self.getRecordExtraKey(seed) |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
54 entry = BakeRecordEntry( |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
55 page_fac.source.name, |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
56 page_fac.path, |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
57 extra_key) |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
58 self._record.addEntry(entry) |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
59 |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
60 page = page_fac.buildPage() |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
61 route_metadata = create_route_metadata(page) |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
62 route_metadata.update(extra_route_metadata) |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
63 uri = route.getUri(route_metadata) |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
64 override_entry = self._record.getOverrideEntry(page.path, uri) |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
65 if override_entry is not None: |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
66 override_source = self.app.getSource( |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
67 override_entry.source_name) |
785
661f7ba15762
bug: Fix possible crash with overlapping pages.
Ludovic Chabant <ludovic@chabant.com>
parents:
723
diff
changeset
|
68 if override_source.realm == page_fac.source.realm: |
661f7ba15762
bug: Fix possible crash with overlapping pages.
Ludovic Chabant <ludovic@chabant.com>
parents:
723
diff
changeset
|
69 entry.errors.append( |
711
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
70 "Page '%s' maps to URL '%s' but is overriden " |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
71 "by page '%s'." % |
785
661f7ba15762
bug: Fix possible crash with overlapping pages.
Ludovic Chabant <ludovic@chabant.com>
parents:
723
diff
changeset
|
72 (page_fac.ref_spec, uri, override_entry.path)) |
661f7ba15762
bug: Fix possible crash with overlapping pages.
Ludovic Chabant <ludovic@chabant.com>
parents:
723
diff
changeset
|
73 logger.error(entry.errors[-1]) |
661f7ba15762
bug: Fix possible crash with overlapping pages.
Ludovic Chabant <ludovic@chabant.com>
parents:
723
diff
changeset
|
74 entry.flags |= BakeRecordEntry.FLAG_OVERRIDEN |
711
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
75 return |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
76 |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
77 route_index = self._app.routes.index(route) |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
78 job = { |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
79 'type': JOB_BAKE, |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
80 'job': { |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
81 'factory_info': save_factory(page_fac), |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
82 'generator_name': self._generator.name, |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
83 'generator_record_key': extra_key, |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
84 'route_index': route_index, |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
85 'route_metadata': route_metadata, |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
86 'dirty_source_names': self._record.dirty_source_names, |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
87 'needs_config': True |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
88 } |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
89 } |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
90 self._job_queue.append(job) |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
91 |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
92 def runJobQueue(self): |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
93 def _handler(res): |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
94 entry = self._record.getCurrentEntry( |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
95 res['path'], res['generator_record_key']) |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
96 entry.config = res['config'] |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
97 entry.subs = res['sub_entries'] |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
98 if res['errors']: |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
99 entry.errors += res['errors'] |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
100 if entry.has_any_error: |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
101 self._record.current.success = False |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
102 |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
103 self._is_running = True |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
104 try: |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
105 ar = self._pool.queueJobs(self._job_queue, handler=_handler) |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
106 ar.wait() |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
107 finally: |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
108 self._is_running = False |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
109 |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
110 |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
111 class PageGenerator(object): |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
112 def __init__(self, app, name, config): |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
113 self.app = app |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
114 self.name = name |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
115 self.config = config or {} |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
116 |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
117 self.source_name = config.get('source') |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
118 if self.source_name is None: |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
119 raise ConfigurationError( |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
120 "Generator '%s' requires a source name" % name) |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
121 |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
122 page_ref = config.get('page') |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
123 if page_ref is None: |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
124 raise ConfigurationError( |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
125 "Generator '%s' requires a listing page ref." % name) |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
126 self.page_ref = PageRef(app, page_ref) |
815
69d16e1afb95
internal: Keep things out of the `PieCrust` class, and other clean-ups.
Ludovic Chabant <ludovic@chabant.com>
parents:
814
diff
changeset
|
127 |
814
aca04e175488
data: Allow page generators to have an associated data provider
Ben Artin <ben@artins.org>
parents:
792
diff
changeset
|
128 self.data_endpoint = config.get('data_endpoint') |
aca04e175488
data: Allow page generators to have an associated data provider
Ben Artin <ben@artins.org>
parents:
792
diff
changeset
|
129 self.data_type = config.get('data_type') |
aca04e175488
data: Allow page generators to have an associated data provider
Ben Artin <ben@artins.org>
parents:
792
diff
changeset
|
130 if self.data_endpoint and not self.data_type: |
aca04e175488
data: Allow page generators to have an associated data provider
Ben Artin <ben@artins.org>
parents:
792
diff
changeset
|
131 raise ConfigurationError( |
815
69d16e1afb95
internal: Keep things out of the `PieCrust` class, and other clean-ups.
Ludovic Chabant <ludovic@chabant.com>
parents:
814
diff
changeset
|
132 "Generator '%s' requires a data type because it has " |
69d16e1afb95
internal: Keep things out of the `PieCrust` class, and other clean-ups.
Ludovic Chabant <ludovic@chabant.com>
parents:
814
diff
changeset
|
133 "a data endpoint." % name) |
69d16e1afb95
internal: Keep things out of the `PieCrust` class, and other clean-ups.
Ludovic Chabant <ludovic@chabant.com>
parents:
814
diff
changeset
|
134 |
814
aca04e175488
data: Allow page generators to have an associated data provider
Ben Artin <ben@artins.org>
parents:
792
diff
changeset
|
135 self._provider_type = None |
711
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
136 |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
137 @cached_property |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
138 def source(self): |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
139 for src in self.app.sources: |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
140 if src.name == self.source_name: |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
141 return src |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
142 raise Exception("Can't find source '%s' for generator '%s'." % ( |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
143 self.source_name, self.name)) |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
144 |
792
58ebf50235a5
routing: Simplify how routes are defined.
Ludovic Chabant <ludovic@chabant.com>
parents:
785
diff
changeset
|
145 def getSupportedRouteParameters(self): |
58ebf50235a5
routing: Simplify how routes are defined.
Ludovic Chabant <ludovic@chabant.com>
parents:
785
diff
changeset
|
146 raise NotImplementedError() |
58ebf50235a5
routing: Simplify how routes are defined.
Ludovic Chabant <ludovic@chabant.com>
parents:
785
diff
changeset
|
147 |
723
606f6d57b5df
routing: Cleanup URL routing and improve page matching.
Ludovic Chabant <ludovic@chabant.com>
parents:
711
diff
changeset
|
148 def getPageFactory(self, route_metadata): |
606f6d57b5df
routing: Cleanup URL routing and improve page matching.
Ludovic Chabant <ludovic@chabant.com>
parents:
711
diff
changeset
|
149 # This will raise `PageNotFoundError` naturally if not found. |
606f6d57b5df
routing: Cleanup URL routing and improve page matching.
Ludovic Chabant <ludovic@chabant.com>
parents:
711
diff
changeset
|
150 return self.page_ref.getFactory() |
606f6d57b5df
routing: Cleanup URL routing and improve page matching.
Ludovic Chabant <ludovic@chabant.com>
parents:
711
diff
changeset
|
151 |
711
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
152 def bake(self, ctx): |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
153 raise NotImplementedError() |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
154 |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
155 def onRouteFunctionUsed(self, route, route_metadata): |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
156 pass |
ab5c6a8ae90a
bake: Replace hard-coded taxonomy support with "generator" system.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
157 |
814
aca04e175488
data: Allow page generators to have an associated data provider
Ben Artin <ben@artins.org>
parents:
792
diff
changeset
|
158 def buildDataProvider(self, page, override): |
aca04e175488
data: Allow page generators to have an associated data provider
Ben Artin <ben@artins.org>
parents:
792
diff
changeset
|
159 if not self._provider_type: |
815
69d16e1afb95
internal: Keep things out of the `PieCrust` class, and other clean-ups.
Ludovic Chabant <ludovic@chabant.com>
parents:
814
diff
changeset
|
160 from piecrust.data.provider import get_data_provider_class |
69d16e1afb95
internal: Keep things out of the `PieCrust` class, and other clean-ups.
Ludovic Chabant <ludovic@chabant.com>
parents:
814
diff
changeset
|
161 self._provider_type = get_data_provider_class(self.app, |
69d16e1afb95
internal: Keep things out of the `PieCrust` class, and other clean-ups.
Ludovic Chabant <ludovic@chabant.com>
parents:
814
diff
changeset
|
162 self.data_type) |
814
aca04e175488
data: Allow page generators to have an associated data provider
Ben Artin <ben@artins.org>
parents:
792
diff
changeset
|
163 return self._provider_type(self, page, override) |