Added posts feed

This commit is contained in:
ITQ
2024-03-04 17:54:24 +03:00
parent 4946122f2e
commit fbf851e1a6
4 changed files with 87 additions and 6 deletions
+15
View File
@@ -15,3 +15,18 @@ class CanAccessPost(BasePermission):
return True return True
return False return False
class CanAccessFeed(BasePermission):
message = "You do not have permission to access this feed."
status_code = status.HTTP_404_NOT_FOUND
def has_object_permission(self, request, view, obj):
if (
obj.isPublic
or obj.check_for_friendship(request.user)
or obj == request.user
):
return True
return False
+10
View File
@@ -13,4 +13,14 @@ urlpatterns = [
api.posts.views.PostDetailApiView.as_view(), api.posts.views.PostDetailApiView.as_view(),
name="post-detail", name="post-detail",
), ),
path(
"/feed/my",
api.posts.views.MyFeedListApiView.as_view(),
name="my-feed",
),
path(
"/feed/<str:login>",
api.posts.views.UserFeedListApiView.as_view(),
name="user-feed",
),
] ]
+51 -2
View File
@@ -1,12 +1,14 @@
from rest_framework import status from rest_framework import serializers, status
from rest_framework.exceptions import NotFound, ValidationError from rest_framework.exceptions import NotFound, ValidationError
from rest_framework.generics import ListAPIView
from rest_framework.permissions import IsAuthenticated from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response from rest_framework.response import Response
from rest_framework.views import APIView from rest_framework.views import APIView
from api.posts.models import Post from api.posts.models import Post
from api.posts.permissions import CanAccessPost from api.posts.permissions import CanAccessFeed, CanAccessPost
from api.posts.serializers import PostSerializer from api.posts.serializers import PostSerializer
from api.users.models import Profile
class CreatePostApiView(APIView): class CreatePostApiView(APIView):
@@ -33,3 +35,50 @@ class PostDetailApiView(APIView):
raise NotFound( raise NotFound(
{"detail": "Post not found."}, {"detail": "Post not found."},
) from None ) from None
class MyFeedListApiView(ListAPIView):
permission_classes = [IsAuthenticated]
serializer_class = PostSerializer
def get_queryset(self):
class QueryParamsSerializer(serializers.Serializer):
limit = serializers.IntegerField(default=5)
offset = serializers.IntegerField(default=0)
serializer = QueryParamsSerializer(data=self.request.query_params)
serializer.is_valid(raise_exception=True)
limit = serializer.validated_data.get("limit")
offset = serializer.validated_data.get("offset")
return self.request.user.posts.all()[offset: offset + limit]
class UserFeedListApiView(ListAPIView):
permission_classes = [IsAuthenticated, CanAccessFeed]
serializer_class = PostSerializer
def get_queryset(self):
class QueryParamsSerializer(serializers.Serializer):
limit = serializers.IntegerField(default=5)
offset = serializers.IntegerField(default=0)
login = self.kwargs.get("login")
try:
user = Profile.objects.get(login=login)
except Profile.DoesNotExist:
raise NotFound(
{"detail": "Profile not found."},
) from None
self.check_object_permissions(self.request, user)
serializer = QueryParamsSerializer(data=self.request.query_params)
serializer.is_valid(raise_exception=True)
limit = serializer.validated_data.get("limit")
offset = serializer.validated_data.get("offset")
return user.posts.all()[offset: offset + limit]
+11 -4
View File
@@ -4,7 +4,7 @@ import bcrypt
import jwt import jwt
from django.conf import settings from django.conf import settings
from django.utils import timezone from django.utils import timezone
from rest_framework import status from rest_framework import serializers, status
from rest_framework.exceptions import ( from rest_framework.exceptions import (
NotAuthenticated, NotAuthenticated,
NotFound, NotFound,
@@ -192,11 +192,18 @@ class FriendsListApiView(ListAPIView):
serializer_class = FriendshipSerializer serializer_class = FriendshipSerializer
def get_queryset(self): def get_queryset(self):
limit = int(self.request.query_params.get("limit", 5)) class QueryParamsSerializer(serializers.Serializer):
offset = int(self.request.query_params.get("offset", 0)) limit = serializers.IntegerField(default=5)
offset = serializers.IntegerField(default=0)
serializer = QueryParamsSerializer(data=self.request.query_params)
serializer.is_valid(raise_exception=True)
limit = serializer.validated_data.get("limit")
offset = serializer.validated_data.get("offset")
return Friendship.objects.filter(from_profile=self.request.user)[ return Friendship.objects.filter(from_profile=self.request.user)[
offset : offset + limit offset: offset + limit
] ]