From a6ea88f35288efdfbc243cce609858888eb89f01 Mon Sep 17 00:00:00 2001 From: Her Email Date: Sun, 19 Nov 2023 00:56:39 -0500 Subject: [PATCH] post activitypub message for review --- journal/api.py | 12 ++++++---- journal/models/review.py | 23 ++++++++++++++++--- journal/tests.py | 2 +- journal/views/review.py | 11 ++++++--- takahe/utils.py | 48 +++++++++++++++++++++++++++++++++++++++- 5 files changed, 84 insertions(+), 12 deletions(-) diff --git a/journal/api.py b/journal/api.py index dbe7440e..ac0dd094 100644 --- a/journal/api.py +++ b/journal/api.py @@ -10,7 +10,7 @@ from oauth2_provider.decorators import protected_resource from catalog.common.models import * from common.api import * -from mastodon.api import share_review +from mastodon.api import boost_toot from .models import Mark, Review, ShelfType, TagManager, q_item_in_category @@ -195,7 +195,7 @@ def review_item(request, item_uuid: str, review: ReviewInSchema): item = Item.get_by_url(item_uuid) if not item: return 404, {"message": "Item not found"} - Review.update_item_review( + r, p = Review.update_item_review( item, request.user, review.title, @@ -203,8 +203,12 @@ def review_item(request, item_uuid: str, review: ReviewInSchema): review.visibility, created_time=review.created_time, ) - if review.post_to_fediverse and request.user.mastodon_username: - share_review(review) + if p and review.post_to_fediverse and request.user.mastodon_username: + boost_toot( + request.user.mastodon_site, + request.user.mastodon_token, + p.url, + ) return 200, {"message": "OK"} diff --git a/journal/models/review.py b/journal/models/review.py index c7129f42..8b31f0c4 100644 --- a/journal/models/review.py +++ b/journal/models/review.py @@ -33,6 +33,20 @@ class Review(Content): " ", _RE_SPOILER_TAG.sub("***", html.replace("\n", " ")) ) + @property + def ap_object(self): + return { + "id": self.absolute_url, + "type": "Review", + "name": self.title, + "content": self.html_content, + "published": self.created_time.isoformat(), + "updated": self.edited_time.isoformat(), + "attributedTo": self.owner.actor_uri, + "relatedWith": self.item.absolute_url, + "href": self.absolute_url, + } + @cached_property def mark(self): from .mark import Mark @@ -55,11 +69,13 @@ class Review(Content): visibility=0, created_time=None, ): + from takahe.utils import Takahe + if title is None: review = Review.objects.filter(owner=owner, item=item).first() if review is not None: review.delete() - return None + return None, None defaults = { "title": title, "body": body, @@ -69,7 +85,8 @@ class Review(Content): defaults["created_time"] = ( created_time if created_time < timezone.now() else timezone.now() ) - review, _ = cls.objects.update_or_create( + review, created = cls.objects.update_or_create( item=item, owner=owner, defaults=defaults ) - return review + post = Takahe.post_review(review, created) + return review, post diff --git a/journal/tests.py b/journal/tests.py index 0e87ae1e..e505206e 100644 --- a/journal/tests.py +++ b/journal/tests.py @@ -166,7 +166,7 @@ class MarkTest(TestCase): self.assertEqual(mark.tags, []) def test_review(self): - review = Review.update_item_review( + review, post = Review.update_item_review( self.book1, self.user1.identity, "Critic", "Review" ) mark = Mark(self.user1.identity, self.book1) diff --git a/journal/views/review.py b/journal/views/review.py index fa83fd76..f68d0b21 100644 --- a/journal/views/review.py +++ b/journal/views/review.py @@ -14,7 +14,7 @@ from django.utils.translation import gettext_lazy as _ from catalog.models import * from common.utils import AuthedHttpRequest, PageLinksGenerator, get_uuid_or_404 from journal.models.renderers import convert_leading_space_in_md, render_md -from mastodon.api import share_review +from mastodon.api import boost_toot from users.models import User from users.models.apidentity import APIdentity @@ -74,7 +74,7 @@ def review_edit(request: AuthedHttpRequest, item_uuid, review_uuid=None): body = form.instance.body if request.POST.get("leading_space"): body = convert_leading_space_in_md(body) - review = Review.update_item_review( + review, post = Review.update_item_review( item, request.user.identity, form.cleaned_data["title"], @@ -87,8 +87,13 @@ def review_edit(request: AuthedHttpRequest, item_uuid, review_uuid=None): if ( form.cleaned_data["share_to_mastodon"] and request.user.mastodon_username + and post ): - share_review(review) + boost_toot( + request.user.mastodon_site, + request.user.mastodon_token, + post.url, + ) return redirect(reverse("journal:review_retrieve", args=[review.uuid])) else: raise BadRequest() diff --git a/takahe/utils.py b/takahe/utils.py index 29ff4dd1..897f357a 100644 --- a/takahe/utils.py +++ b/takahe/utils.py @@ -397,10 +397,56 @@ class Takahe: def delete_posts(post_pks): Post.objects.filter(pk__in=post_pks).update(state="deleted") + @staticmethod + def post_review(review, share_as_new_post: bool) -> Post | None: + from catalog.common import ItemCategory + + user = review.owner.user + tags = ( + "\n" + + user.preference.mastodon_append_tag.replace( + "[category]", str(ItemCategory(review.item.category).label) + ) + if user.preference.mastodon_append_tag + else "" + ) + stars = _rating_to_emoji(review.rating_grade, 1) + item_link = f"{settings.SITE_INFO['site_url']}/~neodb~{review.item.url}" + + pre_conetent = f'发布了关于《{review.item.display_title}》的评论:
{review.title}' + content = f"{stars}\n{tags}" + data = { + "object": { + "tag": [review.item.ap_object_ref], + "relatedWith": [review.ap_object], + } + } + if review.visibility == 1: + v = Takahe.Visibilities.followers + elif review.visibility == 2: + v = Takahe.Visibilities.mentioned + elif user.preference.mastodon_publish_public: + v = Takahe.Visibilities.public + else: + v = Takahe.Visibilities.unlisted + existing_post = None if share_as_new_post else review.latest_post + post = Takahe.post( # TODO post as Article? + review.owner.pk, + pre_conetent, + content, + v, + data, + existing_post.pk if existing_post else None, + review.created_time, + ) + if not post: + return + review.link_post(post) + return post + @staticmethod def post_mark(mark, share_as_new_post: bool) -> Post | None: from catalog.common import ItemCategory - from takahe.utils import Takahe user = mark.owner.user tags = (