Initial commit

This commit is contained in:
Sonny Bakker 2024-10-08 21:46:05 +02:00
parent 2d5801f226
commit 344d0908c7

View file

@ -1,3 +1,4 @@
from django.db.models import Prefetch
from rest_framework import status from rest_framework import status
from rest_framework.generics import ( from rest_framework.generics import (
GenericAPIView, GenericAPIView,
@ -11,6 +12,7 @@ from rest_framework.response import Response
from newsreader.accounts.permissions import IsPostOwner from newsreader.accounts.permissions import IsPostOwner
from newsreader.core.pagination import CursorPagination from newsreader.core.pagination import CursorPagination
from newsreader.news.collection.models import CollectionRule
from newsreader.news.collection.serializers import RuleSerializer from newsreader.news.collection.serializers import RuleSerializer
from newsreader.news.core.filters import ReadFilter, SavedFilter from newsreader.news.core.filters import ReadFilter, SavedFilter
from newsreader.news.core.models import Category, Post from newsreader.news.core.models import Category, Post
@ -63,10 +65,9 @@ class NestedRuleCategoryView(ListAPIView):
class NestedPostCategoryView(ListAPIView): class NestedPostCategoryView(ListAPIView):
queryset = Category.objects.prefetch_related("rules", "rules__posts").all()
serializer_class = PostSerializer serializer_class = PostSerializer
pagination_class = CursorPagination pagination_class = CursorPagination
filter_backends = [ReadFilter] filter_backends = [ReadFilter] # TODO: remove read filter usage
def get_queryset(self): def get_queryset(self):
lookup_url_kwarg = self.lookup_url_kwarg or self.lookup_field lookup_url_kwarg = self.lookup_url_kwarg or self.lookup_field
@ -75,13 +76,18 @@ class NestedPostCategoryView(ListAPIView):
# filtered on the user. # filtered on the user.
filter_kwargs = {self.lookup_field: self.kwargs[lookup_url_kwarg]} filter_kwargs = {self.lookup_field: self.kwargs[lookup_url_kwarg]}
category = get_object_or_404(self.queryset, **filter_kwargs) rules_queryset = CollectionRule.objects.filter(user=self.request.user)
prefetch = Prefetch("rules", queryset=rules_queryset, to_attr="user_rules")
category_queryset = (
Category.objects
.prefetch_related(prefetch)
.filter(user=self.request.user)
)
category = get_object_or_404(category_queryset, **filter_kwargs)
self.check_object_permissions(self.request, category) self.check_object_permissions(self.request, category)
rules = category.rules.values_list("id", flat=True) return Post.objects.filter(rule__in=category.user_rules, read=False)
queryset = Post.objects.filter(rule__in=rules)
return queryset
class CategoryReadView(GenericAPIView): class CategoryReadView(GenericAPIView):