Skip to content

Commit

Permalink
fix: add creating UserWebsiteLogin to other login types and to creati…
Browse files Browse the repository at this point in the history
…ng user
  • Loading branch information
AmooHashem committed Oct 29, 2024
1 parent 995ccfc commit 264da80
Show file tree
Hide file tree
Showing 7 changed files with 66 additions and 43 deletions.
2 changes: 1 addition & 1 deletion apps/accounts/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
router.register(r'studentship', StudentshipViewSet, basename='studentships')

urlpatterns = [
path('accounts/simple-login/', SimpleLogin.as_view(), name='create_token'),
path('accounts/simple-login/', SimpleLogin.as_view(), name='simple-login'),
path('accounts/otp-login/', OTPLoginView.as_view(), name='otp-login'),
path("accounts/google-login/", GoogleLogin.as_view(), name="google-login"),

Expand Down
10 changes: 5 additions & 5 deletions apps/accounts/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
from django.contrib.auth.hashers import make_password, check_password

from apps.accounts.serializers.user_serializer import UserSerializer
from apps.accounts.models import User, UserWebsite
from apps.accounts.models import User, UserWebsite, UserWebsiteLogin
from apps.accounts.serializers.custom_token_obtain import CustomTokenObtainSerializer
from errors.error_codes import serialize_error
from apps.fsm.models import RegistrationForm, RegistrationReceipt, Team, AnswerSheet
Expand Down Expand Up @@ -62,7 +62,7 @@ def create_or_get_user(user_data, website):
user = find_user(user_data=user_data)

if user and user.get_user_website(website=website):
return user
return user, False

if not user:
serializer = UserSerializer(data=user_data)
Expand All @@ -81,10 +81,10 @@ def create_or_get_user(user_data, website):
# )

# send greeting notification
notification_service_proxy = InstantMessagingServiceProxy(website=website)
notification_service_proxy.send_greeting_notification(recipient=user)
# notification_service_proxy = InstantMessagingServiceProxy(website=website)
# notification_service_proxy.send_greeting_notification(recipient=user)

return user
return user, True


def can_user_login(user, password, website):
Expand Down
16 changes: 13 additions & 3 deletions apps/accounts/views/google_login.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
from rest_framework.response import Response
from rest_framework_simplejwt.views import TokenObtainPairView

from apps.accounts.models import UserWebsiteLogin
from apps.accounts.serializers.user_serializer import UserSerializer
from apps.accounts.utils import create_or_get_user, generate_tokens_for_user

Expand All @@ -15,11 +16,20 @@ class GoogleLogin(TokenObtainPairView):
400: "error code 4007 for not enough credentials",
401: "error code 4006 for not submitted users & 4009 for wrong credentials"})
def post(self, request, *args, **kwargs):
user = create_or_get_user(user_data={**request.data, "password": request.data.get("email")},
website=request.headers.get("Website"))
user, created = create_or_get_user(user_data={**request.data, "password": request.data.get("email")},
website=request.headers.get("Website"))

website = request.headers.get("Website")

# create a login object to save users logins
UserWebsiteLogin.objects.create(
user_website=user.get_user_website(website=website)
)

access_token, refresh_token = generate_tokens_for_user(user)

return Response({
'user': UserSerializer(user).data,
'access': str(access_token),
'refresh': str(refresh_token)
}, status=status.HTTP_201_CREATED)
}, status=status.HTTP_201_CREATED if created else status.HTTP_200_OK)
22 changes: 13 additions & 9 deletions apps/accounts/views/otp_login.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,10 @@
from rest_framework.response import Response
from rest_framework.exceptions import ParseError

from apps.accounts.models import VerificationCode
from apps.accounts.models import UserWebsiteLogin, VerificationCode
from apps.accounts.serializers.user_serializer import PhoneNumberVerificationCodeSerializer, UserSerializer

from apps.accounts.utils import find_user_in_website, generate_secure_password, generate_tokens_for_user
from apps.accounts.utils import create_or_get_user, find_user_in_website, generate_secure_password, generate_tokens_for_user
from errors.error_codes import serialize_error


Expand Down Expand Up @@ -51,14 +51,10 @@ def post(self, request):
}

# Use your UserSerializer to create new user
user_serializer = UserSerializer(data=user_data)
user_serializer.is_valid(raise_exception=True)
user = user_serializer.create(user_serializer.validated_data)
user, created = create_or_get_user(
user_data, website=request.headers.get("Website"))
response_status = status.HTTP_201_CREATED

# Generate tokens
access_token, refresh_token = generate_tokens_for_user(user)

# Invalidate the verification code
verification_code = VerificationCode.objects.get(
phone_number=phone_number,
Expand All @@ -68,9 +64,17 @@ def post(self, request):
verification_code.is_valid = False
verification_code.save()

# create a login object to save users logins
UserWebsiteLogin.objects.create(
user_website=user.get_user_website(website=website)
)

# Generate tokens
access_token, refresh_token = generate_tokens_for_user(user)

return Response({
'user': UserSerializer(user).data,
'access': str(access_token),
'refresh': str(refresh_token),
'is_new_user': response_status == status.HTTP_201_CREATED
}, status=response_status)
}, status=status.HTTP_201_CREATED if created else status.HTTP_200_OK)
29 changes: 15 additions & 14 deletions apps/accounts/views/simple_login.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,11 @@
from apps.accounts.models import UserWebsiteLogin
from apps.accounts.serializers.user_serializer import UserSerializer
from apps.accounts.serializers.custom_token_obtain import CustomTokenObtainSerializer
from apps.accounts.utils import can_user_login, find_user_in_website
from apps.accounts.utils import can_user_login, create_or_get_user, find_user_in_website, generate_tokens_for_user
from errors.error_codes import serialize_error


class SimpleLogin(TokenObtainPairView):
serializer_class = CustomTokenObtainSerializer
permission_classes = (permissions.AllowAny,)

@swagger_auto_schema(tags=['accounts'],
Expand All @@ -21,20 +20,22 @@ class SimpleLogin(TokenObtainPairView):
401: "error code 4006 for not submitted users & 4009 for wrong credentials"})
def post(self, request, *args, **kwargs):
website = request.headers.get("Website")
user = find_user_in_website(
user_data=request.data,
website=website,
raise_exception=True,
)

user, _ = create_or_get_user(user_data={**request.data, "password": request.data.get("email")},
website=request.headers.get("Website"))

if not can_user_login(user=user, password=request.data.get("password"), website=website):
raise ParseError(serialize_error('4009'))

token_serializer = self.get_serializer(
data={"username": user.username})

token_serializer.is_valid(raise_exception=True)
# create a login object to save users logins
UserWebsiteLogin.objects.create(
**{"user_website": user.get_user_website(website=website)})
return Response({'user': UserSerializer(user).data, **token_serializer.validated_data},
status=status.HTTP_200_OK)
user_website=user.get_user_website(website=website)
)

access_token, refresh_token = generate_tokens_for_user(user)

return Response({
'user': UserSerializer(user).data,
'access': str(access_token),
'refresh': str(refresh_token),
}, status.HTTP_200_OK)
28 changes: 18 additions & 10 deletions apps/accounts/views/user.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,10 @@
from rest_framework.response import Response
from rest_framework.viewsets import ModelViewSet

from apps.accounts.models import User
from apps.accounts.models import User, UserWebsiteLogin
from apps.accounts.permissions import IsHimself
from apps.accounts.serializers.user_serializer import PhoneNumberVerificationCodeSerializer, UserSerializer
from apps.accounts.serializers.custom_token_obtain import CustomTokenObtainSerializer
from apps.accounts.utils import create_or_get_user, find_user_in_website
from apps.accounts.utils import create_or_get_user, find_user_in_website, generate_tokens_for_user
from errors.error_codes import serialize_error


Expand Down Expand Up @@ -68,11 +67,20 @@ def create(self, request):
if user:
raise ParseError(serialize_error('4117'))

user = create_or_get_user(user_data=request.data,
website=request.headers.get("Website"))
user, _ = create_or_get_user(user_data=request.data,
website=request.headers.get("Website"))

token_serializer = CustomTokenObtainSerializer(
data={'username': user.username})
if token_serializer.is_valid(raise_exception=True):
return Response({'user': UserSerializer(user).data, **token_serializer.validated_data},
status=status.HTTP_201_CREATED)
website = request.headers.get("Website")

# create a login object to save users logins
UserWebsiteLogin.objects.create(
user_website=user.get_user_website(website=website)
)

access_token, refresh_token = generate_tokens_for_user(user)

return Response({
'user': UserSerializer(user).data,
'access': str(access_token),
'refresh': str(refresh_token),
}, status=status.HTTP_201_CREATED)
2 changes: 1 addition & 1 deletion apps/fsm/views/registration_admin_view.py
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ def long_task():
registration_form = self.get_object()
participant = handle_user_name_while_registration(
participant)
participant_user_account = create_or_get_user(
participant_user_account, created = create_or_get_user(
user_data=participant, website=website)
receipt = update_or_create_registration_receipt(
participant_user_account, registration_form)
Expand Down

0 comments on commit 264da80

Please sign in to comment.