From d3fd365a37c92cb16a139b58010ceaaacbd7999e Mon Sep 17 00:00:00 2001 From: Andrew Godwin Date: Thu, 29 Dec 2022 10:53:31 -0700 Subject: [PATCH] Add boost JSON (also fix hashtag URLs) Fixes #313 --- activities/models/hashtag.py | 1 + activities/models/post_interaction.py | 39 +++++++++++++++++++++++++++ activities/models/timeline_event.py | 10 +++++++ api/views/timelines.py | 2 +- 4 files changed, 51 insertions(+), 1 deletion(-) diff --git a/activities/models/hashtag.py b/activities/models/hashtag.py index 3bf424f..7d34892 100644 --- a/activities/models/hashtag.py +++ b/activities/models/hashtag.py @@ -114,6 +114,7 @@ class Hashtag(StatorModel): objects = HashtagManager() class urls(urlman.Urls): + view = "/tags/{self.hashtag}/" admin = "/admin/hashtags/" admin_edit = "{admin}{self.hashtag}/" timeline = "/tags/{self.hashtag}/" diff --git a/activities/models/post_interaction.py b/activities/models/post_interaction.py index 3746b3b..cce88ab 100644 --- a/activities/models/post_interaction.py +++ b/activities/models/post_interaction.py @@ -322,3 +322,42 @@ class PostInteraction(StatorModel): interaction.timeline_events.all().delete() # Force it into undone_fanned_out as it's not ours interaction.transition_perform(PostInteractionStates.undone_fanned_out) + + ### Mastodon API ### + + def to_mastodon_status_json(self, interactions=None): + """ + This wraps Posts in a fake Status for boost interactions. + """ + if self.type != self.Types.boost: + raise ValueError( + f"Cannot make status JSON for interaction of type {self.type}" + ) + # Grab our subject post JSON, and just return it if we're a post + post_json = self.post.to_mastodon_json(interactions=interactions) + return { + "id": f"interaction-{self.pk}", + "uri": post_json["uri"], + "created_at": format_ld_date(self.published), + "account": self.identity.to_mastodon_json(), + "content": "", + "visibility": post_json["visibility"], + "sensitive": post_json["sensitive"], + "spoiler_text": post_json["spoiler_text"], + "media_attachments": [], + "mentions": [], + "tags": [], + "emojis": [], + "reblogs_count": 0, + "favourites_count": 0, + "replies_count": 0, + "url": post_json["url"], + "in_reply_to_id": None, + "in_reply_to_account_id": None, + "poll": None, + "card": None, + "language": None, + "text": "", + "edited_at": None, + "reblog": post_json, + } diff --git a/activities/models/timeline_event.py b/activities/models/timeline_event.py index 02eef2f..e77efb9 100644 --- a/activities/models/timeline_event.py +++ b/activities/models/timeline_event.py @@ -181,3 +181,13 @@ class TimelineEvent(models.Model): else: raise ValueError(f"Cannot convert {self.type} to notification JSON") return result + + def to_mastodon_status_json(self, interactions=None): + if self.type == self.Types.post: + return self.subject_post.to_mastodon_json(interactions=interactions) + elif self.type == self.Types.boost: + return self.subject_post_interaction.to_mastodon_status_json( + interactions=interactions + ) + else: + raise ValueError(f"Cannot make status JSON for type {self.type}") diff --git a/api/views/timelines.py b/api/views/timelines.py index 9099768..1ac4964 100644 --- a/api/views/timelines.py +++ b/api/views/timelines.py @@ -41,7 +41,7 @@ def home( ) return [ - event.subject_post.to_mastodon_json(interactions=interactions) + event.to_mastodon_status_json(interactions=interactions) for event in pager.results ]