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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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