diff --git a/journal/models/__init__.py b/journal/models/__init__.py
index 41283684..30ea321c 100644
--- a/journal/models/__init__.py
+++ b/journal/models/__init__.py
@@ -2,6 +2,8 @@ from .collection import Collection, CollectionMember, FeaturedCollection
from .comment import Comment
from .common import (
Piece,
+ PieceInteraction,
+ PiecePost,
UserOwnedObjectMixin,
VisibilityType,
max_visiblity_to_user,
diff --git a/journal/models/common.py b/journal/models/common.py
index 8f288f22..7bfff65b 100644
--- a/journal/models/common.py
+++ b/journal/models/common.py
@@ -230,21 +230,26 @@ class PiecePost(models.Model):
class PieceInteraction(models.Model):
- piece = models.ForeignKey(Piece, on_delete=models.CASCADE)
+ target = models.ForeignKey(
+ Piece, on_delete=models.CASCADE, related_name="interactions"
+ )
+ target_type = models.CharField(max_length=50)
interaction_type = models.CharField(max_length=50)
- identity = models.ForeignKey(APIdentity, on_delete=models.CASCADE)
+ identity = models.ForeignKey(
+ APIdentity, on_delete=models.CASCADE, related_name="interactions"
+ )
created_time = models.DateTimeField(default=timezone.now)
class Meta:
constraints = [
models.UniqueConstraint(
- fields=["identity", "interaction_type", "piece"],
+ fields=["identity", "interaction_type", "target"],
name="unique_interaction",
),
]
indexes = [
models.Index(fields=["identity", "interaction_type", "created_time"]),
- models.Index(fields=["piece", "interaction_type", "created_time"]),
+ models.Index(fields=["target", "interaction_type", "created_time"]),
]
diff --git a/journal/templates/profile.html b/journal/templates/profile.html
index ca061766..2c9dd830 100644
--- a/journal/templates/profile.html
+++ b/journal/templates/profile.html
@@ -123,7 +123,7 @@
id="collection_marked"
{% if not liked_collections_count %}style="display:none;"{% endif %}>
- {% trans '关注的收藏单' %}
+ {% trans '喜欢的收藏单' %}
{{ liked_collections_count }}
diff --git a/journal/templates/user_collection_list.html b/journal/templates/user_collection_list.html
index f0b7938d..df31d674 100644
--- a/journal/templates/user_collection_list.html
+++ b/journal/templates/user_collection_list.html
@@ -14,7 +14,7 @@
{{ site_name }} - {{ identity.display_name }} -
- {% if liked %}关注的{% endif %}
+ {% if liked %}喜欢的{% endif %}
收藏单
{% include "common_libs.html" with jquery=0 v2=1 %}
@@ -24,7 +24,7 @@
{{ identity.display_name }} -
- {% if liked %}关注的{% endif %}
+ {% if liked %}喜欢的{% endif %}
收藏单
{% for collection in collections %}
diff --git a/journal/views/collection.py b/journal/views/collection.py
index 1ceb9d7d..f43c566b 100644
--- a/journal/views/collection.py
+++ b/journal/views/collection.py
@@ -328,7 +328,11 @@ def user_collection_list(request: AuthedHttpRequest, user_name):
@target_identity_required
def user_liked_collection_list(request: AuthedHttpRequest, user_name):
target = request.target_identity
- collections = Collection.objects.filter(likes__owner=target)
+ collections = Collection.objects.filter(
+ interactions__identity=target,
+ interactions__interaction_type="like",
+ interactions__target_type="Collection",
+ ).order_by("-edited_time")
if target.user != request.user:
collections = collections.filter(q_piece_visible_to_user(request.user))
return render(
diff --git a/journal/views/profile.py b/journal/views/profile.py
index c0602cd4..c4e57edd 100644
--- a/journal/views/profile.py
+++ b/journal/views/profile.py
@@ -63,11 +63,11 @@ def profile(request: AuthedHttpRequest, user_name):
"members": reviews[:10].prefetch_related("item"),
}
collections = Collection.objects.filter(qv).order_by("-created_time")
- liked_collections = (
- Like.user_likes_by_class(target, Collection)
- .order_by("-edited_time")
- .values_list("target_id", flat=True)
- )
+ liked_collections = Collection.objects.filter(
+ interactions__identity=target,
+ interactions__interaction_type="like",
+ interactions__target_type="Collection",
+ ).order_by("-edited_time")
if not me:
liked_collections = liked_collections.filter(
q_piece_visible_to_user(request.user)
@@ -93,10 +93,7 @@ def profile(request: AuthedHttpRequest, user_name):
"shelf_list": shelf_list,
"collections": collections[:10],
"collections_count": collections.count(),
- "liked_collections": [
- Collection.objects.get(id=i)
- for i in liked_collections.order_by("-edited_time")[:10]
- ],
+ "liked_collections": liked_collections[:10],
"liked_collections_count": liked_collections.count(),
"layout": target.preference.profile_layout,
"year": year,
diff --git a/takahe/ap_handlers.py b/takahe/ap_handlers.py
index 49134d24..d96c2b1f 100644
--- a/takahe/ap_handlers.py
+++ b/takahe/ap_handlers.py
@@ -1,11 +1,10 @@
-from datetime import datetime
from time import sleep
from loguru import logger
from catalog.common import *
-from journal.models import Comment, Piece, Rating, Review, ShelfMember
-from users.models import User as NeoUser
+from journal.models import Comment, Piece, PieceInteraction, Rating, Review, ShelfMember
+from users.models.apidentity import APIdentity
from .models import Follow, Identity, Post
from .utils import Takahe
@@ -124,11 +123,36 @@ def post_deleted(pk, obj):
def post_interacted(interaction_pk, interaction, post_pk, identity_pk):
- pass
+ if interaction not in ["like", "boost", "pin"]:
+ return
+ p = Piece.objects.filter(posts__id=post_pk).first()
+ if not p:
+ return
+ if not APIdentity.objects.filter(pk=identity_pk).exists():
+ logger.warning(f"Identity {identity_pk} not found for interaction")
+ return
+ PieceInteraction.objects.get_or_create(
+ target=p,
+ identity_id=identity_pk,
+ interaction_type=interaction,
+ defaults={"target_type": p.__class__.__name__},
+ )
def post_uninteracted(interaction_pk, interaction, post_pk, identity_pk):
- pass
+ if interaction not in ["like", "boost", "pin"]:
+ return
+ p = Piece.objects.filter(posts__id=post_pk).first()
+ if not p:
+ return
+ if not APIdentity.objects.filter(pk=identity_pk).exists():
+ logger.warning(f"Identity {identity_pk} not found for interaction")
+ return
+ PieceInteraction.objects.filter(
+ target=p,
+ identity_id=identity_pk,
+ interaction_type=interaction,
+ ).delete()
def identity_fetched(pk):