If/else для изменения пароля для пользователя приложения и социального пользователя

Я пытаюсь создать функциональность для смены паролей, есть два пользователя:

  1. registered through my app
  2. registered via social authentication.

В первом случае будет запрошен старый пароль, а затем новый пароль для смены пароля. во втором случае, так как у них нет пароля для приложения, когда они хотят изменить пароль в первый раз, будет запрошен только новый пароль, а затем старый пароль.

Ниже приведено то, что я пробовал до сих пор, первый тестовый пример проходит, но второй также требует старый и новый пароли! Что является причиной этого? Это правильный способ решения проблемы?

views.py

class ChangePassword(APIView):
    serializer_class=ChangePasswordSerializer
    serializer_class2=ChangePasswordSerializer2
    model = User
    permission_classes = [IsAuthenticated]

    def get_object(self, queryset=None):
        obj = self.request.user
        return obj

    def put(self,request, *args, **kwargs):
        self.object = self.get_object()
        
    
        if self.object.auth_provider != "email": 
            serializer = self.serializer_class2(data=request.data)
            if serializer.is_valid():
                self.object.set_password(serializer.data.get("new_password"))
                self.object.auth_provider == "email"
                self.object.save()
                response={
                        'status':'success',
                        'code':status.HTTP_200_OK,
                        'message':"Password changed Successfully",
                    }        
                return Response(response)
            return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)                  
        else:
            #check old password
            serializer = self.serializer_class(data=request.data)
            if serializer.is_valid():
                if not self.object.check_password(serializer.data.get("old_password")):
                    return Response({'error':["Wrong_password"]}, status=status.HTTP_400_BAD_REQUEST)
                self.object.set_password(serializer.data.get("new_password"))
                self.object.save()
                response={
                    'status':'success',
                    'code':status.HTTP_200_OK,
                    'message':"Password changed Successfully",
                }        
                return Response(response)                
            return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

serializers.py

class ChangePasswordSerializer(serializers.Serializer):
    model = User
    email= serializers.EmailField(min_length=5)
    old_password=serializers.CharField(min_length=6)
    new_password = serializers.CharField(min_length=6)

class ChangePasswordSerializer2(serializers.Serializer):
    model = User
    email = serializers.EmailField(min_length = 6)
Вернуться на верх