Skip to content

Commit 64181a9

Browse files
committed
fix: update user and article api handling
1 parent bd0e3bc commit 64181a9

File tree

4 files changed

+34
-1
lines changed

4 files changed

+34
-1
lines changed

izpitnik/accounts/api/filters.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
2+
3+
def filter_user_response(func):
4+
def wrapper(self, request, *args, **kwargs):
5+
response = func(self, request, *args, **kwargs)
6+
if (
7+
not request.user.is_authenticated
8+
or str(request.user.pk) != kwargs.get(self.lookup_url_kwarg)
9+
or not request.user.has_perm("accounts.view_user")
10+
or not request.user.is_superuser
11+
):
12+
response.data = {k:v for k,v in response.data.items() if k in ['username','first_name','last_name','profile']}
13+
return response
14+
return wrapper

izpitnik/accounts/api/views.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
from rest_framework.response import Response
1616
from django.conf import settings
1717

18+
from izpitnik.accounts.api.filters import filter_user_response
1819
from izpitnik.accounts.api.permissions import IsOwnerPermission, add_or_change_permission_decorator, \
1920
delete_permission_decorator
2021
from izpitnik.accounts.mixins import GenerateTokenMixin
@@ -93,24 +94,31 @@ def post(self, request):
9394
return Response(form.errors, status=400)
9495

9596
class GetUpdateDeleteProfileAPIView(RetrieveUpdateDestroyAPIView):
96-
permission_classes = [IsOwnerPermission]
97+
# permission_classes = [IsOwnerPermission]
98+
permission_classes = [AllowAny]
9799
lookup_url_kwarg = "user_id"
98100
serializer_class = UserProfileSerializer
99101
parser_classes = (MultiPartParser, FormParser, JSONParser)
102+
allowed_kwarg_values = ['my']
100103

101104
def get_queryset(self):
102105
from izpitnik.accounts.models import User
103106
user_id = self.rectify_kwarg(self.request, self.kwargs).get(self.lookup_url_kwarg)
104107
return User.objects.filter(pk=user_id).prefetch_related("profile")
105108

109+
@filter_user_response
106110
def get(self, request, *args, **kwargs):
107111
kwargs = self.rectify_kwarg(request, kwargs)
108112
response = super().get(request,*args, **kwargs)
109113
return response
110114

111115
def rectify_kwarg(self, request, kwargs):
112116
user_id = kwargs.get(self.lookup_url_kwarg)
117+
if not user_id.isdigit() and user_id not in self.allowed_kwarg_values:
118+
raise AuthenticationFailed('Invalid user identifier.')
113119
if user_id == 'my':
120+
if not request.user.is_authenticated:
121+
raise AuthenticationFailed('Authentication credentials were not provided.')
114122
kwargs[self.lookup_url_kwarg] = str(request.user.pk)
115123
return kwargs
116124

izpitnik/accounts/serializers.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,3 +48,8 @@ def update(self, instance, validated_data):
4848

4949
return instance
5050

51+
class UserBasicSerializer(serializers.ModelSerializer):
52+
53+
class Meta:
54+
model = User
55+
fields = ['id', 'username', 'first_name', 'last_name']

izpitnik/articles/api/serializers.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
from rest_framework import serializers
22

3+
# from izpitnik.accounts.models import User
4+
from izpitnik.accounts.serializers import UserBasicSerializer
35
from izpitnik.articles.models import Article
46
from izpitnik.orth_calendar.models import Saint, Feast, HolidayOccurrences
57
from izpitnik.orth_calendar.serializers.feasts import FeastsSerializer
@@ -36,6 +38,10 @@ class ArticleSerializer(serializers.ModelSerializer):
3638
source='holiday', many=True, write_only=True,
3739
queryset=HolidayOccurrences.objects.all(), required=False
3840
)
41+
author = UserBasicSerializer(
42+
read_only=True,
43+
many=False,
44+
)
3945

4046
image = serializers.ImageField(required=False,allow_null=True,allow_empty_file=True)
4147

0 commit comments

Comments
 (0)