Mercurial > piecrust2
annotate piecrust/admin/views/micropub.py @ 969:5b735229b6fb
admin: Micropub improvements.
- Add support for Micropub media endpoint.
- Add support for uploading photos via the endpoint.
- Fix URL returned after creating post.
- Hack for Micro.blog access token problems.
- Hack for bug in Flask-IndieAuth.
author | Ludovic Chabant <ludovic@chabant.com> |
---|---|
date | Sun, 08 Oct 2017 09:32:33 -0700 |
parents | d65838abbd90 |
children | 660250c95246 |
rev | line source |
---|---|
895
accfe8fc8440
admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
1 import re |
accfe8fc8440
admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
2 import os |
accfe8fc8440
admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
3 import os.path |
969
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
4 import json |
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
5 import uuid |
895
accfe8fc8440
admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
6 import logging |
accfe8fc8440
admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
7 import datetime |
964
d65838abbd90
admin: Better micropub request handling.
Ludovic Chabant <ludovic@chabant.com>
parents:
895
diff
changeset
|
8 import yaml |
895
accfe8fc8440
admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
9 from werkzeug.utils import secure_filename |
969
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
10 from flask import g, url_for, request, abort, jsonify, Response |
895
accfe8fc8440
admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
11 from flask_indieauth import requires_indieauth |
accfe8fc8440
admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
12 from ..blueprint import foodtruck_bp |
969
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
13 from piecrust import CACHE_DIR |
964
d65838abbd90
admin: Better micropub request handling.
Ludovic Chabant <ludovic@chabant.com>
parents:
895
diff
changeset
|
14 from piecrust.configuration import merge_dicts |
895
accfe8fc8440
admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
15 from piecrust.page import Page |
accfe8fc8440
admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
16 |
accfe8fc8440
admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
17 |
accfe8fc8440
admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
18 logger = logging.getLogger(__name__) |
accfe8fc8440
admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
19 |
accfe8fc8440
admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
20 re_unsafe_asset_char = re.compile('[^a-zA-Z0-9_]') |
accfe8fc8440
admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
21 |
accfe8fc8440
admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
22 |
969
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
23 def _patch_flask_indieauth(): |
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
24 import flask_indieauth |
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
25 |
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
26 def _patched_get_access_token_from_json_request(request): |
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
27 try: |
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
28 jsondata = json.loads(request.get_data(as_text=True)) |
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
29 return jsondata['access_token'] |
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
30 except ValueError: |
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
31 return None |
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
32 |
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
33 _orig_check_auth = flask_indieauth.check_auth |
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
34 |
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
35 def _patched_check_auth(access_token): |
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
36 user_agent = request.headers.get('User-Agent') or '' |
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
37 if user_agent.startswith('Micro.blog/'): |
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
38 return None |
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
39 return _orig_check_auth(access_token) |
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
40 |
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
41 flask_indieauth.get_access_token_from_json_request = \ |
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
42 _patched_get_access_token_from_json_request |
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
43 flask_indieauth.check_auth = _patched_check_auth |
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
44 logger.info("Patched Flask-IndieAuth.") |
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
45 |
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
46 |
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
47 _patch_flask_indieauth() |
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
48 |
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
49 |
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
50 _enable_debug_auth = False |
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
51 |
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
52 |
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
53 def _debug_auth(): |
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
54 if _enable_debug_auth: |
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
55 logger.warning("Headers: %s" % request.headers) |
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
56 logger.warning("Args: %s" % request.args) |
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
57 logger.warning("Form: %s" % request.form) |
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
58 logger.warning("Data: %s" % request.get_data(True)) |
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
59 |
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
60 |
895
accfe8fc8440
admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
61 @foodtruck_bp.route('/micropub', methods=['POST']) |
accfe8fc8440
admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
62 @requires_indieauth |
969
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
63 def post_micropub(): |
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
64 _debug_auth() |
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
65 |
895
accfe8fc8440
admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
66 post_type = request.form.get('h') |
accfe8fc8440
admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
67 |
accfe8fc8440
admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
68 if post_type == 'entry': |
969
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
69 source_name, content_item = _create_hentry() |
895
accfe8fc8440
admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
70 _run_publisher() |
969
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
71 return _get_location_response(source_name, content_item) |
895
accfe8fc8440
admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
72 |
accfe8fc8440
admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
73 logger.debug("Unknown or unsupported update type.") |
accfe8fc8440
admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
74 logger.debug(request.form) |
accfe8fc8440
admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
75 abort(400) |
accfe8fc8440
admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
76 |
accfe8fc8440
admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
77 |
969
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
78 @foodtruck_bp.route('/micropub/media', methods=['POST']) |
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
79 @requires_indieauth |
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
80 def post_micropub_media(): |
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
81 _debug_auth() |
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
82 photo = request.files.get('file') |
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
83 if not photo: |
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
84 logger.error("Micropub media request without a file part.") |
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
85 abort(400) |
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
86 return |
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
87 |
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
88 fn = secure_filename(photo.filename) |
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
89 fn = re_unsafe_asset_char.sub('_', fn) |
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
90 fn = '%s_%s' % (str(uuid.uuid1()), fn) |
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
91 |
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
92 photo_cache_dir = os.path.join( |
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
93 g.site.root_dir, |
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
94 CACHE_DIR, g.site.piecrust_factory.cache_key, |
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
95 'uploads') |
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
96 try: |
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
97 os.makedirs(photo_cache_dir, mode=0o775, exist_ok=True) |
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
98 except OSError: |
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
99 pass |
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
100 |
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
101 photo_path = os.path.join(photo_cache_dir, fn) |
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
102 logger.info("Uploading file to: %s" % photo_path) |
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
103 photo.save(photo_path) |
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
104 |
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
105 r = Response() |
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
106 r.status_code = 201 |
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
107 r.headers.add('Location', fn) |
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
108 return r |
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
109 |
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
110 |
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
111 @foodtruck_bp.route('/micropub', methods=['GET']) |
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
112 def get_micropub(): |
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
113 data = {} |
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
114 if request.args.get('q') == 'config': |
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
115 endpoint_url = (request.host_url.rstrip('/') + |
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
116 url_for('.post_micropub_media')) |
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
117 data.update({ |
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
118 "media-endpoint": endpoint_url |
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
119 }) |
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
120 |
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
121 pcapp = g.site.piecrust_app |
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
122 syn_data = pcapp.config.get('micropub/syndicate_to') |
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
123 if syn_data: |
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
124 data['syndicate-to'] = syn_data |
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
125 |
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
126 return jsonify(**data) |
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
127 |
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
128 |
895
accfe8fc8440
admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
129 def _run_publisher(): |
accfe8fc8440
admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
130 pcapp = g.site.piecrust_app |
964
d65838abbd90
admin: Better micropub request handling.
Ludovic Chabant <ludovic@chabant.com>
parents:
895
diff
changeset
|
131 target = pcapp.config.get('micropub/publish_target') |
d65838abbd90
admin: Better micropub request handling.
Ludovic Chabant <ludovic@chabant.com>
parents:
895
diff
changeset
|
132 if target: |
d65838abbd90
admin: Better micropub request handling.
Ludovic Chabant <ludovic@chabant.com>
parents:
895
diff
changeset
|
133 logger.debug("Running pushing target '%s'." % target) |
d65838abbd90
admin: Better micropub request handling.
Ludovic Chabant <ludovic@chabant.com>
parents:
895
diff
changeset
|
134 g.site.publish(target) |
895
accfe8fc8440
admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
135 |
accfe8fc8440
admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
136 |
969
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
137 def _get_location_response(source_name, content_item): |
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
138 from piecrust.app import PieCrust |
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
139 pcapp = PieCrust(g.site.root_dir) |
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
140 source = pcapp.getSource(source_name) |
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
141 |
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
142 page = Page(source, content_item) |
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
143 uri = page.getUri() |
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
144 |
895
accfe8fc8440
admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
145 logger.debug("Redirecting to: %s" % uri) |
accfe8fc8440
admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
146 r = Response() |
accfe8fc8440
admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
147 r.status_code = 201 |
accfe8fc8440
admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
148 r.headers.add('Location', uri) |
accfe8fc8440
admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
149 return r |
accfe8fc8440
admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
150 |
accfe8fc8440
admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
151 |
accfe8fc8440
admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
152 def _create_hentry(): |
accfe8fc8440
admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
153 f = request.form |
964
d65838abbd90
admin: Better micropub request handling.
Ludovic Chabant <ludovic@chabant.com>
parents:
895
diff
changeset
|
154 |
895
accfe8fc8440
admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
155 summary = f.get('summary') |
accfe8fc8440
admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
156 categories = f.getlist('category[]') |
accfe8fc8440
admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
157 location = f.get('location') |
accfe8fc8440
admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
158 reply_to = f.get('in-reply-to') |
accfe8fc8440
admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
159 status = f.get('post-status') |
accfe8fc8440
admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
160 # pubdate = f.get('published', 'now') |
accfe8fc8440
admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
161 |
accfe8fc8440
admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
162 # Figure out the title of the post. |
accfe8fc8440
admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
163 name = f.get('name') |
accfe8fc8440
admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
164 if not name: |
accfe8fc8440
admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
165 name = f.get('name[]') |
accfe8fc8440
admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
166 |
accfe8fc8440
admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
167 # Figure out the contents of the post. |
accfe8fc8440
admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
168 post_format = None |
accfe8fc8440
admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
169 content = f.get('content') |
accfe8fc8440
admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
170 if not content: |
accfe8fc8440
admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
171 content = f.get('content[]') |
accfe8fc8440
admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
172 if not content: |
accfe8fc8440
admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
173 content = f.get('content[html]') |
accfe8fc8440
admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
174 post_format = 'none' |
accfe8fc8440
admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
175 |
accfe8fc8440
admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
176 if not content: |
accfe8fc8440
admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
177 logger.error("No content specified!") |
accfe8fc8440
admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
178 logger.error(dict(request.form)) |
accfe8fc8440
admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
179 abort(400) |
accfe8fc8440
admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
180 |
accfe8fc8440
admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
181 # TODO: setting to conserve Windows-type line endings? |
accfe8fc8440
admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
182 content = content.replace('\r\n', '\n') |
accfe8fc8440
admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
183 if summary: |
accfe8fc8440
admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
184 summary = summary.replace('\r\n', '\n') |
accfe8fc8440
admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
185 |
accfe8fc8440
admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
186 # Figure out the slug of the post. |
accfe8fc8440
admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
187 now = datetime.datetime.now() |
accfe8fc8440
admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
188 slug = f.get('slug') |
accfe8fc8440
admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
189 if not slug: |
accfe8fc8440
admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
190 slug = f.get('mp-slug') |
accfe8fc8440
admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
191 if not slug: |
accfe8fc8440
admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
192 slug = '%02d%02d%02d' % (now.hour, now.minute, now.second) |
accfe8fc8440
admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
193 |
accfe8fc8440
admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
194 # Get the media to attach to the post. |
accfe8fc8440
admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
195 photo_urls = None |
accfe8fc8440
admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
196 if 'photo' in f: |
accfe8fc8440
admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
197 photo_urls = [f['photo']] |
accfe8fc8440
admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
198 elif 'photo[]' in f: |
accfe8fc8440
admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
199 photo_urls = f.getlist('photo[]') |
accfe8fc8440
admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
200 |
accfe8fc8440
admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
201 photos = None |
accfe8fc8440
admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
202 if 'photo' in request.files: |
accfe8fc8440
admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
203 photos = [request.files['photo']] |
accfe8fc8440
admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
204 elif 'photo[]' in request.files: |
accfe8fc8440
admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
205 photos = request.files.getlist('photo[]') |
accfe8fc8440
admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
206 |
accfe8fc8440
admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
207 # Create the post in the correct content source. |
accfe8fc8440
admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
208 pcapp = g.site.piecrust_app |
accfe8fc8440
admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
209 source_name = pcapp.config.get('micropub/source', 'posts') |
accfe8fc8440
admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
210 source = pcapp.getSource(source_name) |
accfe8fc8440
admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
211 |
accfe8fc8440
admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
212 metadata = { |
accfe8fc8440
admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
213 'date': now, |
accfe8fc8440
admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
214 'slug': slug |
accfe8fc8440
admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
215 } |
accfe8fc8440
admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
216 logger.debug("Creating item with metadata: %s" % metadata) |
accfe8fc8440
admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
217 content_item = source.createContent(metadata) |
accfe8fc8440
admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
218 if content_item is None: |
accfe8fc8440
admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
219 logger.error("Can't create item for: %s" % metadata) |
accfe8fc8440
admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
220 abort(500) |
accfe8fc8440
admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
221 |
accfe8fc8440
admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
222 # TODO: add proper APIs for creating related assets. |
969
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
223 photo_names = [] |
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
224 if photo_urls or photos: |
895
accfe8fc8440
admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
225 photo_dir, _ = os.path.splitext(content_item.spec) |
accfe8fc8440
admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
226 photo_dir += '-assets' |
969
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
227 try: |
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
228 os.makedirs(photo_dir, mode=0o775, exist_ok=True) |
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
229 except OSError: |
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
230 pass |
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
231 |
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
232 # Photo URLs come from files uploaded via the media endpoint... |
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
233 # They're waiting for us in the upload cache folder, so let's |
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
234 # move them to the post's assets folder. |
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
235 if photo_urls: |
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
236 photo_cache_dir = os.path.join( |
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
237 g.site.root_dir, |
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
238 CACHE_DIR, g.site.piecrust_factory.cache_key, |
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
239 'uploads') |
895
accfe8fc8440
admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
240 |
969
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
241 for p_url in photo_urls: |
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
242 _, __, p_url = p_url.rpartition('/') |
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
243 p_path = os.path.join(photo_cache_dir, p_url) |
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
244 p_uuid, p_fn = p_url.split('_', 1) |
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
245 p_asset = os.path.join(photo_dir, p_fn) |
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
246 logger.info("Moving upload '%s' to '%s'." % (p_path, p_asset)) |
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
247 os.rename(p_path, p_asset) |
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
248 |
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
249 p_fn_no_ext, _ = os.path.splitext(p_fn) |
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
250 photo_names.append(p_fn_no_ext) |
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
251 |
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
252 # There could also be some files uploaded along with the post |
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
253 # so upload them right now. |
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
254 if photos: |
895
accfe8fc8440
admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
255 for photo in photos: |
accfe8fc8440
admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
256 if not photo or not photo.filename: |
accfe8fc8440
admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
257 logger.warning("Got empty photo in request files... skipping.") |
accfe8fc8440
admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
258 continue |
accfe8fc8440
admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
259 |
accfe8fc8440
admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
260 fn = secure_filename(photo.filename) |
accfe8fc8440
admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
261 fn = re_unsafe_asset_char.sub('_', fn) |
accfe8fc8440
admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
262 photo_path = os.path.join(photo_dir, fn) |
accfe8fc8440
admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
263 logger.info("Uploading file to: %s" % photo_path) |
accfe8fc8440
admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
264 photo.save(photo_path) |
accfe8fc8440
admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
265 |
accfe8fc8440
admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
266 fn_no_ext, _ = os.path.splitext(fn) |
accfe8fc8440
admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
267 photo_names.append(fn_no_ext) |
accfe8fc8440
admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
268 |
964
d65838abbd90
admin: Better micropub request handling.
Ludovic Chabant <ludovic@chabant.com>
parents:
895
diff
changeset
|
269 # Build the config. |
d65838abbd90
admin: Better micropub request handling.
Ludovic Chabant <ludovic@chabant.com>
parents:
895
diff
changeset
|
270 post_config = {} |
d65838abbd90
admin: Better micropub request handling.
Ludovic Chabant <ludovic@chabant.com>
parents:
895
diff
changeset
|
271 if name: |
d65838abbd90
admin: Better micropub request handling.
Ludovic Chabant <ludovic@chabant.com>
parents:
895
diff
changeset
|
272 post_config['title'] = name |
d65838abbd90
admin: Better micropub request handling.
Ludovic Chabant <ludovic@chabant.com>
parents:
895
diff
changeset
|
273 if categories: |
d65838abbd90
admin: Better micropub request handling.
Ludovic Chabant <ludovic@chabant.com>
parents:
895
diff
changeset
|
274 post_config['tags'] = categories |
d65838abbd90
admin: Better micropub request handling.
Ludovic Chabant <ludovic@chabant.com>
parents:
895
diff
changeset
|
275 if location: |
d65838abbd90
admin: Better micropub request handling.
Ludovic Chabant <ludovic@chabant.com>
parents:
895
diff
changeset
|
276 post_config['location'] = location |
d65838abbd90
admin: Better micropub request handling.
Ludovic Chabant <ludovic@chabant.com>
parents:
895
diff
changeset
|
277 if reply_to: |
d65838abbd90
admin: Better micropub request handling.
Ludovic Chabant <ludovic@chabant.com>
parents:
895
diff
changeset
|
278 post_config['reply_to'] = reply_to |
d65838abbd90
admin: Better micropub request handling.
Ludovic Chabant <ludovic@chabant.com>
parents:
895
diff
changeset
|
279 if status: |
d65838abbd90
admin: Better micropub request handling.
Ludovic Chabant <ludovic@chabant.com>
parents:
895
diff
changeset
|
280 post_config['status'] = status |
d65838abbd90
admin: Better micropub request handling.
Ludovic Chabant <ludovic@chabant.com>
parents:
895
diff
changeset
|
281 if post_format: |
d65838abbd90
admin: Better micropub request handling.
Ludovic Chabant <ludovic@chabant.com>
parents:
895
diff
changeset
|
282 post_config['format'] = post_format |
d65838abbd90
admin: Better micropub request handling.
Ludovic Chabant <ludovic@chabant.com>
parents:
895
diff
changeset
|
283 post_config['time'] = '%02d:%02d:%02d' % (now.hour, now.minute, now.second) |
d65838abbd90
admin: Better micropub request handling.
Ludovic Chabant <ludovic@chabant.com>
parents:
895
diff
changeset
|
284 |
d65838abbd90
admin: Better micropub request handling.
Ludovic Chabant <ludovic@chabant.com>
parents:
895
diff
changeset
|
285 # If there's no title, this is a "microblogging" post. |
d65838abbd90
admin: Better micropub request handling.
Ludovic Chabant <ludovic@chabant.com>
parents:
895
diff
changeset
|
286 if not name: |
d65838abbd90
admin: Better micropub request handling.
Ludovic Chabant <ludovic@chabant.com>
parents:
895
diff
changeset
|
287 micro_config = pcapp.config.get('micropub/microblogging') |
d65838abbd90
admin: Better micropub request handling.
Ludovic Chabant <ludovic@chabant.com>
parents:
895
diff
changeset
|
288 if micro_config: |
d65838abbd90
admin: Better micropub request handling.
Ludovic Chabant <ludovic@chabant.com>
parents:
895
diff
changeset
|
289 merge_dicts(post_config, micro_config) |
d65838abbd90
admin: Better micropub request handling.
Ludovic Chabant <ludovic@chabant.com>
parents:
895
diff
changeset
|
290 |
895
accfe8fc8440
admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
291 logger.debug("Writing to item: %s" % content_item.spec) |
accfe8fc8440
admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
292 with source.openItem(content_item, mode='w') as fp: |
accfe8fc8440
admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
293 fp.write('---\n') |
964
d65838abbd90
admin: Better micropub request handling.
Ludovic Chabant <ludovic@chabant.com>
parents:
895
diff
changeset
|
294 yaml.dump(post_config, fp, |
d65838abbd90
admin: Better micropub request handling.
Ludovic Chabant <ludovic@chabant.com>
parents:
895
diff
changeset
|
295 default_flow_style=False, |
d65838abbd90
admin: Better micropub request handling.
Ludovic Chabant <ludovic@chabant.com>
parents:
895
diff
changeset
|
296 allow_unicode=True) |
895
accfe8fc8440
admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
297 fp.write('---\n') |
accfe8fc8440
admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
298 |
accfe8fc8440
admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
299 if summary: |
accfe8fc8440
admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
300 fp.write(summary) |
accfe8fc8440
admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
301 fp.write('\n') |
accfe8fc8440
admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
302 fp.write('<!--break-->\n\n') |
accfe8fc8440
admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
303 fp.write(content) |
accfe8fc8440
admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
304 |
accfe8fc8440
admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
305 if photo_names: |
accfe8fc8440
admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
306 fp.write('\n\n') |
accfe8fc8440
admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
307 for pn in photo_names: |
accfe8fc8440
admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
308 fp.write('<img src="{{assets.%s}}" alt="%s"/>\n\n' % |
accfe8fc8440
admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
309 (pn, pn)) |
accfe8fc8440
admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
310 |
969
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
311 if os.supports_fd: |
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
312 import stat |
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
313 try: |
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
314 os.chmod(fp.fileno(), |
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
315 stat.S_IRUSR|stat.S_IWUSR|stat.S_IRGRP|stat.S_IWGRP) |
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
316 except OSError: |
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
317 pass |
895
accfe8fc8440
admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
318 |
969
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
319 return source_name, content_item |
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
320 |