Skip to content

Commit 3c09f92

Browse files
committed
fix user news creation, add NewsMapping class
1 parent 3519b05 commit 3c09f92

4 files changed

Lines changed: 76 additions & 29 deletions

File tree

news/mapping.py

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
from django.contrib.auth import get_user_model
2+
3+
from partner_programs.models import PartnerProgram
4+
from projects.models import Project
5+
6+
User = get_user_model()
7+
8+
9+
class NewsMapping:
10+
"""
11+
Extracts title and image for news post from content_object
12+
"""
13+
14+
@classmethod
15+
def get_name(cls, content_object) -> str:
16+
if isinstance(content_object, User):
17+
f"{content_object.first_name} {content_object.last_name}"
18+
if isinstance(content_object, Project) or isinstance(
19+
content_object, PartnerProgram
20+
):
21+
return content_object.name
22+
23+
@classmethod
24+
def get_image_address(cls, content_object) -> str:
25+
if isinstance(content_object, User):
26+
return content_object.avatar
27+
if isinstance(content_object, Project) or isinstance(
28+
content_object, PartnerProgram
29+
):
30+
return content_object.image_address

news/permissions.py

Lines changed: 28 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,12 @@
1+
from django.contrib.auth import get_user_model
12
from rest_framework import permissions
23
from rest_framework.permissions import SAFE_METHODS
34

5+
from partner_programs.models import PartnerProgram
46
from projects.models import Project
57

8+
User = get_user_model()
9+
610

711
class IsNewsCreatorOrReadOnly(permissions.BasePermission):
812
def has_object_permission(self, request, view, obj):
@@ -12,12 +16,14 @@ def has_object_permission(self, request, view, obj):
1216
"""
1317
if request.method in SAFE_METHODS:
1418
return True
15-
if isinstance(obj.content_object, Project):
16-
# it's a project
17-
if obj.content_object.leader == request.user:
18-
return True
19-
else:
20-
# it's a partner program
19+
if (
20+
isinstance(obj.content_object, Project)
21+
and obj.content_object.leader == request.user
22+
):
23+
return True
24+
if isinstance(obj.content_object, User) and obj.content_object == request.user:
25+
return True
26+
if isinstance(obj.content_object, PartnerProgram):
2127
# TODO: implement
2228
pass
2329
return False
@@ -27,19 +33,23 @@ def has_permission(self, request, view):
2733
Creation permission
2834
Currently can only be created via admin panel
2935
"""
30-
# everybody can read this
3136
if request.method in SAFE_METHODS:
3237
return True
3338

34-
try:
35-
# try to judge it as a project
36-
project = Project.objects.get(pk=view.kwargs["project_pk"])
37-
if request.method in SAFE_METHODS or (request.user == project.leader):
38-
return True
39-
except Project.DoesNotExist:
40-
return False
41-
except KeyError:
42-
# It's a partner program, currently can only be created via admin
43-
# TODO: implement
44-
pass
39+
if view.kwargs.get("project_pk"):
40+
try:
41+
project = Project.objects.get(pk=view.kwargs["project_pk"])
42+
if request.method in SAFE_METHODS or (request.user == project.leader):
43+
return True
44+
except Project.DoesNotExist:
45+
return False
46+
47+
if view.kwargs.get("user_pk"):
48+
try:
49+
user = User.objects.get(pk=view.kwargs["user_pk"])
50+
if request.method in SAFE_METHODS or (request.user == user):
51+
return True
52+
except User.DoesNotExist:
53+
return False
54+
4555
return False

news/serializers.py

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,13 @@
1+
from django.contrib.auth import get_user_model
12
from rest_framework import serializers
23

34
from core.services import is_fan, get_likes_count, get_views_count
45
from files.serializers import UserFileSerializer
6+
from news.mapping import NewsMapping
57
from news.models import News
68

9+
User = get_user_model()
10+
711

812
class NewsListSerializer(serializers.ModelSerializer):
913
views_count = serializers.SerializerMethodField()
@@ -14,10 +18,10 @@ class NewsListSerializer(serializers.ModelSerializer):
1418
files = UserFileSerializer(many=True)
1519

1620
def get_name(self, obj):
17-
return obj.content_object.name
21+
return NewsMapping.get_name(obj.content_object)
1822

1923
def get_image_address(self, obj):
20-
return obj.content_object.image_address
24+
return NewsMapping.get_image_address(obj.content_object)
2125

2226
def get_views_count(self, obj):
2327
return get_views_count(obj)
@@ -26,7 +30,6 @@ def get_likes_count(self, obj):
2630
return get_likes_count(obj)
2731

2832
def get_is_user_liked(self, obj):
29-
# fixme: move this method to helpers somewhere
3033
user = self.context.get("user")
3134
if user:
3235
return is_fan(obj, user)
@@ -55,10 +58,10 @@ class NewsDetailSerializer(serializers.ModelSerializer):
5558
is_user_liked = serializers.SerializerMethodField()
5659

5760
def get_name(self, obj):
58-
return obj.content_object.name
61+
return NewsMapping.get_name(obj.content_object)
5962

6063
def get_image_address(self, obj):
61-
return obj.content_object.image_address
64+
return NewsMapping.get_image_address(obj.content_object)
6265

6366
def get_views_count(self, obj):
6467
return get_views_count(obj)

news/views.py

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,21 +22,25 @@ class NewsList(NewsQuerysetMixin, generics.ListCreateAPIView):
2222
pagination_class = NewsPagination
2323

2424
def post(self, request, *args, **kwargs):
25+
serializer = NewsListSerializer(data=request.data)
26+
serializer.is_valid(raise_exception=True)
27+
data = serializer.validated_data
28+
2529
if kwargs.get("project_pk"):
2630
project = get_object_or_404(Project, pk=kwargs["project_pk"])
27-
news = News.objects.add_news(project, **request.data)
31+
news = News.objects.add_news(project, **data)
2832
return Response(
2933
NewsDetailSerializer(news).data, status=status.HTTP_201_CREATED
3034
)
31-
elif kwargs.get("user_pk"):
35+
if kwargs.get("user_pk"):
3236
user = get_object_or_404(User, pk=kwargs["user_pk"])
33-
news = News.objects.add_news(user, **request.data)
37+
news = News.objects.add_news(user, **data)
3438
return Response(
3539
NewsDetailSerializer(news).data, status=status.HTTP_201_CREATED
3640
)
37-
else:
38-
# creating partner program news, not implemented yet, return 400
39-
return Response(status=status.HTTP_400_BAD_REQUEST)
41+
42+
# creating partner program news, not implemented yet, return 400
43+
return Response(status=status.HTTP_400_BAD_REQUEST)
4044

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

0 commit comments

Comments
 (0)