change review/comment/rating to include child items as well

This commit is contained in:
Your Name 2023-06-08 17:22:11 -04:00 committed by Henri Dickson
parent a8f08b6c6d
commit 777ea9ad9a
7 changed files with 24 additions and 4 deletions

View file

@ -308,6 +308,10 @@ class Item(SoftDeleteMixin, PolymorphicModel):
def parent_item(self):
return None
@property
def child_items(self):
return []
def set_parent_item(self, value):
raise ValueError("cannot set parent item")

View file

@ -225,6 +225,10 @@ class Performance(Item):
def crew_by_role(self):
return _crew_by_role(self.crew)
@property
def child_items(self):
return self.all_productions
class PerformanceProduction(Item):
type = ItemType.PerformanceProduction

View file

@ -26,7 +26,6 @@
<a href="{% url 'journal:user_profile' comment.owner.mastodon_username %}"
class="nickname"
title="@{{ comment.owner.mastodon_username }}">{{ comment.owner.display_name }}</a>
{% if comment.focus_item %}<a href="{{ comment.focus_item.url }}">{{ comment.focus_item.title }}</a>{% endif %}
</span>
<span class="action inline">
<span class="timestamp">
@ -34,6 +33,8 @@
{{ comment.mark.action_label }}
</span>
</span>
{% if comment.focus_item %}<a href="{{ comment.focus_item.url }}">{{ comment.focus_item.title }}</a>{% endif %}
{% if comment.item != item %}<a href="{{ comment.item.url }}">{{ comment.item.title }}</a>{% endif %}
<div>{{ comment.html|safe }}</div>
</section>
{% else %}

View file

@ -30,6 +30,8 @@
<span class="action inline">
<span class="timestamp">{{ review.created_time|date }}</span>
</span>
评论
{% if review.item != item %}<a href="{{ review.item.url }}">{{ review.item.title }}</a>{% endif %}
<div>
<span>
<a href="{% url 'journal:review_retrieve' review.uuid %}">{{ review.title }}</a>

View file

@ -210,6 +210,10 @@ class TVShow(Item):
.filter(is_deleted=False, merged_to_item=None)
)
@property
def child_items(self):
return self.all_seasons
class TVSeason(Item):
type = ItemType.TVSeason

View file

@ -371,7 +371,8 @@ def comments(request, item_path, item_uuid):
item = get_object_or_404(Item, uid=get_uuid_or_404(item_uuid))
if not item:
raise Http404()
queryset = Comment.objects.filter(item=item).order_by("-created_time")
ids = [i.id for i in item.child_items] + [item.id]
queryset = Comment.objects.filter(item_id__in=ids).order_by("-created_time")
queryset = queryset.filter(query_visible(request.user))
before_time = request.GET.get("last")
if before_time:
@ -380,6 +381,7 @@ def comments(request, item_path, item_uuid):
request,
"item_comments.html",
{
"item": item,
"comments": queryset[:11],
},
)
@ -390,7 +392,8 @@ def reviews(request, item_path, item_uuid):
item = get_object_or_404(Item, uid=get_uuid_or_404(item_uuid))
if not item:
raise Http404()
queryset = Review.objects.filter(item=item).order_by("-created_time")
ids = [i.id for i in item.child_items] + [item.id]
queryset = Review.objects.filter(item_id__in=ids).order_by("-created_time")
queryset = queryset.filter(query_visible(request.user))
before_time = request.GET.get("last")
if before_time:
@ -399,6 +402,7 @@ def reviews(request, item_path, item_uuid):
request,
"item_reviews.html",
{
"item": item,
"reviews": queryset[:11],
},
)

View file

@ -333,7 +333,8 @@ class Rating(Content):
@staticmethod
def get_rating_for_item(item):
stat = Rating.objects.filter(item=item, grade__isnull=False).aggregate(
ids = [i.id for i in item.child_items] + [item.id]
stat = Rating.objects.filter(item_id__in=ids, grade__isnull=False).aggregate(
average=Avg("grade"), count=Count("item")
)
return round(stat["average"], 1) if stat["count"] >= MIN_RATING_COUNT else None