annotate piecrust/admin/views/micropub.py @ 1121:41b7ce0d5131

internal: PEP8.
author Ludovic Chabant <ludovic@chabant.com>
date Tue, 27 Feb 2018 21:44:45 -0800
parents c8366fc15043
children be74ba54a06f
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 flask_indieauth.get_access_token_from_json_request = \
5b735229b6fb admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 964
diff changeset
34 _patched_get_access_token_from_json_request
5b735229b6fb admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 964
diff changeset
35 logger.info("Patched Flask-IndieAuth.")
5b735229b6fb admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 964
diff changeset
36
5b735229b6fb admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 964
diff changeset
37
5b735229b6fb admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 964
diff changeset
38 _patch_flask_indieauth()
5b735229b6fb admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 964
diff changeset
39
5b735229b6fb admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 964
diff changeset
40
970
660250c95246 admin: Improve support for Micropub.
Ludovic Chabant <ludovic@chabant.com>
parents: 969
diff changeset
41 _enable_debug_req = False
969
5b735229b6fb admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 964
diff changeset
42
5b735229b6fb admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 964
diff changeset
43
970
660250c95246 admin: Improve support for Micropub.
Ludovic Chabant <ludovic@chabant.com>
parents: 969
diff changeset
44 def _debug_req():
660250c95246 admin: Improve support for Micropub.
Ludovic Chabant <ludovic@chabant.com>
parents: 969
diff changeset
45 if _enable_debug_req:
969
5b735229b6fb admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 964
diff changeset
46 logger.warning("Headers: %s" % request.headers)
5b735229b6fb admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 964
diff changeset
47 logger.warning("Args: %s" % request.args)
5b735229b6fb admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 964
diff changeset
48 logger.warning("Form: %s" % request.form)
5b735229b6fb admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 964
diff changeset
49 logger.warning("Data: %s" % request.get_data(True))
970
660250c95246 admin: Improve support for Micropub.
Ludovic Chabant <ludovic@chabant.com>
parents: 969
diff changeset
50 try:
660250c95246 admin: Improve support for Micropub.
Ludovic Chabant <ludovic@chabant.com>
parents: 969
diff changeset
51 logger.warning("JSON: %s" % request.json)
1121
41b7ce0d5131 internal: PEP8.
Ludovic Chabant <ludovic@chabant.com>
parents: 1025
diff changeset
52 except: # NOQA
970
660250c95246 admin: Improve support for Micropub.
Ludovic Chabant <ludovic@chabant.com>
parents: 969
diff changeset
53 pass
969
5b735229b6fb admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 964
diff changeset
54
5b735229b6fb admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 964
diff changeset
55
895
accfe8fc8440 admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
56 @foodtruck_bp.route('/micropub', methods=['POST'])
accfe8fc8440 admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
57 @requires_indieauth
969
5b735229b6fb admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 964
diff changeset
58 def post_micropub():
970
660250c95246 admin: Improve support for Micropub.
Ludovic Chabant <ludovic@chabant.com>
parents: 969
diff changeset
59 _debug_req()
969
5b735229b6fb admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 964
diff changeset
60
970
660250c95246 admin: Improve support for Micropub.
Ludovic Chabant <ludovic@chabant.com>
parents: 969
diff changeset
61 if 'h' in request.form:
660250c95246 admin: Improve support for Micropub.
Ludovic Chabant <ludovic@chabant.com>
parents: 969
diff changeset
62 data = _get_mf2_from_form(request.form)
660250c95246 admin: Improve support for Micropub.
Ludovic Chabant <ludovic@chabant.com>
parents: 969
diff changeset
63 else:
660250c95246 admin: Improve support for Micropub.
Ludovic Chabant <ludovic@chabant.com>
parents: 969
diff changeset
64 try:
660250c95246 admin: Improve support for Micropub.
Ludovic Chabant <ludovic@chabant.com>
parents: 969
diff changeset
65 data = json.loads(request.get_data(as_text=True))
1121
41b7ce0d5131 internal: PEP8.
Ludovic Chabant <ludovic@chabant.com>
parents: 1025
diff changeset
66 except Exception:
970
660250c95246 admin: Improve support for Micropub.
Ludovic Chabant <ludovic@chabant.com>
parents: 969
diff changeset
67 data = None
895
accfe8fc8440 admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
68
970
660250c95246 admin: Improve support for Micropub.
Ludovic Chabant <ludovic@chabant.com>
parents: 969
diff changeset
69 if data:
660250c95246 admin: Improve support for Micropub.
Ludovic Chabant <ludovic@chabant.com>
parents: 969
diff changeset
70 entry_type = _mf2get(data, 'type')
660250c95246 admin: Improve support for Micropub.
Ludovic Chabant <ludovic@chabant.com>
parents: 969
diff changeset
71 if entry_type == 'h-entry':
1024
60b431c57ea9 admin: Handle multiple photo uploads in the micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents: 970
diff changeset
72 source_name, content_item, do_publish = \
60b431c57ea9 admin: Handle multiple photo uploads in the micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents: 970
diff changeset
73 _create_hentry(data['properties'])
60b431c57ea9 admin: Handle multiple photo uploads in the micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents: 970
diff changeset
74 if do_publish:
60b431c57ea9 admin: Handle multiple photo uploads in the micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents: 970
diff changeset
75 _run_publisher()
970
660250c95246 admin: Improve support for Micropub.
Ludovic Chabant <ludovic@chabant.com>
parents: 969
diff changeset
76 return _get_location_response(source_name, content_item)
895
accfe8fc8440 admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
77
970
660250c95246 admin: Improve support for Micropub.
Ludovic Chabant <ludovic@chabant.com>
parents: 969
diff changeset
78 else:
1121
41b7ce0d5131 internal: PEP8.
Ludovic Chabant <ludovic@chabant.com>
parents: 1025
diff changeset
79 logger.error("Post type '%s' is not supported." % entry_type)
970
660250c95246 admin: Improve support for Micropub.
Ludovic Chabant <ludovic@chabant.com>
parents: 969
diff changeset
80 else:
660250c95246 admin: Improve support for Micropub.
Ludovic Chabant <ludovic@chabant.com>
parents: 969
diff changeset
81 logger.error("Missing form or JSON data.")
660250c95246 admin: Improve support for Micropub.
Ludovic Chabant <ludovic@chabant.com>
parents: 969
diff changeset
82
895
accfe8fc8440 admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
83 abort(400)
accfe8fc8440 admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
84
accfe8fc8440 admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
85
969
5b735229b6fb admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 964
diff changeset
86 @foodtruck_bp.route('/micropub/media', methods=['POST'])
5b735229b6fb admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 964
diff changeset
87 @requires_indieauth
5b735229b6fb admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 964
diff changeset
88 def post_micropub_media():
970
660250c95246 admin: Improve support for Micropub.
Ludovic Chabant <ludovic@chabant.com>
parents: 969
diff changeset
89 _debug_req()
660250c95246 admin: Improve support for Micropub.
Ludovic Chabant <ludovic@chabant.com>
parents: 969
diff changeset
90
969
5b735229b6fb admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 964
diff changeset
91 photo = request.files.get('file')
5b735229b6fb admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 964
diff changeset
92 if not photo:
5b735229b6fb admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 964
diff changeset
93 logger.error("Micropub media request without a file part.")
5b735229b6fb admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 964
diff changeset
94 abort(400)
5b735229b6fb admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 964
diff changeset
95 return
5b735229b6fb admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 964
diff changeset
96
5b735229b6fb admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 964
diff changeset
97 fn = secure_filename(photo.filename)
5b735229b6fb admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 964
diff changeset
98 fn = re_unsafe_asset_char.sub('_', fn)
1024
60b431c57ea9 admin: Handle multiple photo uploads in the micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents: 970
diff changeset
99 fn = '%s_%s' % (uuid.uuid1().hex, fn)
60b431c57ea9 admin: Handle multiple photo uploads in the micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents: 970
diff changeset
100 fn = fn.rstrip('_')
969
5b735229b6fb admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 964
diff changeset
101
5b735229b6fb admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 964
diff changeset
102 photo_cache_dir = os.path.join(
5b735229b6fb admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 964
diff changeset
103 g.site.root_dir,
5b735229b6fb admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 964
diff changeset
104 CACHE_DIR, g.site.piecrust_factory.cache_key,
5b735229b6fb admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 964
diff changeset
105 'uploads')
5b735229b6fb admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 964
diff changeset
106 try:
5b735229b6fb admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 964
diff changeset
107 os.makedirs(photo_cache_dir, mode=0o775, exist_ok=True)
5b735229b6fb admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 964
diff changeset
108 except OSError:
5b735229b6fb admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 964
diff changeset
109 pass
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 photo_path = os.path.join(photo_cache_dir, fn)
5b735229b6fb admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 964
diff changeset
112 logger.info("Uploading file to: %s" % photo_path)
5b735229b6fb admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 964
diff changeset
113 photo.save(photo_path)
5b735229b6fb admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 964
diff changeset
114
5b735229b6fb admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 964
diff changeset
115 r = Response()
5b735229b6fb admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 964
diff changeset
116 r.status_code = 201
5b735229b6fb admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 964
diff changeset
117 r.headers.add('Location', fn)
5b735229b6fb admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 964
diff changeset
118 return r
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 @foodtruck_bp.route('/micropub', methods=['GET'])
5b735229b6fb admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 964
diff changeset
122 def get_micropub():
5b735229b6fb admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 964
diff changeset
123 data = {}
5b735229b6fb admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 964
diff changeset
124 if request.args.get('q') == 'config':
5b735229b6fb admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 964
diff changeset
125 endpoint_url = (request.host_url.rstrip('/') +
5b735229b6fb admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 964
diff changeset
126 url_for('.post_micropub_media'))
5b735229b6fb admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 964
diff changeset
127 data.update({
1121
41b7ce0d5131 internal: PEP8.
Ludovic Chabant <ludovic@chabant.com>
parents: 1025
diff changeset
128 "media-endpoint": endpoint_url
969
5b735229b6fb admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 964
diff changeset
129 })
5b735229b6fb admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 964
diff changeset
130
5b735229b6fb admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 964
diff changeset
131 pcapp = g.site.piecrust_app
5b735229b6fb admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 964
diff changeset
132 syn_data = pcapp.config.get('micropub/syndicate_to')
5b735229b6fb admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 964
diff changeset
133 if syn_data:
5b735229b6fb admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 964
diff changeset
134 data['syndicate-to'] = syn_data
5b735229b6fb admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 964
diff changeset
135
5b735229b6fb admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 964
diff changeset
136 return jsonify(**data)
5b735229b6fb admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 964
diff changeset
137
5b735229b6fb admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 964
diff changeset
138
895
accfe8fc8440 admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
139 def _run_publisher():
accfe8fc8440 admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
140 pcapp = g.site.piecrust_app
964
d65838abbd90 admin: Better micropub request handling.
Ludovic Chabant <ludovic@chabant.com>
parents: 895
diff changeset
141 target = pcapp.config.get('micropub/publish_target')
d65838abbd90 admin: Better micropub request handling.
Ludovic Chabant <ludovic@chabant.com>
parents: 895
diff changeset
142 if target:
d65838abbd90 admin: Better micropub request handling.
Ludovic Chabant <ludovic@chabant.com>
parents: 895
diff changeset
143 logger.debug("Running pushing target '%s'." % target)
d65838abbd90 admin: Better micropub request handling.
Ludovic Chabant <ludovic@chabant.com>
parents: 895
diff changeset
144 g.site.publish(target)
895
accfe8fc8440 admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
145
accfe8fc8440 admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
146
969
5b735229b6fb admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 964
diff changeset
147 def _get_location_response(source_name, content_item):
5b735229b6fb admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 964
diff changeset
148 from piecrust.app import PieCrust
5b735229b6fb admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 964
diff changeset
149 pcapp = PieCrust(g.site.root_dir)
5b735229b6fb admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 964
diff changeset
150 source = pcapp.getSource(source_name)
5b735229b6fb admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 964
diff changeset
151
5b735229b6fb admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 964
diff changeset
152 page = Page(source, content_item)
5b735229b6fb admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 964
diff changeset
153 uri = page.getUri()
5b735229b6fb admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 964
diff changeset
154
895
accfe8fc8440 admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
155 logger.debug("Redirecting to: %s" % uri)
accfe8fc8440 admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
156 r = Response()
accfe8fc8440 admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
157 r.status_code = 201
accfe8fc8440 admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
158 r.headers.add('Location', uri)
accfe8fc8440 admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
159 return r
accfe8fc8440 admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
160
accfe8fc8440 admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
161
970
660250c95246 admin: Improve support for Micropub.
Ludovic Chabant <ludovic@chabant.com>
parents: 969
diff changeset
162 re_array_prop = re.compile(r'\[(?P<name>\w*)\]$')
660250c95246 admin: Improve support for Micropub.
Ludovic Chabant <ludovic@chabant.com>
parents: 969
diff changeset
163
660250c95246 admin: Improve support for Micropub.
Ludovic Chabant <ludovic@chabant.com>
parents: 969
diff changeset
164
660250c95246 admin: Improve support for Micropub.
Ludovic Chabant <ludovic@chabant.com>
parents: 969
diff changeset
165 def _get_mf2_from_form(f):
660250c95246 admin: Improve support for Micropub.
Ludovic Chabant <ludovic@chabant.com>
parents: 969
diff changeset
166 post_type = 'h-' + f.get('h', '')
964
d65838abbd90 admin: Better micropub request handling.
Ludovic Chabant <ludovic@chabant.com>
parents: 895
diff changeset
167
970
660250c95246 admin: Improve support for Micropub.
Ludovic Chabant <ludovic@chabant.com>
parents: 969
diff changeset
168 properties = {}
660250c95246 admin: Improve support for Micropub.
Ludovic Chabant <ludovic@chabant.com>
parents: 969
diff changeset
169 for key, vals in f.lists():
660250c95246 admin: Improve support for Micropub.
Ludovic Chabant <ludovic@chabant.com>
parents: 969
diff changeset
170 m = re_array_prop.search(key)
660250c95246 admin: Improve support for Micropub.
Ludovic Chabant <ludovic@chabant.com>
parents: 969
diff changeset
171 if not m:
660250c95246 admin: Improve support for Micropub.
Ludovic Chabant <ludovic@chabant.com>
parents: 969
diff changeset
172 properties[key] = vals
660250c95246 admin: Improve support for Micropub.
Ludovic Chabant <ludovic@chabant.com>
parents: 969
diff changeset
173 continue
660250c95246 admin: Improve support for Micropub.
Ludovic Chabant <ludovic@chabant.com>
parents: 969
diff changeset
174
660250c95246 admin: Improve support for Micropub.
Ludovic Chabant <ludovic@chabant.com>
parents: 969
diff changeset
175 key_name_only = key[:m.start()]
660250c95246 admin: Improve support for Micropub.
Ludovic Chabant <ludovic@chabant.com>
parents: 969
diff changeset
176 inner_name = m.group('name')
660250c95246 admin: Improve support for Micropub.
Ludovic Chabant <ludovic@chabant.com>
parents: 969
diff changeset
177 if not inner_name:
660250c95246 admin: Improve support for Micropub.
Ludovic Chabant <ludovic@chabant.com>
parents: 969
diff changeset
178 properties[key_name_only] = vals
660250c95246 admin: Improve support for Micropub.
Ludovic Chabant <ludovic@chabant.com>
parents: 969
diff changeset
179 continue
660250c95246 admin: Improve support for Micropub.
Ludovic Chabant <ludovic@chabant.com>
parents: 969
diff changeset
180
660250c95246 admin: Improve support for Micropub.
Ludovic Chabant <ludovic@chabant.com>
parents: 969
diff changeset
181 properties[key_name_only] = [{inner_name: vals[0]}]
660250c95246 admin: Improve support for Micropub.
Ludovic Chabant <ludovic@chabant.com>
parents: 969
diff changeset
182
660250c95246 admin: Improve support for Micropub.
Ludovic Chabant <ludovic@chabant.com>
parents: 969
diff changeset
183 return {
660250c95246 admin: Improve support for Micropub.
Ludovic Chabant <ludovic@chabant.com>
parents: 969
diff changeset
184 'type': [post_type],
660250c95246 admin: Improve support for Micropub.
Ludovic Chabant <ludovic@chabant.com>
parents: 969
diff changeset
185 'properties': properties}
895
accfe8fc8440 admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
186
970
660250c95246 admin: Improve support for Micropub.
Ludovic Chabant <ludovic@chabant.com>
parents: 969
diff changeset
187
660250c95246 admin: Improve support for Micropub.
Ludovic Chabant <ludovic@chabant.com>
parents: 969
diff changeset
188 def _mf2get(data, key):
660250c95246 admin: Improve support for Micropub.
Ludovic Chabant <ludovic@chabant.com>
parents: 969
diff changeset
189 val = data.get(key)
660250c95246 admin: Improve support for Micropub.
Ludovic Chabant <ludovic@chabant.com>
parents: 969
diff changeset
190 if val is not None:
660250c95246 admin: Improve support for Micropub.
Ludovic Chabant <ludovic@chabant.com>
parents: 969
diff changeset
191 return val[0]
660250c95246 admin: Improve support for Micropub.
Ludovic Chabant <ludovic@chabant.com>
parents: 969
diff changeset
192 return None
660250c95246 admin: Improve support for Micropub.
Ludovic Chabant <ludovic@chabant.com>
parents: 969
diff changeset
193
895
accfe8fc8440 admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
194
970
660250c95246 admin: Improve support for Micropub.
Ludovic Chabant <ludovic@chabant.com>
parents: 969
diff changeset
195 def _create_hentry(data):
660250c95246 admin: Improve support for Micropub.
Ludovic Chabant <ludovic@chabant.com>
parents: 969
diff changeset
196 name = _mf2get(data, 'name')
660250c95246 admin: Improve support for Micropub.
Ludovic Chabant <ludovic@chabant.com>
parents: 969
diff changeset
197 summary = _mf2get(data, 'summary')
660250c95246 admin: Improve support for Micropub.
Ludovic Chabant <ludovic@chabant.com>
parents: 969
diff changeset
198 location = _mf2get(data, 'location')
660250c95246 admin: Improve support for Micropub.
Ludovic Chabant <ludovic@chabant.com>
parents: 969
diff changeset
199 reply_to = _mf2get(data, 'in-reply-to')
660250c95246 admin: Improve support for Micropub.
Ludovic Chabant <ludovic@chabant.com>
parents: 969
diff changeset
200 status = _mf2get(data, 'post-status')
660250c95246 admin: Improve support for Micropub.
Ludovic Chabant <ludovic@chabant.com>
parents: 969
diff changeset
201 # pubdate = _mf2get(data, 'published') or 'now'
660250c95246 admin: Improve support for Micropub.
Ludovic Chabant <ludovic@chabant.com>
parents: 969
diff changeset
202
660250c95246 admin: Improve support for Micropub.
Ludovic Chabant <ludovic@chabant.com>
parents: 969
diff changeset
203 categories = data.get('category')
660250c95246 admin: Improve support for Micropub.
Ludovic Chabant <ludovic@chabant.com>
parents: 969
diff changeset
204
660250c95246 admin: Improve support for Micropub.
Ludovic Chabant <ludovic@chabant.com>
parents: 969
diff changeset
205 # Get the content.
895
accfe8fc8440 admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
206 post_format = None
970
660250c95246 admin: Improve support for Micropub.
Ludovic Chabant <ludovic@chabant.com>
parents: 969
diff changeset
207 content = _mf2get(data, 'content')
660250c95246 admin: Improve support for Micropub.
Ludovic Chabant <ludovic@chabant.com>
parents: 969
diff changeset
208 if isinstance(content, dict):
660250c95246 admin: Improve support for Micropub.
Ludovic Chabant <ludovic@chabant.com>
parents: 969
diff changeset
209 content = content.get('html')
895
accfe8fc8440 admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
210 post_format = 'none'
accfe8fc8440 admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
211 if not content:
accfe8fc8440 admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
212 logger.error("No content specified!")
970
660250c95246 admin: Improve support for Micropub.
Ludovic Chabant <ludovic@chabant.com>
parents: 969
diff changeset
213 logger.error(data)
895
accfe8fc8440 admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
214 abort(400)
accfe8fc8440 admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
215
970
660250c95246 admin: Improve support for Micropub.
Ludovic Chabant <ludovic@chabant.com>
parents: 969
diff changeset
216 # Clean-up stuff.
895
accfe8fc8440 admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
217 # TODO: setting to conserve Windows-type line endings?
accfe8fc8440 admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
218 content = content.replace('\r\n', '\n')
accfe8fc8440 admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
219 if summary:
accfe8fc8440 admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
220 summary = summary.replace('\r\n', '\n')
accfe8fc8440 admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
221
970
660250c95246 admin: Improve support for Micropub.
Ludovic Chabant <ludovic@chabant.com>
parents: 969
diff changeset
222 # Get the slug.
660250c95246 admin: Improve support for Micropub.
Ludovic Chabant <ludovic@chabant.com>
parents: 969
diff changeset
223 slug = _mf2get(data, 'slug') or _mf2get(data, 'mp-slug')
895
accfe8fc8440 admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
224 now = datetime.datetime.now()
accfe8fc8440 admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
225 if not slug:
accfe8fc8440 admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
226 slug = '%02d%02d%02d' % (now.hour, now.minute, now.second)
accfe8fc8440 admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
227
accfe8fc8440 admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
228 # Create the post in the correct content source.
970
660250c95246 admin: Improve support for Micropub.
Ludovic Chabant <ludovic@chabant.com>
parents: 969
diff changeset
229 # Note that this won't actually write anything to disk yet, we're
660250c95246 admin: Improve support for Micropub.
Ludovic Chabant <ludovic@chabant.com>
parents: 969
diff changeset
230 # just creating it in memory.
895
accfe8fc8440 admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
231 pcapp = g.site.piecrust_app
accfe8fc8440 admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
232 source_name = pcapp.config.get('micropub/source', 'posts')
accfe8fc8440 admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
233 source = pcapp.getSource(source_name)
accfe8fc8440 admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
234
accfe8fc8440 admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
235 metadata = {
accfe8fc8440 admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
236 'date': now,
accfe8fc8440 admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
237 'slug': slug
accfe8fc8440 admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
238 }
accfe8fc8440 admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
239 logger.debug("Creating item with metadata: %s" % metadata)
accfe8fc8440 admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
240 content_item = source.createContent(metadata)
accfe8fc8440 admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
241 if content_item is None:
accfe8fc8440 admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
242 logger.error("Can't create item for: %s" % metadata)
accfe8fc8440 admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
243 abort(500)
accfe8fc8440 admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
244
1025
c8366fc15043 admin: Make tumbnails when posting photos, commit to SCM.
Ludovic Chabant <ludovic@chabant.com>
parents: 1024
diff changeset
245 paths_to_commit = []
c8366fc15043 admin: Make tumbnails when posting photos, commit to SCM.
Ludovic Chabant <ludovic@chabant.com>
parents: 1024
diff changeset
246
970
660250c95246 admin: Improve support for Micropub.
Ludovic Chabant <ludovic@chabant.com>
parents: 969
diff changeset
247 # Get the media to attach to the post.
660250c95246 admin: Improve support for Micropub.
Ludovic Chabant <ludovic@chabant.com>
parents: 969
diff changeset
248 photos = None
660250c95246 admin: Improve support for Micropub.
Ludovic Chabant <ludovic@chabant.com>
parents: 969
diff changeset
249 if 'photo' in request.files:
660250c95246 admin: Improve support for Micropub.
Ludovic Chabant <ludovic@chabant.com>
parents: 969
diff changeset
250 photos = [request.files['photo']]
660250c95246 admin: Improve support for Micropub.
Ludovic Chabant <ludovic@chabant.com>
parents: 969
diff changeset
251 elif 'photo[]' in request.files:
660250c95246 admin: Improve support for Micropub.
Ludovic Chabant <ludovic@chabant.com>
parents: 969
diff changeset
252 photos = request.files.getlist('photo[]')
660250c95246 admin: Improve support for Micropub.
Ludovic Chabant <ludovic@chabant.com>
parents: 969
diff changeset
253 photo_urls = data.get('photo')
660250c95246 admin: Improve support for Micropub.
Ludovic Chabant <ludovic@chabant.com>
parents: 969
diff changeset
254
660250c95246 admin: Improve support for Micropub.
Ludovic Chabant <ludovic@chabant.com>
parents: 969
diff changeset
255 # Create the assets folder if we have anything to put there.
895
accfe8fc8440 admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
256 # TODO: add proper APIs for creating related assets.
969
5b735229b6fb admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 964
diff changeset
257 if photo_urls or photos:
895
accfe8fc8440 admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
258 photo_dir, _ = os.path.splitext(content_item.spec)
accfe8fc8440 admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
259 photo_dir += '-assets'
969
5b735229b6fb admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 964
diff changeset
260 try:
5b735229b6fb admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 964
diff changeset
261 os.makedirs(photo_dir, mode=0o775, exist_ok=True)
5b735229b6fb admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 964
diff changeset
262 except OSError:
970
660250c95246 admin: Improve support for Micropub.
Ludovic Chabant <ludovic@chabant.com>
parents: 969
diff changeset
263 # An `OSError` can still be raised in older versions of Python
660250c95246 admin: Improve support for Micropub.
Ludovic Chabant <ludovic@chabant.com>
parents: 969
diff changeset
264 # if the permissions don't match an existing folder.
660250c95246 admin: Improve support for Micropub.
Ludovic Chabant <ludovic@chabant.com>
parents: 969
diff changeset
265 # Let's ignore it.
969
5b735229b6fb admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 964
diff changeset
266 pass
5b735229b6fb admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 964
diff changeset
267
5b735229b6fb admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 964
diff changeset
268 # Photo URLs come from files uploaded via the media endpoint...
5b735229b6fb admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 964
diff changeset
269 # 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
270 # move them to the post's assets folder.
970
660250c95246 admin: Improve support for Micropub.
Ludovic Chabant <ludovic@chabant.com>
parents: 969
diff changeset
271 photo_names = []
969
5b735229b6fb admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 964
diff changeset
272 if photo_urls:
5b735229b6fb admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 964
diff changeset
273 photo_cache_dir = os.path.join(
5b735229b6fb admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 964
diff changeset
274 g.site.root_dir,
5b735229b6fb admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 964
diff changeset
275 CACHE_DIR, g.site.piecrust_factory.cache_key,
5b735229b6fb admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 964
diff changeset
276 'uploads')
895
accfe8fc8440 admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
277
1025
c8366fc15043 admin: Make tumbnails when posting photos, commit to SCM.
Ludovic Chabant <ludovic@chabant.com>
parents: 1024
diff changeset
278 p_thumb_size = pcapp.config.get('micropub/resize_photos', 800)
c8366fc15043 admin: Make tumbnails when posting photos, commit to SCM.
Ludovic Chabant <ludovic@chabant.com>
parents: 1024
diff changeset
279
969
5b735229b6fb admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 964
diff changeset
280 for p_url in photo_urls:
1024
60b431c57ea9 admin: Handle multiple photo uploads in the micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents: 970
diff changeset
281 _, __, p_fn = p_url.rpartition('/')
60b431c57ea9 admin: Handle multiple photo uploads in the micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents: 970
diff changeset
282 p_cache_path = os.path.join(photo_cache_dir, p_fn)
60b431c57ea9 admin: Handle multiple photo uploads in the micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents: 970
diff changeset
283 p_asset_path = os.path.join(photo_dir, p_fn)
60b431c57ea9 admin: Handle multiple photo uploads in the micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents: 970
diff changeset
284 logger.info("Moving upload '%s' to '%s'." %
60b431c57ea9 admin: Handle multiple photo uploads in the micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents: 970
diff changeset
285 (p_cache_path, p_asset_path))
970
660250c95246 admin: Improve support for Micropub.
Ludovic Chabant <ludovic@chabant.com>
parents: 969
diff changeset
286 try:
1024
60b431c57ea9 admin: Handle multiple photo uploads in the micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents: 970
diff changeset
287 os.rename(p_cache_path, p_asset_path)
1025
c8366fc15043 admin: Make tumbnails when posting photos, commit to SCM.
Ludovic Chabant <ludovic@chabant.com>
parents: 1024
diff changeset
288 paths_to_commit.append(p_asset_path)
970
660250c95246 admin: Improve support for Micropub.
Ludovic Chabant <ludovic@chabant.com>
parents: 969
diff changeset
289 except OSError:
1024
60b431c57ea9 admin: Handle multiple photo uploads in the micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents: 970
diff changeset
290 logger.error("Can't move '%s' to '%s'." %
60b431c57ea9 admin: Handle multiple photo uploads in the micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents: 970
diff changeset
291 (p_cache_path, p_asset_path))
970
660250c95246 admin: Improve support for Micropub.
Ludovic Chabant <ludovic@chabant.com>
parents: 969
diff changeset
292 raise
969
5b735229b6fb admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 964
diff changeset
293
5b735229b6fb admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 964
diff changeset
294 p_fn_no_ext, _ = os.path.splitext(p_fn)
1025
c8366fc15043 admin: Make tumbnails when posting photos, commit to SCM.
Ludovic Chabant <ludovic@chabant.com>
parents: 1024
diff changeset
295 if p_thumb_size > 0:
c8366fc15043 admin: Make tumbnails when posting photos, commit to SCM.
Ludovic Chabant <ludovic@chabant.com>
parents: 1024
diff changeset
296 from PIL import Image
c8366fc15043 admin: Make tumbnails when posting photos, commit to SCM.
Ludovic Chabant <ludovic@chabant.com>
parents: 1024
diff changeset
297 im = Image.open(p_asset_path)
c8366fc15043 admin: Make tumbnails when posting photos, commit to SCM.
Ludovic Chabant <ludovic@chabant.com>
parents: 1024
diff changeset
298 im.thumbnail((p_thumb_size, p_thumb_size))
c8366fc15043 admin: Make tumbnails when posting photos, commit to SCM.
Ludovic Chabant <ludovic@chabant.com>
parents: 1024
diff changeset
299 p_thumb_path = os.path.join(photo_dir,
c8366fc15043 admin: Make tumbnails when posting photos, commit to SCM.
Ludovic Chabant <ludovic@chabant.com>
parents: 1024
diff changeset
300 '%s_thumb.jpg' % p_fn_no_ext)
c8366fc15043 admin: Make tumbnails when posting photos, commit to SCM.
Ludovic Chabant <ludovic@chabant.com>
parents: 1024
diff changeset
301 im.save(p_thumb_path)
c8366fc15043 admin: Make tumbnails when posting photos, commit to SCM.
Ludovic Chabant <ludovic@chabant.com>
parents: 1024
diff changeset
302 paths_to_commit.append(p_thumb_path)
c8366fc15043 admin: Make tumbnails when posting photos, commit to SCM.
Ludovic Chabant <ludovic@chabant.com>
parents: 1024
diff changeset
303
c8366fc15043 admin: Make tumbnails when posting photos, commit to SCM.
Ludovic Chabant <ludovic@chabant.com>
parents: 1024
diff changeset
304 p_thumb_no_ext = '%s_thumb' % p_fn_no_ext
c8366fc15043 admin: Make tumbnails when posting photos, commit to SCM.
Ludovic Chabant <ludovic@chabant.com>
parents: 1024
diff changeset
305 photo_names.append((p_thumb_no_ext, p_fn_no_ext))
c8366fc15043 admin: Make tumbnails when posting photos, commit to SCM.
Ludovic Chabant <ludovic@chabant.com>
parents: 1024
diff changeset
306 else:
c8366fc15043 admin: Make tumbnails when posting photos, commit to SCM.
Ludovic Chabant <ludovic@chabant.com>
parents: 1024
diff changeset
307 photo_names.append((p_fn_no_ext, None))
969
5b735229b6fb admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 964
diff changeset
308
5b735229b6fb admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 964
diff changeset
309 # There could also be some files uploaded along with the post
5b735229b6fb admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 964
diff changeset
310 # so upload them right now.
5b735229b6fb admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 964
diff changeset
311 if photos:
895
accfe8fc8440 admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
312 for photo in photos:
accfe8fc8440 admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
313 if not photo or not photo.filename:
accfe8fc8440 admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
314 logger.warning("Got empty photo in request files... skipping.")
accfe8fc8440 admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
315 continue
accfe8fc8440 admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
316
accfe8fc8440 admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
317 fn = secure_filename(photo.filename)
accfe8fc8440 admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
318 fn = re_unsafe_asset_char.sub('_', fn)
accfe8fc8440 admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
319 photo_path = os.path.join(photo_dir, fn)
accfe8fc8440 admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
320 logger.info("Uploading file to: %s" % photo_path)
accfe8fc8440 admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
321 photo.save(photo_path)
1025
c8366fc15043 admin: Make tumbnails when posting photos, commit to SCM.
Ludovic Chabant <ludovic@chabant.com>
parents: 1024
diff changeset
322 paths_to_commit.append(photo_path)
c8366fc15043 admin: Make tumbnails when posting photos, commit to SCM.
Ludovic Chabant <ludovic@chabant.com>
parents: 1024
diff changeset
323
c8366fc15043 admin: Make tumbnails when posting photos, commit to SCM.
Ludovic Chabant <ludovic@chabant.com>
parents: 1024
diff changeset
324 # TODO: generate thumbnail.
895
accfe8fc8440 admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
325
accfe8fc8440 admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
326 fn_no_ext, _ = os.path.splitext(fn)
1025
c8366fc15043 admin: Make tumbnails when posting photos, commit to SCM.
Ludovic Chabant <ludovic@chabant.com>
parents: 1024
diff changeset
327 photo_names.append((fn_no_ext, None))
895
accfe8fc8440 admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
328
964
d65838abbd90 admin: Better micropub request handling.
Ludovic Chabant <ludovic@chabant.com>
parents: 895
diff changeset
329 # Build the config.
1024
60b431c57ea9 admin: Handle multiple photo uploads in the micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents: 970
diff changeset
330 do_publish = True
964
d65838abbd90 admin: Better micropub request handling.
Ludovic Chabant <ludovic@chabant.com>
parents: 895
diff changeset
331 post_config = {}
d65838abbd90 admin: Better micropub request handling.
Ludovic Chabant <ludovic@chabant.com>
parents: 895
diff changeset
332 if name:
d65838abbd90 admin: Better micropub request handling.
Ludovic Chabant <ludovic@chabant.com>
parents: 895
diff changeset
333 post_config['title'] = name
d65838abbd90 admin: Better micropub request handling.
Ludovic Chabant <ludovic@chabant.com>
parents: 895
diff changeset
334 if categories:
d65838abbd90 admin: Better micropub request handling.
Ludovic Chabant <ludovic@chabant.com>
parents: 895
diff changeset
335 post_config['tags'] = categories
d65838abbd90 admin: Better micropub request handling.
Ludovic Chabant <ludovic@chabant.com>
parents: 895
diff changeset
336 if location:
d65838abbd90 admin: Better micropub request handling.
Ludovic Chabant <ludovic@chabant.com>
parents: 895
diff changeset
337 post_config['location'] = location
d65838abbd90 admin: Better micropub request handling.
Ludovic Chabant <ludovic@chabant.com>
parents: 895
diff changeset
338 if reply_to:
d65838abbd90 admin: Better micropub request handling.
Ludovic Chabant <ludovic@chabant.com>
parents: 895
diff changeset
339 post_config['reply_to'] = reply_to
970
660250c95246 admin: Improve support for Micropub.
Ludovic Chabant <ludovic@chabant.com>
parents: 969
diff changeset
340 if status and status != 'published':
660250c95246 admin: Improve support for Micropub.
Ludovic Chabant <ludovic@chabant.com>
parents: 969
diff changeset
341 post_config['draft'] = True
1024
60b431c57ea9 admin: Handle multiple photo uploads in the micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents: 970
diff changeset
342 do_publish = False
964
d65838abbd90 admin: Better micropub request handling.
Ludovic Chabant <ludovic@chabant.com>
parents: 895
diff changeset
343 if post_format:
d65838abbd90 admin: Better micropub request handling.
Ludovic Chabant <ludovic@chabant.com>
parents: 895
diff changeset
344 post_config['format'] = post_format
d65838abbd90 admin: Better micropub request handling.
Ludovic Chabant <ludovic@chabant.com>
parents: 895
diff changeset
345 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
346
d65838abbd90 admin: Better micropub request handling.
Ludovic Chabant <ludovic@chabant.com>
parents: 895
diff changeset
347 # 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
348 if not name:
d65838abbd90 admin: Better micropub request handling.
Ludovic Chabant <ludovic@chabant.com>
parents: 895
diff changeset
349 micro_config = pcapp.config.get('micropub/microblogging')
d65838abbd90 admin: Better micropub request handling.
Ludovic Chabant <ludovic@chabant.com>
parents: 895
diff changeset
350 if micro_config:
d65838abbd90 admin: Better micropub request handling.
Ludovic Chabant <ludovic@chabant.com>
parents: 895
diff changeset
351 merge_dicts(post_config, micro_config)
d65838abbd90 admin: Better micropub request handling.
Ludovic Chabant <ludovic@chabant.com>
parents: 895
diff changeset
352
895
accfe8fc8440 admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
353 logger.debug("Writing to item: %s" % content_item.spec)
1025
c8366fc15043 admin: Make tumbnails when posting photos, commit to SCM.
Ludovic Chabant <ludovic@chabant.com>
parents: 1024
diff changeset
354 paths_to_commit.append(content_item.spec)
970
660250c95246 admin: Improve support for Micropub.
Ludovic Chabant <ludovic@chabant.com>
parents: 969
diff changeset
355 with source.openItem(content_item, mode='w', encoding='utf8') as fp:
895
accfe8fc8440 admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
356 fp.write('---\n')
964
d65838abbd90 admin: Better micropub request handling.
Ludovic Chabant <ludovic@chabant.com>
parents: 895
diff changeset
357 yaml.dump(post_config, fp,
d65838abbd90 admin: Better micropub request handling.
Ludovic Chabant <ludovic@chabant.com>
parents: 895
diff changeset
358 default_flow_style=False,
d65838abbd90 admin: Better micropub request handling.
Ludovic Chabant <ludovic@chabant.com>
parents: 895
diff changeset
359 allow_unicode=True)
895
accfe8fc8440 admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
360 fp.write('---\n')
accfe8fc8440 admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
361
accfe8fc8440 admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
362 if summary:
accfe8fc8440 admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
363 fp.write(summary)
accfe8fc8440 admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
364 fp.write('\n')
accfe8fc8440 admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
365 fp.write('<!--break-->\n\n')
accfe8fc8440 admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
366 fp.write(content)
accfe8fc8440 admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
367
accfe8fc8440 admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
368 if photo_names:
accfe8fc8440 admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
369 fp.write('\n\n')
1025
c8366fc15043 admin: Make tumbnails when posting photos, commit to SCM.
Ludovic Chabant <ludovic@chabant.com>
parents: 1024
diff changeset
370 for pthumb, pfull in photo_names:
c8366fc15043 admin: Make tumbnails when posting photos, commit to SCM.
Ludovic Chabant <ludovic@chabant.com>
parents: 1024
diff changeset
371 if pfull:
c8366fc15043 admin: Make tumbnails when posting photos, commit to SCM.
Ludovic Chabant <ludovic@chabant.com>
parents: 1024
diff changeset
372 fp.write('<a href="{{assets["%s"]}}">'
c8366fc15043 admin: Make tumbnails when posting photos, commit to SCM.
Ludovic Chabant <ludovic@chabant.com>
parents: 1024
diff changeset
373 '<img src="{{assets["%s"]}}" alt="%s"/>'
c8366fc15043 admin: Make tumbnails when posting photos, commit to SCM.
Ludovic Chabant <ludovic@chabant.com>
parents: 1024
diff changeset
374 '</a>\n\n' %
c8366fc15043 admin: Make tumbnails when posting photos, commit to SCM.
Ludovic Chabant <ludovic@chabant.com>
parents: 1024
diff changeset
375 (pfull, pthumb, pthumb))
c8366fc15043 admin: Make tumbnails when posting photos, commit to SCM.
Ludovic Chabant <ludovic@chabant.com>
parents: 1024
diff changeset
376 else:
c8366fc15043 admin: Make tumbnails when posting photos, commit to SCM.
Ludovic Chabant <ludovic@chabant.com>
parents: 1024
diff changeset
377 fp.write('<img src="{{assets["%s"]}}" alt="%s"/>\n\n' %
c8366fc15043 admin: Make tumbnails when posting photos, commit to SCM.
Ludovic Chabant <ludovic@chabant.com>
parents: 1024
diff changeset
378 (pthumb, pthumb))
895
accfe8fc8440 admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
379
969
5b735229b6fb admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 964
diff changeset
380 if os.supports_fd:
5b735229b6fb admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 964
diff changeset
381 import stat
5b735229b6fb admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 964
diff changeset
382 try:
1121
41b7ce0d5131 internal: PEP8.
Ludovic Chabant <ludovic@chabant.com>
parents: 1025
diff changeset
383 os.chmod(
41b7ce0d5131 internal: PEP8.
Ludovic Chabant <ludovic@chabant.com>
parents: 1025
diff changeset
384 fp.fileno(),
41b7ce0d5131 internal: PEP8.
Ludovic Chabant <ludovic@chabant.com>
parents: 1025
diff changeset
385 stat.S_IRUSR | stat.S_IWUSR | stat.S_IRGRP | stat.S_IWGRP)
969
5b735229b6fb admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 964
diff changeset
386 except OSError:
5b735229b6fb admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 964
diff changeset
387 pass
895
accfe8fc8440 admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
388
1025
c8366fc15043 admin: Make tumbnails when posting photos, commit to SCM.
Ludovic Chabant <ludovic@chabant.com>
parents: 1024
diff changeset
389 autocommit = pcapp.config.get('micropub/autocommit', False)
c8366fc15043 admin: Make tumbnails when posting photos, commit to SCM.
Ludovic Chabant <ludovic@chabant.com>
parents: 1024
diff changeset
390 if autocommit:
c8366fc15043 admin: Make tumbnails when posting photos, commit to SCM.
Ludovic Chabant <ludovic@chabant.com>
parents: 1024
diff changeset
391 scm = g.site.scm
c8366fc15043 admin: Make tumbnails when posting photos, commit to SCM.
Ludovic Chabant <ludovic@chabant.com>
parents: 1024
diff changeset
392 if scm:
c8366fc15043 admin: Make tumbnails when posting photos, commit to SCM.
Ludovic Chabant <ludovic@chabant.com>
parents: 1024
diff changeset
393 commit_msg = None
c8366fc15043 admin: Make tumbnails when posting photos, commit to SCM.
Ludovic Chabant <ludovic@chabant.com>
parents: 1024
diff changeset
394 if isinstance(autocommit, dict):
c8366fc15043 admin: Make tumbnails when posting photos, commit to SCM.
Ludovic Chabant <ludovic@chabant.com>
parents: 1024
diff changeset
395 commit_msg = autocommit.get('message')
c8366fc15043 admin: Make tumbnails when posting photos, commit to SCM.
Ludovic Chabant <ludovic@chabant.com>
parents: 1024
diff changeset
396 if not commit_msg:
c8366fc15043 admin: Make tumbnails when posting photos, commit to SCM.
Ludovic Chabant <ludovic@chabant.com>
parents: 1024
diff changeset
397 post_title = post_config.get('title')
c8366fc15043 admin: Make tumbnails when posting photos, commit to SCM.
Ludovic Chabant <ludovic@chabant.com>
parents: 1024
diff changeset
398 if post_title:
c8366fc15043 admin: Make tumbnails when posting photos, commit to SCM.
Ludovic Chabant <ludovic@chabant.com>
parents: 1024
diff changeset
399 commit_msg = "New post: %s" % post_title
c8366fc15043 admin: Make tumbnails when posting photos, commit to SCM.
Ludovic Chabant <ludovic@chabant.com>
parents: 1024
diff changeset
400 else:
c8366fc15043 admin: Make tumbnails when posting photos, commit to SCM.
Ludovic Chabant <ludovic@chabant.com>
parents: 1024
diff changeset
401 commit_msg = "New post"
c8366fc15043 admin: Make tumbnails when posting photos, commit to SCM.
Ludovic Chabant <ludovic@chabant.com>
parents: 1024
diff changeset
402 logger.debug("Commit files: %s" % paths_to_commit)
c8366fc15043 admin: Make tumbnails when posting photos, commit to SCM.
Ludovic Chabant <ludovic@chabant.com>
parents: 1024
diff changeset
403 scm.commit(paths_to_commit, commit_msg)
c8366fc15043 admin: Make tumbnails when posting photos, commit to SCM.
Ludovic Chabant <ludovic@chabant.com>
parents: 1024
diff changeset
404
1024
60b431c57ea9 admin: Handle multiple photo uploads in the micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents: 970
diff changeset
405 return source_name, content_item, do_publish
969
5b735229b6fb admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents: 964
diff changeset
406