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