refactor comment sync to timeline
This commit is contained in:
parent
aca017ade8
commit
3eafcd3ec8
6 changed files with 72 additions and 106 deletions
|
@ -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):
|
||||
|
|
|
@ -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),
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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", "/"))
|
||||
|
||||
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Add table
Reference in a new issue