From 33bace6ed21b96b12727e35685e9f2c690756d6d Mon Sep 17 00:00:00 2001 From: VishSinh Date: Fri, 28 Jul 2023 17:21:43 +0530 Subject: [PATCH 1/3] Added Form Details API --- user/apis/serializers.py | 15 +++++++++++++++ user/apis/urls.py | 4 ++++ user/apis/views.py | 14 +++++++++++++- user/models.py | 10 ++++++++++ 4 files changed, 42 insertions(+), 1 deletion(-) create mode 100644 user/apis/serializers.py diff --git a/user/apis/serializers.py b/user/apis/serializers.py new file mode 100644 index 0000000..2bc8276 --- /dev/null +++ b/user/apis/serializers.py @@ -0,0 +1,15 @@ +from rest_framework import serializers + +from user.models import User + + +class UserSerializer(serializers.ModelSerializer): + team_members = serializers.SerializerMethodField() + + def get_team_members(self, obj): + return obj.get_team_member_ids() + + class Meta: + model = User + fields = fields = ['id', 'email', 'usn', 'phone_number', + 'techstack', 'proficiency', 'first_name', 'last_name', 'team_members'] diff --git a/user/apis/urls.py b/user/apis/urls.py index 996c071..3bcbb29 100644 --- a/user/apis/urls.py +++ b/user/apis/urls.py @@ -1,10 +1,14 @@ from django.urls import path from rest_framework_simplejwt.views import TokenObtainPairView, TokenRefreshView, TokenVerifyView +from user.apis.views import UserListCreateView + + app_name = 'user_api' urlpatterns = [ path('token/', TokenObtainPairView.as_view(), name='token_obtain_pair'), path('token/refresh/', TokenRefreshView.as_view(), name='token_refresh'), path('token/verify/', TokenVerifyView.as_view(), name='token_verify'), + path('details/', UserListCreateView.as_view(), name='user_list'), ] diff --git a/user/apis/views.py b/user/apis/views.py index 19aaa93..7b32384 100644 --- a/user/apis/views.py +++ b/user/apis/views.py @@ -1,10 +1,22 @@ from rest_framework.decorators import api_view, permission_classes from rest_framework.permissions import IsAuthenticated from rest_framework.response import Response +from rest_framework import generics +from rest_framework_simplejwt.authentication import JWTAuthentication + +from user.models import User +from user.apis.serializers import UserSerializer +from user.apis.permissions import CustomPermissionMixin + @api_view(['GET']) @permission_classes([IsAuthenticated]) def protected_view(request): user = request.user - # Your logic for the protected view return Response({'message': f'Hello, {user.username}! This is a protected view.'}) + + +class UserListCreateView(CustomPermissionMixin, generics.ListCreateAPIView): + queryset = User.objects.all() + serializer_class = UserSerializer + authentication_classes = [JWTAuthentication] diff --git a/user/models.py b/user/models.py index f705b71..e85a76a 100644 --- a/user/models.py +++ b/user/models.py @@ -37,6 +37,16 @@ def __str__(self): return f"{self.first_name} {self.last_name} ({self.email})" objects = CustomUserManager() + def get_team_member_ids(self): + try: + member = self.member_set.first() + if member: + team = member.team + return list(self.member_set.filter(team=team).values_list('id', flat=True)) + except Member.DoesNotExist: + pass + return [] + class Team(models.Model): name = models.CharField(_(""), max_length=50) From 79a211e343bfc0286e2f729421eb38b963c1d01d Mon Sep 17 00:00:00 2001 From: VishSinh Date: Sat, 29 Jul 2023 01:45:45 +0530 Subject: [PATCH 2/3] Changed UserDetails to RetrieveView --- user/apis/serializers.py | 18 +++++++++++------- user/apis/urls.py | 4 ++-- user/apis/views.py | 21 +++++++++------------ 3 files changed, 22 insertions(+), 21 deletions(-) diff --git a/user/apis/serializers.py b/user/apis/serializers.py index 2bc8276..2d3eeb9 100644 --- a/user/apis/serializers.py +++ b/user/apis/serializers.py @@ -1,15 +1,19 @@ from rest_framework import serializers -from user.models import User +from user.models import * -class UserSerializer(serializers.ModelSerializer): - team_members = serializers.SerializerMethodField() +class MemberSerializer(serializers.ModelSerializer): + class Meta: + model = Member + fields = ['id', 'user', 'team'] + - def get_team_members(self, obj): - return obj.get_team_member_ids() +class UserRetrieveSerializer(serializers.ModelSerializer): + team_members = MemberSerializer(many=True, read_only=True) class Meta: model = User - fields = fields = ['id', 'email', 'usn', 'phone_number', - 'techstack', 'proficiency', 'first_name', 'last_name', 'team_members'] + fields = ['id', 'email', 'usn', 'phone_number', + 'techstack', 'proficiency', 'first_name', 'last_name', 'team_members'] + diff --git a/user/apis/urls.py b/user/apis/urls.py index 3bcbb29..0b14852 100644 --- a/user/apis/urls.py +++ b/user/apis/urls.py @@ -1,7 +1,7 @@ from django.urls import path from rest_framework_simplejwt.views import TokenObtainPairView, TokenRefreshView, TokenVerifyView -from user.apis.views import UserListCreateView +from user.apis.views import UserRetrieveView app_name = 'user_api' @@ -10,5 +10,5 @@ path('token/', TokenObtainPairView.as_view(), name='token_obtain_pair'), path('token/refresh/', TokenRefreshView.as_view(), name='token_refresh'), path('token/verify/', TokenVerifyView.as_view(), name='token_verify'), - path('details/', UserListCreateView.as_view(), name='user_list'), + path('details//', UserRetrieveView.as_view(), name='user_details'), ] diff --git a/user/apis/views.py b/user/apis/views.py index 7b32384..b3e1e8f 100644 --- a/user/apis/views.py +++ b/user/apis/views.py @@ -1,22 +1,19 @@ -from rest_framework.decorators import api_view, permission_classes -from rest_framework.permissions import IsAuthenticated -from rest_framework.response import Response from rest_framework import generics from rest_framework_simplejwt.authentication import JWTAuthentication +from rest_framework.permissions import BasePermission, IsAuthenticated from user.models import User -from user.apis.serializers import UserSerializer -from user.apis.permissions import CustomPermissionMixin +from user.apis.serializers import UserRetrieveSerializer -@api_view(['GET']) -@permission_classes([IsAuthenticated]) -def protected_view(request): - user = request.user - return Response({'message': f'Hello, {user.username}! This is a protected view.'}) +class IsOwner(BasePermission): + def has_object_permission(self, request, view, obj): + return obj == request.user -class UserListCreateView(CustomPermissionMixin, generics.ListCreateAPIView): +class UserRetrieveView( generics.RetrieveAPIView): queryset = User.objects.all() - serializer_class = UserSerializer + serializer_class = UserRetrieveSerializer authentication_classes = [JWTAuthentication] + permission_classes = [IsAuthenticated, IsOwner] + lookup_field = 'id' From a3618b246ee4330bc6766da4003e0397e7b85e5d Mon Sep 17 00:00:00 2001 From: VishSinh Date: Mon, 31 Jul 2023 20:05:48 +0530 Subject: [PATCH 3/3] Modifications in User details API --- user/apis/serializers.py | 7 ++++++- user/apis/urls.py | 2 +- user/apis/views.py | 17 ++++++----------- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/user/apis/serializers.py b/user/apis/serializers.py index 2d3eeb9..5a63553 100644 --- a/user/apis/serializers.py +++ b/user/apis/serializers.py @@ -10,10 +10,15 @@ class Meta: class UserRetrieveSerializer(serializers.ModelSerializer): - team_members = MemberSerializer(many=True, read_only=True) + team_members = serializers.SerializerMethodField() class Meta: model = User fields = ['id', 'email', 'usn', 'phone_number', 'techstack', 'proficiency', 'first_name', 'last_name', 'team_members'] + def get_team_members(self, instance): + team_member_ids = instance.get_team_member_ids() + team_members_data = Member.objects.filter(id__in=team_member_ids) + return MemberSerializer(team_members_data, many=True).data + diff --git a/user/apis/urls.py b/user/apis/urls.py index 0b14852..de3dd57 100644 --- a/user/apis/urls.py +++ b/user/apis/urls.py @@ -10,5 +10,5 @@ path('token/', TokenObtainPairView.as_view(), name='token_obtain_pair'), path('token/refresh/', TokenRefreshView.as_view(), name='token_refresh'), path('token/verify/', TokenVerifyView.as_view(), name='token_verify'), - path('details//', UserRetrieveView.as_view(), name='user_details'), + path('details/', UserRetrieveView.as_view(), name='user_details'), ] diff --git a/user/apis/views.py b/user/apis/views.py index b3e1e8f..1161634 100644 --- a/user/apis/views.py +++ b/user/apis/views.py @@ -1,19 +1,14 @@ from rest_framework import generics from rest_framework_simplejwt.authentication import JWTAuthentication -from rest_framework.permissions import BasePermission, IsAuthenticated +from rest_framework.permissions import IsAuthenticated -from user.models import User from user.apis.serializers import UserRetrieveSerializer -class IsOwner(BasePermission): - def has_object_permission(self, request, view, obj): - return obj == request.user - - -class UserRetrieveView( generics.RetrieveAPIView): - queryset = User.objects.all() +class UserRetrieveView(generics.RetrieveAPIView): serializer_class = UserRetrieveSerializer authentication_classes = [JWTAuthentication] - permission_classes = [IsAuthenticated, IsOwner] - lookup_field = 'id' + permission_classes = [IsAuthenticated] + + def get_object(self): + return self.request.user