Mercurial > piecrust2
annotate piecrust/admin/views/create.py @ 950:18d6ac20a132
admin: Fix old API calls and bugs when creating new pages.
author | Ludovic Chabant <ludovic@chabant.com> |
---|---|
date | Thu, 05 Oct 2017 00:27:57 -0700 |
parents | 7ecb946bfafd |
children | 0d699f04968c |
rev | line source |
---|---|
587
d4a01a023998
admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
1 import logging |
d4a01a023998
admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
2 from flask import ( |
812
82509bce94ca
internal: PEP8 fixup for admin panel code.
Ludovic Chabant <ludovic@chabant.com>
parents:
778
diff
changeset
|
3 g, request, abort, render_template, url_for, redirect, flash) |
587
d4a01a023998
admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
4 from flask.ext.login import login_required |
886
dcdec4b951a1
admin: Get the admin panel working again.
Ludovic Chabant <ludovic@chabant.com>
parents:
852
diff
changeset
|
5 from piecrust.page import Page |
587
d4a01a023998
admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
6 from piecrust.sources.interfaces import IInteractiveSource |
935
7ecb946bfafd
admin: Lots of fixes for running the admin panel in a WSGI server.
Ludovic Chabant <ludovic@chabant.com>
parents:
889
diff
changeset
|
7 from piecrust.uriutil import split_uri |
772
3885421c29a3
admin: Make the whole FoodTruck site into a blueprint.
Ludovic Chabant <ludovic@chabant.com>
parents:
770
diff
changeset
|
8 from ..blueprint import foodtruck_bp |
587
d4a01a023998
admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
9 from ..views import with_menu_context |
d4a01a023998
admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
10 |
d4a01a023998
admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
11 |
d4a01a023998
admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
12 logger = logging.getLogger(__name__) |
d4a01a023998
admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
13 |
d4a01a023998
admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
14 |
772
3885421c29a3
admin: Make the whole FoodTruck site into a blueprint.
Ludovic Chabant <ludovic@chabant.com>
parents:
770
diff
changeset
|
15 @foodtruck_bp.route('/write/<source_name>', methods=['GET', 'POST']) |
587
d4a01a023998
admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
16 @login_required |
d4a01a023998
admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
17 def write_page(source_name): |
886
dcdec4b951a1
admin: Get the admin panel working again.
Ludovic Chabant <ludovic@chabant.com>
parents:
852
diff
changeset
|
18 pcapp = g.site.piecrust_app |
dcdec4b951a1
admin: Get the admin panel working again.
Ludovic Chabant <ludovic@chabant.com>
parents:
852
diff
changeset
|
19 source = pcapp.getSource(source_name) |
587
d4a01a023998
admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
20 if source is None: |
d4a01a023998
admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
21 abort(400) |
d4a01a023998
admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
22 if not isinstance(source, IInteractiveSource): |
d4a01a023998
admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
23 abort(400) |
d4a01a023998
admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
24 |
d4a01a023998
admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
25 if request.method == 'POST': |
d4a01a023998
admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
26 if 'do_save' in request.form: |
886
dcdec4b951a1
admin: Get the admin panel working again.
Ludovic Chabant <ludovic@chabant.com>
parents:
852
diff
changeset
|
27 return _submit_page_form(pcapp, source) |
587
d4a01a023998
admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
28 abort(400) |
d4a01a023998
admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
29 return _write_page_form(source) |
d4a01a023998
admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
30 |
d4a01a023998
admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
31 |
d4a01a023998
admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
32 def _write_page_form(source): |
d4a01a023998
admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
33 data = {} |
d4a01a023998
admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
34 data['is_new_page'] = True |
d4a01a023998
admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
35 data['source_name'] = source.name |
772
3885421c29a3
admin: Make the whole FoodTruck site into a blueprint.
Ludovic Chabant <ludovic@chabant.com>
parents:
770
diff
changeset
|
36 data['url_postback'] = url_for('.write_page', source_name=source.name) |
587
d4a01a023998
admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
37 data['fields'] = [] |
d4a01a023998
admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
38 for f in source.getInteractiveFields(): |
d4a01a023998
admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
39 data['fields'].append({ |
d4a01a023998
admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
40 'name': f.name, |
d4a01a023998
admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
41 'display_name': f.name, |
d4a01a023998
admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
42 'type': f.field_type, |
d4a01a023998
admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
43 'value': f.default_value}) |
d4a01a023998
admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
44 |
d4a01a023998
admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
45 with_menu_context(data) |
d4a01a023998
admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
46 return render_template('create_page.html', **data) |
d4a01a023998
admin: Add "FoodTruck" admin panel from the side experiment project.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
47 |
886
dcdec4b951a1
admin: Get the admin panel working again.
Ludovic Chabant <ludovic@chabant.com>
parents:
852
diff
changeset
|
48 |
dcdec4b951a1
admin: Get the admin panel working again.
Ludovic Chabant <ludovic@chabant.com>
parents:
852
diff
changeset
|
49 def _submit_page_form(pcapp, source): |
dcdec4b951a1
admin: Get the admin panel working again.
Ludovic Chabant <ludovic@chabant.com>
parents:
852
diff
changeset
|
50 metadata = {} |
dcdec4b951a1
admin: Get the admin panel working again.
Ludovic Chabant <ludovic@chabant.com>
parents:
852
diff
changeset
|
51 for f in source.getInteractiveFields(): |
dcdec4b951a1
admin: Get the admin panel working again.
Ludovic Chabant <ludovic@chabant.com>
parents:
852
diff
changeset
|
52 metadata[f.name] = f.default_value |
dcdec4b951a1
admin: Get the admin panel working again.
Ludovic Chabant <ludovic@chabant.com>
parents:
852
diff
changeset
|
53 for fk, fv in request.form.items(): |
dcdec4b951a1
admin: Get the admin panel working again.
Ludovic Chabant <ludovic@chabant.com>
parents:
852
diff
changeset
|
54 if fk.startswith('meta-'): |
dcdec4b951a1
admin: Get the admin panel working again.
Ludovic Chabant <ludovic@chabant.com>
parents:
852
diff
changeset
|
55 metadata[fk[5:]] = fv |
dcdec4b951a1
admin: Get the admin panel working again.
Ludovic Chabant <ludovic@chabant.com>
parents:
852
diff
changeset
|
56 |
950
18d6ac20a132
admin: Fix old API calls and bugs when creating new pages.
Ludovic Chabant <ludovic@chabant.com>
parents:
935
diff
changeset
|
57 logger.debug("Creating item with metadata: %s" % metadata) |
18d6ac20a132
admin: Fix old API calls and bugs when creating new pages.
Ludovic Chabant <ludovic@chabant.com>
parents:
935
diff
changeset
|
58 content_item = source.createContent(metadata) |
886
dcdec4b951a1
admin: Get the admin panel working again.
Ludovic Chabant <ludovic@chabant.com>
parents:
852
diff
changeset
|
59 if content_item is None: |
950
18d6ac20a132
admin: Fix old API calls and bugs when creating new pages.
Ludovic Chabant <ludovic@chabant.com>
parents:
935
diff
changeset
|
60 logger.error("Can't create item for: %s" % metadata) |
886
dcdec4b951a1
admin: Get the admin panel working again.
Ludovic Chabant <ludovic@chabant.com>
parents:
852
diff
changeset
|
61 abort(500) |
dcdec4b951a1
admin: Get the admin panel working again.
Ludovic Chabant <ludovic@chabant.com>
parents:
852
diff
changeset
|
62 |
950
18d6ac20a132
admin: Fix old API calls and bugs when creating new pages.
Ludovic Chabant <ludovic@chabant.com>
parents:
935
diff
changeset
|
63 logger.debug("Creating content: %s" % content_item.spec) |
18d6ac20a132
admin: Fix old API calls and bugs when creating new pages.
Ludovic Chabant <ludovic@chabant.com>
parents:
935
diff
changeset
|
64 with source.openItem(content_item, 'w') as fp: |
18d6ac20a132
admin: Fix old API calls and bugs when creating new pages.
Ludovic Chabant <ludovic@chabant.com>
parents:
935
diff
changeset
|
65 fp.write('---\n') |
18d6ac20a132
admin: Fix old API calls and bugs when creating new pages.
Ludovic Chabant <ludovic@chabant.com>
parents:
935
diff
changeset
|
66 fp.write('draft: true\n') |
18d6ac20a132
admin: Fix old API calls and bugs when creating new pages.
Ludovic Chabant <ludovic@chabant.com>
parents:
935
diff
changeset
|
67 fp.write('---\n') |
18d6ac20a132
admin: Fix old API calls and bugs when creating new pages.
Ludovic Chabant <ludovic@chabant.com>
parents:
935
diff
changeset
|
68 fp.write('\n') |
18d6ac20a132
admin: Fix old API calls and bugs when creating new pages.
Ludovic Chabant <ludovic@chabant.com>
parents:
935
diff
changeset
|
69 fp.write("Start writing!\n") |
886
dcdec4b951a1
admin: Get the admin panel working again.
Ludovic Chabant <ludovic@chabant.com>
parents:
852
diff
changeset
|
70 flash("'%s' was created." % content_item.spec) |
dcdec4b951a1
admin: Get the admin panel working again.
Ludovic Chabant <ludovic@chabant.com>
parents:
852
diff
changeset
|
71 |
dcdec4b951a1
admin: Get the admin panel working again.
Ludovic Chabant <ludovic@chabant.com>
parents:
852
diff
changeset
|
72 page = Page(source, content_item) |
dcdec4b951a1
admin: Get the admin panel working again.
Ludovic Chabant <ludovic@chabant.com>
parents:
852
diff
changeset
|
73 uri = page.getUri() |
dcdec4b951a1
admin: Get the admin panel working again.
Ludovic Chabant <ludovic@chabant.com>
parents:
852
diff
changeset
|
74 logger.debug("Redirecting to: %s" % uri) |
935
7ecb946bfafd
admin: Lots of fixes for running the admin panel in a WSGI server.
Ludovic Chabant <ludovic@chabant.com>
parents:
889
diff
changeset
|
75 _, rel_url = split_uri(page.app, uri) |
7ecb946bfafd
admin: Lots of fixes for running the admin panel in a WSGI server.
Ludovic Chabant <ludovic@chabant.com>
parents:
889
diff
changeset
|
76 return redirect(url_for('.edit_page', url=rel_url)) |
886
dcdec4b951a1
admin: Get the admin panel working again.
Ludovic Chabant <ludovic@chabant.com>
parents:
852
diff
changeset
|
77 |