diff --git a/common/views.py b/common/views.py
index f9d8a0cc..c2141c02 100644
--- a/common/views.py
+++ b/common/views.py
@@ -34,7 +34,7 @@ def home(request):
def ap_redirect(request, uri):
- return redirect(uri)
+ return redirect(request.get_full_path().replace("~neodb~", "/"))
def nodeinfo2(request):
diff --git a/journal/models/comment.py b/journal/models/comment.py
index b3ed0940..ccc26a54 100644
--- a/journal/models/comment.py
+++ b/journal/models/comment.py
@@ -1,8 +1,10 @@
from datetime import datetime
from functools import cached_property
+from django.conf import settings
from django.db import models
from django.utils import timezone
+from django.utils.translation import gettext as _
from catalog.models import Item
from takahe.utils import Takahe
@@ -10,7 +12,13 @@ from users.models import APIdentity
from .common import Content
from .rating import Rating
-from .renderers import render_text
+from .renderers import (
+ render_post_with_macro,
+ render_rating,
+ render_spoiler_text,
+ render_text,
+)
+from .shelf import ShelfManager, ShelfType
class Comment(Content):
@@ -103,3 +111,45 @@ class Comment(Content):
comment.created_time = created_time
comment.save()
return comment
+
+ def get_repost_postfix(self):
+ tags = render_post_with_macro(
+ self.owner.user.preference.mastodon_append_tag, self.item
+ )
+ return "\n" + tags if tags else ""
+
+ def get_repost_template(self):
+ return _(
+ ShelfManager.get_action_template(ShelfType.PROGRESS, self.item.category)
+ )
+
+ def to_mastodon_params(self):
+ spoiler_text, txt = render_spoiler_text(self.text, self.item)
+ content = (
+ self.get_repost_template().format(item=self.item.display_title)
+ + f"\n{txt}\n{settings.SITE_INFO['site_url']}{self.item_url}"
+ + self.get_repost_postfix()
+ )
+ params = {
+ "content": content,
+ "spoiler_text": spoiler_text,
+ "sensitive": bool(spoiler_text),
+ }
+ return params
+
+ def to_post_params(self):
+ item_link = f"{settings.SITE_INFO['site_url']}/~neodb~{self.item_url}"
+ pre_conetent = (
+ self.get_repost_template().format(
+ item=f'{self.item.display_title}'
+ )
+ + "
"
+ )
+ spoiler_text, txt = render_spoiler_text(self.text, self.item)
+ content = f"{txt}\n{self.get_repost_postfix()}"
+ return {
+ "pre_conetent": pre_conetent,
+ "content": content,
+ "summary": spoiler_text,
+ "sensitive": bool(spoiler_text),
+ }
diff --git a/journal/models/renderers.py b/journal/models/renderers.py
index cfae1fcf..60963073 100644
--- a/journal/models/renderers.py
+++ b/journal/models/renderers.py
@@ -1,9 +1,10 @@
import re
-from typing import TYPE_CHECKING, cast
+from typing import cast
import mistune
from django.conf import settings
from django.utils.html import escape
+from django.utils.translation import gettext as _
from catalog.models import Item, ItemCategory
@@ -83,3 +84,15 @@ def render_rating(score: int | None, star_mode=0) -> str:
emoji_code = emoji_code.replace("::", ": :")
emoji_code = " " + emoji_code + " "
return emoji_code
+
+
+def render_spoiler_text(text, item):
+ if not text:
+ return None, ""
+ if text.find(">!") != -1:
+ spoiler_text = _(
+ "regarding {item_title}, may contain spoiler or triggering content"
+ ).format(item_title=item.display_title)
+ return spoiler_text, text.replace(">!", "").replace("!<", "")
+ else:
+ return None, text
diff --git a/journal/views/mark.py b/journal/views/mark.py
index 7ca829f6..d70018f4 100644
--- a/journal/views/mark.py
+++ b/journal/views/mark.py
@@ -13,7 +13,7 @@ from loguru import logger
from catalog.models import *
from common.utils import AuthedHttpRequest, get_uuid_or_404
-from mastodon.api import boost_toot_later, share_comment
+from mastodon.api import boost_toot_later
from takahe.utils import Takahe
from ..models import Comment, Mark, Note, ShelfManager, ShelfType, TagManager
@@ -179,16 +179,14 @@ def comment(request: AuthedHttpRequest, item_uuid):
d = {"text": text, "visibility": visibility}
if position:
d["metadata"] = {"position": position}
+ delete_existing_post = comment is not None and comment.visibility != visibility
+ share_to_mastodon = bool(request.POST.get("share_to_mastodon", default=False))
comment = Comment.objects.update_or_create(
owner=request.user.identity, item=item, defaults=d
)[0]
- post = Takahe.post_comment(comment, False)
- share_to_mastodon = bool(request.POST.get("share_to_mastodon", default=False))
- if post and share_to_mastodon:
- if request.user.preference.mastodon_repost_mode == 1:
- share_comment(comment)
- else:
- boost_toot_later(request.user, post.url)
+ comment.sync_to_timeline(delete_existing=delete_existing_post)
+ if share_to_mastodon:
+ comment.sync_to_mastodon(delete_existing=delete_existing_post)
return HttpResponseRedirect(request.META.get("HTTP_REFERER", "/"))
diff --git a/mastodon/api.py b/mastodon/api.py
index d93249a4..cdfc419d 100644
--- a/mastodon/api.py
+++ b/mastodon/api.py
@@ -634,53 +634,6 @@ def get_toot_visibility(visibility, user):
return TootVisibilityEnum.UNLISTED
-def share_comment(comment):
- from catalog.common import ItemCategory
- from journal.models import ShelfManager, ShelfType
-
- user = comment.owner.user
- visibility = get_toot_visibility(comment.visibility, user)
- tags = (
- "\n"
- + user.preference.mastodon_append_tag.replace(
- "[category]", str(ItemCategory(comment.item.category).label)
- )
- if user.preference.mastodon_append_tag
- else ""
- )
- spoiler_text, txt = get_spoiler_text(comment.text or "", comment.item)
- tpl = ShelfManager.get_action_template(ShelfType.PROGRESS, comment.item.category)
- content = (
- _(tpl).format(item=comment.item.display_title)
- + f"\n{txt}\n{comment.item.absolute_url}{tags}"
- )
- update_id = None
- if comment.metadata.get(
- "shared_link"
- ): # "https://mastodon.social/@username/1234567890"
- r = re.match(
- r".+/(\w+)$", comment.metadata.get("shared_link")
- ) # might be re.match(r'.+/([^/]+)$', u) if Pleroma supports edit
- update_id = r[1] if r else None
- response = post_toot(
- user.mastodon_site,
- content,
- visibility,
- user.mastodon_token,
- False,
- update_id,
- spoiler_text,
- )
- if response is not None and response.status_code in [200, 201]:
- j = response.json()
- if "url" in j:
- comment.metadata["shared_link"] = j["url"]
- comment.save()
- return True
- else:
- return False
-
-
def share_mark(mark, post_as_new=False):
from catalog.common import ItemCategory
diff --git a/takahe/utils.py b/takahe/utils.py
index 063b3da3..84422025 100644
--- a/takahe/utils.py
+++ b/takahe/utils.py
@@ -615,54 +615,6 @@ class Takahe:
collection.link_post_id(post.pk)
return post
- @staticmethod
- def post_comment(comment, share_as_new_post: bool) -> Post | None:
- from catalog.common import ItemCategory
- from journal.models import ShelfManager, ShelfType
-
- user = comment.owner.user
- category = str(ItemCategory(comment.item.category).label)
- tags = (
- "\n" + user.preference.mastodon_append_tag.replace("[category]", category)
- if user.preference.mastodon_append_tag
- else ""
- )
- item_link = f"{settings.SITE_INFO['site_url']}/~neodb~{comment.item_url}"
- tpl = ShelfManager.get_action_template(
- ShelfType.PROGRESS, comment.item.category
- )
- pre_conetent = (
- _(tpl).format(
- item=f'{comment.item.display_title}'
- )
- + "
"
- )
- spoiler, txt = Takahe.get_spoiler_text(comment.text, comment.item)
- content = f"{txt}\n{tags}"
- data = {
- "object": {
- "tag": [comment.item.ap_object_ref],
- "relatedWith": [comment.ap_object],
- }
- }
- v = Takahe.visibility_n2t(comment.visibility, user.preference.post_public_mode)
- existing_post = None if share_as_new_post else comment.latest_post
- post = Takahe.post(
- comment.owner.pk,
- content,
- v,
- pre_conetent,
- spoiler,
- spoiler is not None,
- data,
- existing_post.pk if existing_post else None,
- comment.created_time,
- )
- if not post:
- return
- comment.link_post_id(post.pk)
- return post
-
@staticmethod
def post_mark(mark, share_as_new_post: bool, append_content="") -> Post | None:
from catalog.common import ItemCategory