-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathviews.py
More file actions
111 lines (93 loc) · 4.48 KB
/
views.py
File metadata and controls
111 lines (93 loc) · 4.48 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
from django.contrib.auth import get_user_model
from django.shortcuts import get_object_or_404
from rest_framework import generics, status
from rest_framework.permissions import IsAuthenticated
from rest_framework.request import Request
from rest_framework.response import Response
from core.serializers import SetLikedSerializer, SetViewedSerializer
from core.services import add_view, set_like
from news.mixins import NewsQuerysetMixin
from news.models import News
from news.pagination import NewsPagination
from news.permissions import IsNewsCreatorOrReadOnly
from news.serializers import (
NewsDetailSerializer,
NewsListCreateSerializer,
NewsListSerializer,
)
from partner_programs.models import PartnerProgram
from projects.models import Project
User = get_user_model()
class NewsList(NewsQuerysetMixin, generics.ListCreateAPIView):
serializer_class = NewsListSerializer
permission_classes = [IsNewsCreatorOrReadOnly]
pagination_class = NewsPagination
def post(self, request: Request, *args, **kwargs) -> Response:
serializer = NewsListCreateSerializer(data=request.data)
serializer.is_valid(raise_exception=True)
data = serializer.validated_data
if kwargs.get("project_pk"):
project = get_object_or_404(Project, pk=kwargs["project_pk"])
news = News.objects.add_news(project, **data)
return Response(
NewsDetailSerializer(news).data, status=status.HTTP_201_CREATED
)
if kwargs.get("user_pk"):
user = get_object_or_404(User, pk=kwargs["user_pk"])
news = News.objects.add_news(user, **data)
return Response(
NewsDetailSerializer(news).data, status=status.HTTP_201_CREATED
)
if kwargs.get("partnerprogram_pk"):
program = get_object_or_404(PartnerProgram, pk=kwargs["partnerprogram_pk"])
news = News.objects.add_news(program, **data)
return Response(
NewsDetailSerializer(news).data, status=status.HTTP_201_CREATED
)
return Response(status=status.HTTP_400_BAD_REQUEST)
def get(self, request: Request, *args, **kwargs) -> Response:
news = self.paginate_queryset(self.get_queryset())
context = {"user": request.user}
serializer = NewsListSerializer(news, context=context, many=True)
return self.get_paginated_response(serializer.data)
class NewsDetail(NewsQuerysetMixin, generics.RetrieveUpdateDestroyAPIView):
serializer_class = NewsDetailSerializer
permission_classes = [IsNewsCreatorOrReadOnly]
def get(self, request: Request, *args, **kwargs) -> Response:
try:
news = self.get_queryset().get(pk=self.kwargs["pk"])
context = {"user": request.user}
return Response(NewsDetailSerializer(news, context=context).data)
except News.DoesNotExist:
return Response(status=status.HTTP_404_NOT_FOUND)
def update(self, request: Request, *args, **kwargs) -> Response:
try:
news = self.get_queryset().get(pk=self.kwargs["pk"])
context = {"user": request.user}
serializer = NewsDetailSerializer(news, data=request.data, context=context)
# FIXME: are we sure we need raise_exception=True here?
serializer.is_valid(raise_exception=True)
serializer.save()
return Response(serializer.data)
except News.DoesNotExist:
return Response(status=status.HTTP_404_NOT_FOUND)
class NewsDetailSetViewed(NewsQuerysetMixin, generics.CreateAPIView):
serializer_class = SetViewedSerializer
permission_classes = [IsAuthenticated]
def post(self, request: Request, *args, **kwargs) -> Response:
try:
news = self.get_queryset().get(pk=self.kwargs["pk"])
add_view(news, request.user)
return Response(status=status.HTTP_200_OK)
except News.DoesNotExist:
return Response(status=status.HTTP_404_NOT_FOUND)
class NewsDetailSetLiked(NewsQuerysetMixin, generics.CreateAPIView):
serializer_class = SetLikedSerializer
permission_classes = [IsAuthenticated]
def post(self, request: Request, *args, **kwargs) -> Response:
try:
news = self.get_queryset().get(pk=self.kwargs["pk"])
set_like(news, request.user, request.data.get("is_liked"))
return Response(status=status.HTTP_200_OK)
except News.DoesNotExist:
return Response(status=status.HTTP_404_NOT_FOUND)