from django.shortcuts import render from rest_framework.views import APIView from rest_framework import generics, permissions, status from rest_framework.response import Response from .serializers import ProfileSerializer, UserAddressSerializer, CustomTokenObtainPairSerializer from .models import UserAddressModel, User from rest_framework.permissions import IsAuthenticated, AllowAny from drf_spectacular.utils import extend_schema, OpenApiParameter from rest_framework_simplejwt.views import TokenObtainPairView from django.shortcuts import get_object_or_404 from rest_framework_simplejwt.tokens import RefreshToken class SendOTPView(APIView): permission_classes = [AllowAny] @extend_schema( request={ "application/json": { "type": "object", "properties": { "phone": {"type": "string", "example": "09123456789"}, }, "required": ["phone"], } }, ) def post(self, request): phone = request.data.get('phone') try: user, created = User.objects.get_or_create(phone=phone) print(created) print(user.phone) user.set_otp() message = f"کد یک بار مصرف : {user.otp}" print(message) # send otp return Response({'detail': 'OTP sent successfully'}, status=status.HTTP_200_OK) except User.DoesNotExist: return Response({'detail': 'User not found'}, status=status.HTTP_404_NOT_FOUND) class CustomTokenObtainPairView(TokenObtainPairView): serializer_class = CustomTokenObtainPairSerializer # @extend_schema( # tags=["Authentication"] # ) def post(self, request, *args, **kwargs): phone = request.data.get("phone") otp = request.data.get("otp") user = get_object_or_404(User, phone=phone) if user: if not otp: return Response({'detail': 'کد یک بار مصرف ضروری میباشد'}, status=status.HTTP_401_UNAUTHORIZED) if not user.verify_otp(otp): return Response({'detail': 'کد یک بار مصرف منقضی شده یا اشتباه است'}, status=status.HTTP_401_UNAUTHORIZED) user.clear_otp() refresh = RefreshToken.for_user(user) return Response({ 'refresh': str(refresh), 'access': str(refresh.access_token), }) return Response({'detail': 'Invalid credentials'}, status=status.HTTP_401_UNAUTHORIZED) class ProfileView(APIView): serializer_class = ProfileSerializer permission_classes = [IsAuthenticated] def get(self, request): user_ser = self.serializer_class(instance=request.user) return Response(user_ser.data, status=status.HTTP_200_OK) def patch(self, request): user = request.user user_ser = self.serializer_class(user, data=request.data, partial=True) if user_ser.is_valid(): user_ser.save() return Response(user_ser.data) return Response(user_ser.errors, status=status.HTTP_400_BAD_REQUEST) class CreateAddressView(generics.CreateAPIView): queryset = UserAddressModel.objects.all() serializer_class = UserAddressSerializer permission_classes = [permissions.IsAuthenticated] def perform_create(self, serializer): serializer.save(user=self.request.user) class EditAddressView(generics.UpdateAPIView): queryset = UserAddressModel.objects.all() serializer_class = UserAddressSerializer permission_classes = [permissions.IsAuthenticated] def get_queryset(self): return UserAddressModel.objects.filter(user=self.request.user) class DeleteAddressView(generics.DestroyAPIView): queryset = UserAddressModel.objects.all() permission_classes = [permissions.IsAuthenticated] def get_queryset(self): return UserAddressModel.objects.filter(user=self.request.user) class GetUserAddressesView(generics.ListAPIView): serializer_class = UserAddressSerializer permission_classes = [permissions.IsAuthenticated] def get_queryset(self): return UserAddressModel.objects.filter(user=self.request.user) class GetIDUserAddressView(generics.RetrieveAPIView): serializer_class = UserAddressSerializer permission_classes = [permissions.IsAuthenticated] def get_queryset(self): return UserAddressModel.objects.filter(user=self.request.user)