|
12 | 12 | from news.querysets import get_news_queryset_for_context |
13 | 13 | from news.serializers import ( |
14 | 14 | NewsCreateSerializer, |
15 | | - NewsDetailResponseSerializer, |
16 | | - NewsListResponseSerializer, |
| 15 | + NewsUpdateSerializer, |
| 16 | + ProgramNewsDetailResponseSerializer, |
| 17 | + ProgramNewsListResponseSerializer, |
| 18 | + ProjectNewsDetailResponseSerializer, |
| 19 | + ProjectNewsListResponseSerializer, |
| 20 | + UserNewsDetailResponseSerializer, |
| 21 | + UserNewsListResponseSerializer, |
17 | 22 | ) |
18 | 23 | from news.services import ( |
19 | 24 | create_program_news, |
|
27 | 32 | User = get_user_model() |
28 | 33 |
|
29 | 34 |
|
| 35 | +LIST_RESPONSE_SERIALIZERS = { |
| 36 | + "project": ProjectNewsListResponseSerializer, |
| 37 | + "user": UserNewsListResponseSerializer, |
| 38 | + "program": ProgramNewsListResponseSerializer, |
| 39 | +} |
| 40 | + |
| 41 | +DETAIL_RESPONSE_SERIALIZERS = { |
| 42 | + "project": ProjectNewsDetailResponseSerializer, |
| 43 | + "user": UserNewsDetailResponseSerializer, |
| 44 | + "program": ProgramNewsDetailResponseSerializer, |
| 45 | +} |
| 46 | + |
| 47 | + |
30 | 48 | class ContextNewsAPIView: |
31 | 49 | def get_queryset(self): |
32 | 50 | return get_news_queryset_for_context(self.kwargs) |
33 | 51 |
|
34 | 52 | def get_news_object(self): |
35 | 53 | return get_object_or_404(self.get_queryset(), pk=self.kwargs["pk"]) |
36 | 54 |
|
| 55 | + def get_news_context(self): |
| 56 | + if self.kwargs.get("project_pk") is not None: |
| 57 | + return "project" |
| 58 | + if self.kwargs.get("user_pk") is not None: |
| 59 | + return "user" |
| 60 | + if self.kwargs.get("partnerprogram_pk") is not None: |
| 61 | + return "program" |
| 62 | + return None |
| 63 | + |
| 64 | + def get_list_response_serializer_class(self): |
| 65 | + return LIST_RESPONSE_SERIALIZERS[self.get_news_context()] |
| 66 | + |
| 67 | + def get_detail_response_serializer_class(self): |
| 68 | + return DETAIL_RESPONSE_SERIALIZERS[self.get_news_context()] |
| 69 | + |
37 | 70 |
|
38 | 71 | class NewsList(ContextNewsAPIView, generics.ListCreateAPIView): |
39 | | - serializer_class = NewsListResponseSerializer |
| 72 | + serializer_class = ProjectNewsListResponseSerializer |
40 | 73 | permission_classes = [ProjectVisibilityPermission, IsNewsCreatorOrReadOnly] |
41 | 74 | pagination_class = NewsPagination |
42 | 75 |
|
43 | 76 | def post(self, request: Request, *args, **kwargs) -> Response: |
44 | | - serializer = NewsCreateSerializer(data=request.data) |
| 77 | + serializer = NewsCreateSerializer( |
| 78 | + data=request.data, |
| 79 | + context={"request": request}, |
| 80 | + ) |
45 | 81 | serializer.is_valid(raise_exception=True) |
46 | 82 | data = serializer.validated_data |
47 | 83 |
|
48 | 84 | if kwargs.get("project_pk"): |
49 | 85 | project = get_object_or_404(Project, pk=kwargs["project_pk"]) |
50 | 86 | news = create_project_news(project, request.user, data) |
51 | 87 | return Response( |
52 | | - NewsDetailResponseSerializer(news).data, |
| 88 | + self.get_detail_response_serializer_class()(news).data, |
53 | 89 | status=status.HTTP_201_CREATED, |
54 | 90 | ) |
55 | 91 | if kwargs.get("user_pk"): |
56 | 92 | user = get_object_or_404(User, pk=kwargs["user_pk"]) |
57 | 93 | news = create_user_news(user, request.user, data) |
58 | 94 | return Response( |
59 | | - NewsDetailResponseSerializer(news).data, |
| 95 | + self.get_detail_response_serializer_class()(news).data, |
60 | 96 | status=status.HTTP_201_CREATED, |
61 | 97 | ) |
62 | 98 |
|
63 | 99 | if kwargs.get("partnerprogram_pk"): |
64 | 100 | program = get_object_or_404(PartnerProgram, pk=kwargs["partnerprogram_pk"]) |
65 | 101 | news = create_program_news(program, request.user, data) |
66 | 102 | return Response( |
67 | | - NewsDetailResponseSerializer(news).data, |
| 103 | + self.get_detail_response_serializer_class()(news).data, |
68 | 104 | status=status.HTTP_201_CREATED, |
69 | 105 | ) |
70 | 106 | return Response(status=status.HTTP_400_BAD_REQUEST) |
71 | 107 |
|
72 | 108 | def get(self, request: Request, *args, **kwargs) -> Response: |
73 | 109 | news = self.paginate_queryset(self.get_queryset()) |
74 | 110 | context = {"user": request.user} |
75 | | - serializer = NewsListResponseSerializer(news, context=context, many=True) |
| 111 | + serializer = self.get_list_response_serializer_class()( |
| 112 | + news, |
| 113 | + context=context, |
| 114 | + many=True, |
| 115 | + ) |
76 | 116 | return self.get_paginated_response(serializer.data) |
77 | 117 |
|
78 | 118 |
|
79 | 119 | class NewsDetail(ContextNewsAPIView, generics.RetrieveUpdateDestroyAPIView): |
80 | | - serializer_class = NewsDetailResponseSerializer |
| 120 | + serializer_class = ProjectNewsDetailResponseSerializer |
81 | 121 | permission_classes = [ProjectVisibilityPermission, IsNewsCreatorOrReadOnly] |
82 | 122 |
|
83 | 123 | def get(self, request: Request, *args, **kwargs) -> Response: |
84 | 124 | news = self.get_news_object() |
85 | 125 | context = {"user": request.user} |
86 | | - return Response(NewsDetailResponseSerializer(news, context=context).data) |
| 126 | + return Response( |
| 127 | + self.get_detail_response_serializer_class()(news, context=context).data |
| 128 | + ) |
87 | 129 |
|
88 | 130 | def update(self, request: Request, *args, **kwargs) -> Response: |
89 | 131 | news = self.get_news_object() |
90 | 132 | context = {"user": request.user} |
91 | | - serializer = NewsDetailResponseSerializer( |
| 133 | + serializer = NewsUpdateSerializer( |
92 | 134 | news, |
93 | 135 | data=request.data, |
94 | | - context=context, |
| 136 | + context={"request": request}, |
| 137 | + partial=kwargs.get("partial", False), |
95 | 138 | ) |
96 | 139 | serializer.is_valid(raise_exception=True) |
97 | 140 | serializer.save() |
98 | | - return Response(serializer.data) |
| 141 | + return Response( |
| 142 | + self.get_detail_response_serializer_class()(news, context=context).data |
| 143 | + ) |
99 | 144 |
|
100 | 145 |
|
101 | 146 | class NewsDetailSetViewed(ContextNewsAPIView, generics.CreateAPIView): |
|
0 commit comments