From 8497b2c5ab968dd5e64dfd15fc8156a52d4f92d9 Mon Sep 17 00:00:00 2001 From: M-Usman-Dev Date: Tue, 28 Mar 2023 19:36:44 +0500 Subject: [PATCH] social google login added --- .../users/api/views.py | 63 ++++++++++++++----- .../users/urls.py | 3 + 2 files changed, 49 insertions(+), 17 deletions(-) diff --git a/{{cookiecutter.project_slug}}/{{cookiecutter.project_slug}}/users/api/views.py b/{{cookiecutter.project_slug}}/{{cookiecutter.project_slug}}/users/api/views.py index 98bb04e7b..e7675eb92 100644 --- a/{{cookiecutter.project_slug}}/{{cookiecutter.project_slug}}/users/api/views.py +++ b/{{cookiecutter.project_slug}}/{{cookiecutter.project_slug}}/users/api/views.py @@ -1,25 +1,54 @@ from django.contrib.auth import get_user_model -from rest_framework import status -from rest_framework.decorators import action -from rest_framework.mixins import ListModelMixin, RetrieveModelMixin, UpdateModelMixin -from rest_framework.response import Response -from rest_framework.viewsets import GenericViewSet +from django.contrib.auth.mixins import LoginRequiredMixin +from rest_auth.registration.views import SocialLoginView +from django.contrib.messages.views import SuccessMessageMixin +from django.urls import reverse +from django.utils.translation import gettext_lazy as _ +from django.views.generic import DetailView, RedirectView, UpdateView -from .serializers import UserSerializer User = get_user_model() -class UserViewSet(RetrieveModelMixin, ListModelMixin, UpdateModelMixin, GenericViewSet): - serializer_class = UserSerializer - queryset = User.objects.all() - lookup_field = "username" +class UserDetailView(LoginRequiredMixin, DetailView): + model = User + slug_field = "username" + slug_url_kwarg = "username" - def get_queryset(self, *args, **kwargs): - assert isinstance(self.request.user.id, int) - return self.queryset.filter(id=self.request.user.id) - @action(detail=False) - def me(self, request): - serializer = UserSerializer(request.user, context={"request": request}) - return Response(status=status.HTTP_200_OK, data=serializer.data) +user_detail_view = UserDetailView.as_view() + + +class UserUpdateView(LoginRequiredMixin, SuccessMessageMixin, UpdateView): + model = User + fields = ["name"] + success_message = _("Information successfully updated") + + def get_success_url(self): + assert ( + self.request.user.is_authenticated + ) # for mypy to know that the user is authenticated + return self.request.user.get_absolute_url() + + def get_object(self): + return self.request.user + + +user_update_view = UserUpdateView.as_view() + + +class UserRedirectView(LoginRequiredMixin, RedirectView): + permanent = False + + def get_redirect_url(self): + return reverse("users:detail", kwargs={"username": self.request.user.username}) + + +user_redirect_view = UserRedirectView.as_view() + + +class GoogleLogin(SocialLoginView): + adapter_class = GoogleOAuth2AdapterIdToken + client_class = OAuth2Client + serializer_class = CustomSocialLoginSerializer + diff --git a/{{cookiecutter.project_slug}}/{{cookiecutter.project_slug}}/users/urls.py b/{{cookiecutter.project_slug}}/{{cookiecutter.project_slug}}/users/urls.py index 8c8c7e2ea..f176f2163 100644 --- a/{{cookiecutter.project_slug}}/{{cookiecutter.project_slug}}/users/urls.py +++ b/{{cookiecutter.project_slug}}/{{cookiecutter.project_slug}}/users/urls.py @@ -4,6 +4,7 @@ from {{ cookiecutter.project_slug }}.users.views import ( user_detail_view, user_redirect_view, user_update_view, + GoogleLogin ) app_name = "users" @@ -11,4 +12,6 @@ urlpatterns = [ path("~redirect/", view=user_redirect_view, name="redirect"), path("~update/", view=user_update_view, name="update"), path("/", view=user_detail_view, name="detail"), + path('rest-auth/google/', GoogleLogin.as_view(), name='google_login'), + ]