fix liked collections
This commit is contained in:
parent
10a88174d1
commit
6f5f1bfd63
7 changed files with 54 additions and 22 deletions
|
@ -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,
|
||||
|
|
|
@ -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"]),
|
||||
]
|
||||
|
||||
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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 %}
|
||||
|
|
|
@ -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(
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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):
|
||||
|
|
Loading…
Add table
Reference in a new issue