Skip to content

Commit 35052fc

Browse files
committed
Added ProjectNewsDetail view
1 parent 8e4da53 commit 35052fc

4 files changed

Lines changed: 76 additions & 2 deletions

File tree

projects/permissions.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,23 @@
11
from rest_framework.permissions import BasePermission, SAFE_METHODS
22

3+
from projects.models import Project
4+
35

46
class IsProjectLeaderOrReadOnlyForNonDrafts(BasePermission):
57
"""
68
Allows access to update only to project leader.
79
"""
810

911
def has_permission(self, request, view) -> bool:
12+
# fixme:
1013
if request.method in SAFE_METHODS or (request.user and request.user.id):
1114
return True
1215
return False
1316

1417
def has_object_permission(self, request, view, obj):
1518
if (request.method in SAFE_METHODS and not obj.draft) or (
1619
obj.leader == request.user
20+
# fixme:
1721
or obj.collaborator_set.filter(user=request.user).exists()
1822
or obj.invite_set.filter(user=request.user).exists()
1923
):
@@ -61,3 +65,25 @@ def has_object_permission(self, request, view, obj):
6165
):
6266
return True
6367
return False
68+
69+
70+
class IsNewsAuthorIsProjectLeader(BasePermission):
71+
"""
72+
Allows access to update project news only to leader.
73+
"""
74+
75+
def has_permission(self, request, view) -> bool:
76+
try:
77+
project = Project.objects.get(pk=view.kwargs["project_pk"])
78+
if request.method in SAFE_METHODS or (request.user == project.leader):
79+
return True
80+
except Project.DoesNotExist:
81+
pass
82+
return False
83+
84+
def has_object_permission(self, request, view, obj):
85+
if (
86+
request.method in SAFE_METHODS and not obj.project.draft
87+
) or obj.project.leader == request.user:
88+
return True
89+
return False

projects/serializers.py

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -238,3 +238,34 @@ class Meta:
238238
"views_count",
239239
"likes_count",
240240
]
241+
242+
243+
class ProjectNewsDetailSerializer(serializers.ModelSerializer):
244+
likes_count = serializers.SerializerMethodField()
245+
project_name = serializers.SerializerMethodField()
246+
project_image_address = serializers.SerializerMethodField()
247+
248+
def get_project_name(self, obj):
249+
return obj.project.name
250+
251+
def get_project_image_address(self, obj):
252+
return obj.project.image_address
253+
254+
def get_likes_count(self, obj):
255+
obj_type = ContentType.objects.get_for_model(obj)
256+
return User.objects.filter(
257+
likes__content_type=obj_type, likes__object_id=obj.id
258+
).count()
259+
260+
class Meta:
261+
model = ProjectNews
262+
fields = [
263+
"id",
264+
"project_name",
265+
"project_image_address",
266+
"text",
267+
"datetime_created",
268+
"datetime_updated",
269+
"views_count",
270+
"likes_count",
271+
]

projects/urls.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
ProjectRecommendedUsers,
1313
SetLikeOnProject,
1414
ProjectNewsList,
15+
ProjectNewsDetail,
1516
)
1617

1718
app_name = "projects"
@@ -20,6 +21,7 @@
2021
path("", ProjectList.as_view()),
2122
path("<int:pk>/like/", SetLikeOnProject.as_view()),
2223
path("<int:pk>/news/", ProjectNewsList.as_view()),
24+
path("<int:project_pk>/news/<int:pk>/", ProjectNewsDetail.as_view()),
2325
path("<int:pk>/collaborators/", ProjectCollaborators.as_view()),
2426
path("<int:pk>/", ProjectDetail.as_view()),
2527
path("<int:pk>/recommended_users", ProjectRecommendedUsers.as_view()),

projects/views.py

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
IsProjectLeaderOrReadOnlyForNonDrafts,
1616
HasInvolvementInProjectOrReadOnly,
1717
IsProjectLeader,
18+
IsNewsAuthorIsProjectLeader,
1819
)
1920
from projects.serializers import (
2021
ProjectDetailSerializer,
@@ -23,6 +24,7 @@
2324
AchievementDetailSerializer,
2425
ProjectCollaboratorSerializer,
2526
ProjectNewsListSerializer,
27+
ProjectNewsDetailSerializer,
2628
)
2729
from users.models import LikesOnProject
2830
from users.serializers import UserListSerializer
@@ -227,10 +229,23 @@ def get(self, request, pk):
227229

228230

229231
class ProjectNewsList(generics.ListCreateAPIView):
230-
queryset = ProjectNews.objects.all()
231232
serializer_class = ProjectNewsListSerializer
232-
permission_classes = [IsProjectLeaderOrReadOnlyForNonDrafts]
233+
permission_classes = [IsNewsAuthorIsProjectLeader]
233234

234235
def perform_create(self, serializer):
235236
project = Project.objects.get(pk=self.kwargs["pk"])
236237
serializer.save(project=project)
238+
239+
def get_queryset(self):
240+
project = Project.objects.get(pk=self.kwargs["pk"])
241+
return ProjectNews.objects.filter(project=project)
242+
243+
244+
class ProjectNewsDetail(generics.RetrieveUpdateDestroyAPIView):
245+
queryset = ProjectNews.objects.all()
246+
serializer_class = ProjectNewsDetailSerializer
247+
permission_classes = [IsNewsAuthorIsProjectLeader]
248+
249+
def get_queryset(self):
250+
project = Project.objects.get(pk=self.kwargs["project_pk"])
251+
return ProjectNews.objects.filter(project=project).all()

0 commit comments

Comments
 (0)