Skip to content

Commit 503f1a1

Browse files
authored
Merge pull request #231 from PROCOLLAB-github/feature/news-for-users
News for users
2 parents 49b8894 + 0c4eb9c commit 503f1a1

3 files changed

Lines changed: 44 additions & 8 deletions

File tree

news/mixins.py

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,54 @@
1+
from django.contrib.auth import get_user_model
2+
13
from news.models import News
24
from partner_programs.models import PartnerProgram
35
from projects.models import Project
46

7+
User = get_user_model()
8+
59

610
class NewsQuerysetMixin:
711
"""
812
Mixin for getting queryset for news
913
"""
1014

1115
def get_queryset_for_project(self):
16+
"""Returns queryset of news for project"""
17+
project_pk = self.kwargs.get("project_pk")
1218
try:
13-
project = Project.objects.get(pk=self.kwargs.get("project_pk"))
19+
project = Project.objects.get(pk=project_pk)
1420
except Project.DoesNotExist:
21+
# TODO: raise http 404 here
1522
return News.objects.none()
1623
return News.objects.get_news(obj=project)
1724

1825
def get_queryset_for_program(self):
26+
"""Returns queryset of news for partner program"""
27+
partnerprogram_pk = self.kwargs.get("partnerprogram_pk")
1928
try:
20-
program = PartnerProgram.objects.get(pk=self.kwargs.get("partnerprogram_pk"))
29+
program = PartnerProgram.objects.get(pk=partnerprogram_pk)
2130
except PartnerProgram.DoesNotExist:
31+
# TODO: raise http 404 here
2232
return News.objects.none()
2333
return News.objects.get_news(obj=program)
2434

35+
def get_queryset_for_user(self):
36+
"""Returns queryset of news for user"""
37+
user_pk = self.kwargs.get("user_pk")
38+
try:
39+
user = User.objects.get(pk=user_pk)
40+
except User.DoesNotExist:
41+
# TODO: raise http 404 here
42+
return News.objects.none()
43+
return News.objects.get_news(obj=user)
44+
2545
def get_queryset(self):
46+
"""Chooses what queryset to return - for project, program or user"""
2647
if self.kwargs.get("project_pk") is not None:
27-
# it's a project
2848
return self.get_queryset_for_project()
2949
elif self.kwargs.get("partnerprogram_pk") is not None:
30-
# it's a partner program
3150
return self.get_queryset_for_program()
51+
elif self.kwargs.get("user_pk") is not None:
52+
return self.get_queryset_for_user()
3253
else:
3354
return News.objects.none()

news/views.py

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,20 @@
1+
from django.contrib.auth import get_user_model
2+
from django.shortcuts import get_object_or_404
13
from rest_framework import generics, status
24
from rest_framework.permissions import IsAuthenticated
35
from rest_framework.response import Response
46

57
from core.serializers import SetViewedSerializer, SetLikedSerializer
68
from core.services import add_view, set_like
9+
from news.mixins import NewsQuerysetMixin
710
from news.models import News
811
from news.pagination import NewsPagination
912
from news.permissions import IsNewsCreatorOrReadOnly
1013
from news.serializers import NewsListSerializer, NewsDetailSerializer
11-
from news.mixins import NewsQuerysetMixin
1214
from projects.models import Project
1315

16+
User = get_user_model()
17+
1418

1519
class NewsList(NewsQuerysetMixin, generics.ListCreateAPIView):
1620
serializer_class = NewsListSerializer
@@ -19,14 +23,20 @@ class NewsList(NewsQuerysetMixin, generics.ListCreateAPIView):
1923

2024
def post(self, request, *args, **kwargs):
2125
if kwargs.get("project_pk"):
22-
project = Project.objects.get(pk=kwargs["project_pk"])
26+
project = get_object_or_404(Project, pk=kwargs["project_pk"])
2327
news = News.objects.add_news(project, **request.data)
2428
return Response(
2529
NewsDetailSerializer(news).data, status=status.HTTP_201_CREATED
2630
)
31+
elif kwargs.get("user_pk"):
32+
user = get_object_or_404(User, pk=kwargs["user_pk"])
33+
news = News.objects.add_news(user, **request.data)
34+
return Response(
35+
NewsDetailSerializer(news).data, status=status.HTTP_201_CREATED
36+
)
2737
else:
28-
# creating partner program news, not implemented yet
29-
raise NotImplementedError()
38+
# creating partner program news, not implemented yet, return 400
39+
return Response(status=status.HTTP_400_BAD_REQUEST)
3040

3141
def get(self, request, *args, **kwargs):
3242
news = self.paginate_queryset(self.get_queryset())

users/urls.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from django.urls import path, re_path, include
22

3+
from news.views import NewsList, NewsDetail, NewsDetailSetViewed, NewsDetailSetLiked
34
from users.views import (
45
AchievementDetail,
56
AchievementList,
@@ -35,6 +36,10 @@
3536
path("users/<int:pk>/", UserDetail.as_view()),
3637
path("users/<int:pk>/set_onboarding_stage/", SetUserOnboardingStage.as_view()),
3738
path("users/<int:pk>/force_verify/", ForceVerifyView.as_view()),
39+
path("users/<int:user_pk>/news/", NewsList.as_view()),
40+
path("users/<int:user_pk>/news/<int:pk>/", NewsDetail.as_view()),
41+
path("users/<int:user_pk>/news/<int:pk>/set_viewed/", NewsDetailSetViewed.as_view()),
42+
path("users/<int:user_pk>/news/<int:pk>/set_liked/", NewsDetailSetLiked.as_view()),
3843
path("users/current/", CurrentUser.as_view()),
3944
# todo: change password view
4045
path("users/current/programs/", CurrentUserPrograms.as_view()),

0 commit comments

Comments
 (0)