Mercurial > piecrust2
annotate piecrust/admin/views/micropub.py @ 1025:c8366fc15043
admin: Make tumbnails when posting photos, commit to SCM.
author | Ludovic Chabant <ludovic@chabant.com> |
---|---|
date | Mon, 25 Dec 2017 19:01:01 -0800 |
parents | 60b431c57ea9 |
children | 41b7ce0d5131 |
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) |
660250c95246
admin: Improve support for Micropub.
Ludovic Chabant <ludovic@chabant.com>
parents:
969
diff
changeset
|
52 except: |
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)) |
660250c95246
admin: Improve support for Micropub.
Ludovic Chabant <ludovic@chabant.com>
parents:
969
diff
changeset
|
66 except: |
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: |
660250c95246
admin: Improve support for Micropub.
Ludovic Chabant <ludovic@chabant.com>
parents:
969
diff
changeset
|
79 logger.error("Post type '%s' is not supported." % post_type) |
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({ |
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
128 "media-endpoint": endpoint_url |
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: |
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
383 os.chmod(fp.fileno(), |
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
384 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
|
385 except OSError: |
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
386 pass |
895
accfe8fc8440
admin: Add a Micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
387 |
1025
c8366fc15043
admin: Make tumbnails when posting photos, commit to SCM.
Ludovic Chabant <ludovic@chabant.com>
parents:
1024
diff
changeset
|
388 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
|
389 if autocommit: |
c8366fc15043
admin: Make tumbnails when posting photos, commit to SCM.
Ludovic Chabant <ludovic@chabant.com>
parents:
1024
diff
changeset
|
390 scm = g.site.scm |
c8366fc15043
admin: Make tumbnails when posting photos, commit to SCM.
Ludovic Chabant <ludovic@chabant.com>
parents:
1024
diff
changeset
|
391 if scm: |
c8366fc15043
admin: Make tumbnails when posting photos, commit to SCM.
Ludovic Chabant <ludovic@chabant.com>
parents:
1024
diff
changeset
|
392 commit_msg = None |
c8366fc15043
admin: Make tumbnails when posting photos, commit to SCM.
Ludovic Chabant <ludovic@chabant.com>
parents:
1024
diff
changeset
|
393 if isinstance(autocommit, dict): |
c8366fc15043
admin: Make tumbnails when posting photos, commit to SCM.
Ludovic Chabant <ludovic@chabant.com>
parents:
1024
diff
changeset
|
394 commit_msg = autocommit.get('message') |
c8366fc15043
admin: Make tumbnails when posting photos, commit to SCM.
Ludovic Chabant <ludovic@chabant.com>
parents:
1024
diff
changeset
|
395 if not commit_msg: |
c8366fc15043
admin: Make tumbnails when posting photos, commit to SCM.
Ludovic Chabant <ludovic@chabant.com>
parents:
1024
diff
changeset
|
396 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
|
397 if post_title: |
c8366fc15043
admin: Make tumbnails when posting photos, commit to SCM.
Ludovic Chabant <ludovic@chabant.com>
parents:
1024
diff
changeset
|
398 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
|
399 else: |
c8366fc15043
admin: Make tumbnails when posting photos, commit to SCM.
Ludovic Chabant <ludovic@chabant.com>
parents:
1024
diff
changeset
|
400 commit_msg = "New post" |
c8366fc15043
admin: Make tumbnails when posting photos, commit to SCM.
Ludovic Chabant <ludovic@chabant.com>
parents:
1024
diff
changeset
|
401 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
|
402 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
|
403 |
1024
60b431c57ea9
admin: Handle multiple photo uploads in the micropub endpoint.
Ludovic Chabant <ludovic@chabant.com>
parents:
970
diff
changeset
|
404 return source_name, content_item, do_publish |
969
5b735229b6fb
admin: Micropub improvements.
Ludovic Chabant <ludovic@chabant.com>
parents:
964
diff
changeset
|
405 |