refactor comment sync to timeline

This commit is contained in:
Your Name 2024-06-14 00:17:27 -04:00 committed by Henri Dickson
parent aca017ade8
commit 3eafcd3ec8
6 changed files with 72 additions and 106 deletions

View file

@ -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):

View file

@ -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'<a href="{item_link}">{self.item.display_title}</a>'
)
+ "<br>"
)
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),
}

View file

@ -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

View file

@ -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", "/"))

View file

@ -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

View file

@ -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'<a href="{item_link}">{comment.item.display_title}</a>'
)
+ "<br>"
)
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