fix liked collections

This commit is contained in:
Your Name 2023-12-27 16:23:46 -05:00 committed by Henri Dickson
parent 10a88174d1
commit 6f5f1bfd63
7 changed files with 54 additions and 22 deletions

View file

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

View file

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

View file

@ -123,7 +123,7 @@
id="collection_marked"
{% if not liked_collections_count %}style="display:none;"{% endif %}>
<h5>
{% trans '关注的收藏单' %}
{% trans '喜欢的收藏单' %}
<small>
<a href="{% url 'journal:user_liked_collection_list' identity.handler %}">{{ liked_collections_count }}</a>
</small>

View file

@ -14,7 +14,7 @@
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>{{ site_name }} - {{ identity.display_name }} -
{% if liked %}关注的{% endif %}
{% if liked %}喜欢的{% endif %}
收藏单</title>
{% include "common_libs.html" with jquery=0 v2=1 %}
</head>
@ -24,7 +24,7 @@
<div class="grid__main">
<h5>
{{ identity.display_name }} -
{% if liked %}关注的{% endif %}
{% if liked %}喜欢的{% endif %}
收藏单
</h5>
{% for collection in collections %}

View file

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

View file

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

View file

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