From 85af2783a323097dac000748cc290420521d1d40 Mon Sep 17 00:00:00 2001 From: Your Name Date: Tue, 18 Jul 2023 17:31:51 -0400 Subject: [PATCH] fix sharing error --- common/templates/common/error.html | 1 + journal/models.py | 9 +++++++-- journal/views.py | 15 +++++++++++++-- mastodon/api.py | 16 ++++++++-------- 4 files changed, 29 insertions(+), 12 deletions(-) diff --git a/common/templates/common/error.html b/common/templates/common/error.html index 17f5ec43..1b61ebdb 100644 --- a/common/templates/common/error.html +++ b/common/templates/common/error.html @@ -13,6 +13,7 @@ {{ site_name }} - {% trans '错误' %} {% include "common_libs.html" with jquery=0 v2=1 %} + {% if url %}{% endif %} {% include "_header.html" %} diff --git a/journal/models.py b/journal/models.py index 50d4d259..6deb3993 100644 --- a/journal/models.py +++ b/journal/models.py @@ -24,6 +24,7 @@ from catalog.models import * from .renderers import render_md, render_text from catalog.common import jsondata from django.db import connection +from django.core.exceptions import PermissionDenied _logger = logging.getLogger(__name__) @@ -1215,8 +1216,12 @@ class Mark: else None ) self.save = lambda **args: None - if not share_mark(self): - raise ValueError("sharing failed") + result, code = share_mark(self) + if not result: + if code == 401: + raise PermissionDenied() + else: + raise ValueError(code) if self.shelfmember.metadata.get("shared_link") != self.shared_link: self.shelfmember.metadata["shared_link"] = self.shared_link self.shelfmember.save() diff --git a/journal/views.py b/journal/views.py index 57270903..fad23024 100644 --- a/journal/views.py +++ b/journal/views.py @@ -190,9 +190,20 @@ def mark(request, item_uuid): share_to_mastodon=share_to_mastodon, created_time=mark_date, ) - except ValueError as e: - _logger.warn(f"post to mastodon error {e}") + except PermissionDenied as e: + _logger.warn(f"post to mastodon error 401 {request.user}") return render_relogin(request) + except ValueError as e: + _logger.warn(f"post to mastodon error {e} {request.user}") + err = _("内容长度超出实例限制") if str(e) == "422" else str(e) + return render( + request, + "common/error.html", + { + "msg": _("标记已保存,但是未能分享到联邦宇宙"), + "secondary_msg": err, + }, + ) return HttpResponseRedirect(request.META.get("HTTP_REFERER")) raise BadRequest() diff --git a/mastodon/api.py b/mastodon/api.py index 8b0d3f46..2b5f0073 100644 --- a/mastodon/api.py +++ b/mastodon/api.py @@ -92,12 +92,12 @@ def post_toot( try: if update_id: response = put(url + "/" + update_id, headers=headers, data=payload) - if update_id is None or (response and response.status_code != 200): + if not update_id or (response is not None and response.status_code != 200): headers["Idempotency-Key"] = random_string_generator(16) response = post(url, headers=headers, data=payload) - if response and response.status_code == 201: + if response is not None and response.status_code == 201: response.status_code = 200 - if response and response.status_code != 200: + if response is not None and response.status_code != 200: logger.error(f"Error {url} {response.status_code}") except Exception: response = None @@ -394,16 +394,16 @@ def share_mark(mark): update_id, spoiler_text, ) - if response and response.status_code in [200, 201]: + if response is not None and response.status_code in [200, 201]: j = response.json() if "url" in j: mark.shared_link = j["url"] if mark.shared_link: mark.save(update_fields=["shared_link"]) - return True + return True, 200 else: logger.error(response) - return False + return False, response.status_code if response is not None else -1 def share_review(review): @@ -438,7 +438,7 @@ def share_review(review): response = post_toot( user.mastodon_site, content, visibility, user.mastodon_token, False, update_id ) - if response and response.status_code in [200, 201]: + if response is not None and response.status_code in [200, 201]: j = response.json() if "url" in j: review.metadata["shared_link"] = j["url"] @@ -473,7 +473,7 @@ def share_collection(collection, comment, user, visibility_no): ) content = f"分享{user_str}的收藏单《{collection.title}》\n{collection.absolute_url}\n{comment}{tags}" response = post_toot(user.mastodon_site, content, visibility, user.mastodon_token) - if response and response.status_code in [200, 201]: + if response is not None and response.status_code in [200, 201]: return True else: return False