diff --git a/apps/users/serializers.py b/apps/users/serializers.py index ff7b3e0..de3e137 100644 --- a/apps/users/serializers.py +++ b/apps/users/serializers.py @@ -1,4 +1,5 @@ from django.core.validators import RegexValidator +from oauth2_provider.models import get_access_token_model from rest_framework import serializers from apps.users.models import User @@ -133,3 +134,11 @@ class ChangePasswordSerializer(serializers.Serializer): old_password = serializers.CharField(required=True) old_password_field = serializers.CharField(default='password') new_password = serializers.CharField(required=True) + + +AccessToken = get_access_token_model() +class SessionSerializer(serializers.ModelSerializer): + class Meta: + model = AccessToken + fields = ('uuid', 'token', 'created', "detail") + read_only_fields = ['uuid', 'token', 'created', "detail"] diff --git a/apps/users/urls.py b/apps/users/urls.py index c8f4d6e..789744e 100644 --- a/apps/users/urls.py +++ b/apps/users/urls.py @@ -2,7 +2,7 @@ from django.urls import path from django.contrib.auth.views import LogoutView from .views import UserListView, UserPublicRetrieveView, AccountView, RequestOTPView, ChangePasswordView, \ OTPLoginView, ProfileDetailView, ProfileUpdateView, RequestOTTView, UserCurrentAvatarUrlView, UserInquiryView, \ - UserDetailedRetrieveView + UserDetailedRetrieveView, UserSessionListView app_name = "users" @@ -13,6 +13,7 @@ urlpatterns = [ path('account/update/', ProfileUpdateView.as_view(), name='account_update'), path('api/account/', AccountView.as_view(), name='account_api'), path('api/users/', UserListView.as_view(), name='user_list_api'), + path('api/sessions/', UserSessionListView.as_view(), name='user_sessions_api'), path('api/users//', UserPublicRetrieveView.as_view(), name='user_public_retrieve_api'), path('api/users//avatar', UserCurrentAvatarUrlView.as_view(), name='user_avatar_api'), path('api/users//details', UserDetailedRetrieveView.as_view(), name='user_detailed_retrieve_api'), diff --git a/apps/users/views.py b/apps/users/views.py index a5fca61..c2b6e62 100644 --- a/apps/users/views.py +++ b/apps/users/views.py @@ -20,7 +20,7 @@ from apps.users.forms import OTPAuthenticationForm, ProfileUpdateForm from apps.users.models import User from apps.users.provinces_and_cities import State from apps.users.serializers import PublicUserSerializer, AccountSerializer, RequestOTPSerializer, RequestOTTSerializer, \ - ChangePasswordSerializer, UserInquirySerializer + ChangePasswordSerializer, UserInquirySerializer, SessionSerializer from utils.throttles import RequestOTPDayRateThrottle, RequestOTPMinRateThrottle UserModel = get_user_model() @@ -180,3 +180,18 @@ class ProfileUpdateView(UpdateView): def form_valid(self, form): return super().form_valid(form) + + +class UserSessionListView(generics.ListAPIView): + permission_classes = [IsAuthenticatedOrTokenMatchesOASRequirements] + serializer_class = SessionSerializer + filter_backends = (DjangoFilterBackend,) + + required_alternate_scopes = { + "GET": [["accounts.account:retrieve"]], + } + + def get_queryset(self): + from apps.gooyal_oauth2.models import AccessToken + return AccessToken.objects.filter(user=self.request.user).all() +