diff --git a/apps/accounts/admin.py b/apps/accounts/admin.py index 8b978de4e5..375c15d3df 100644 --- a/apps/accounts/admin.py +++ b/apps/accounts/admin.py @@ -1,12 +1,12 @@ -from allauth.account.admin import EmailAddressAdmin +from allauth.account.admin import EmailAddressAdmin as AllAuthEmailAddressAdmin from allauth.account.models import EmailAddress from base.admin import ImportExportTimeStampedAdmin from django.contrib import admin -from django.contrib.auth.admin import UserAdmin +from django.contrib.auth.admin import UserAdmin as AuthUserAdmin from django.contrib.auth.models import User from import_export import resources from import_export.admin import ExportMixin -from rest_framework.authtoken.admin import TokenAdmin +from rest_framework.authtoken.admin import TokenAdmin as RestTokenAdmin from rest_framework.authtoken.models import Token from .models import JwtToken, Profile @@ -54,12 +54,12 @@ class Meta: ) -class UserAdmin(ExportMixin, UserAdmin): +class CustomUserAdmin(ExportMixin, AuthUserAdmin): resource_class = UserResource admin.site.unregister(User) -admin.site.register(User, UserAdmin) +admin.site.register(User, CustomUserAdmin) class TokenResource(resources.ModelResource): @@ -67,14 +67,14 @@ class Meta: model = Token -class TokenAdmin(TokenAdmin): +class CustomTokenAdmin(ExportMixin, RestTokenAdmin): resource_class = TokenResource list_filter = ("created",) search_fields = ("user__username",) admin.site.unregister(Token) -admin.site.register(Token, TokenAdmin) +admin.site.register(Token, CustomTokenAdmin) @admin.register(JwtToken) @@ -87,18 +87,14 @@ class JwtTokenAdmin(ImportExportTimeStampedAdmin): search_fields = ("user__username",) -admin.site.unregister(JwtToken) -admin.site.register(JwtToken, JwtTokenAdmin) - - class EmailAddressResource(resources.ModelResource): class Meta: model = EmailAddress -class EmailAddressAdmin(ExportMixin, EmailAddressAdmin): +class CustomEmailAddressAdmin(ExportMixin, AllAuthEmailAddressAdmin): resource_class = EmailAddressResource admin.site.unregister(EmailAddress) -admin.site.register(EmailAddress, EmailAddressAdmin) +admin.site.register(EmailAddress, CustomEmailAddressAdmin) diff --git a/apps/accounts/models.py b/apps/accounts/models.py index b3866dd1b3..c0f3c699b9 100644 --- a/apps/accounts/models.py +++ b/apps/accounts/models.py @@ -27,7 +27,7 @@ class UserStatus(TimeStampedModel): status = models.CharField(max_length=30, unique=True) def __str__(self): - return self.name + return str(self.name) class Meta: app_label = "accounts" @@ -48,7 +48,7 @@ class Profile(TimeStampedModel): linkedin_url = models.URLField(max_length=200, null=True, blank=True) def __str__(self): - return "{}".format(self.user) + return f"{self.user}" class Meta: app_label = "accounts" @@ -65,7 +65,7 @@ class JwtToken(TimeStampedModel): refresh_token = models.CharField(max_length=512, blank=False, null=True) def __str__(self): - return "{}".format(self.user) + return f"{self.user}" class Meta: app_label = "accounts" diff --git a/apps/accounts/permissions.py b/apps/accounts/permissions.py index 74cd8fbe88..b9628c8a3e 100644 --- a/apps/accounts/permissions.py +++ b/apps/accounts/permissions.py @@ -10,13 +10,8 @@ class HasVerifiedEmail(permissions.BasePermission): message = "Please verify your email!" def has_permission(self, request, view): - if request.user.is_anonymous: return True - else: - if EmailAddress.objects.filter( - user=request.user, verified=True - ).exists(): - return True - else: - return False + return EmailAddress.objects.filter( + user=request.user, verified=True + ).exists() diff --git a/apps/accounts/serializers.py b/apps/accounts/serializers.py index d0362c1068..bec21992ff 100644 --- a/apps/accounts/serializers.py +++ b/apps/accounts/serializers.py @@ -62,9 +62,7 @@ def update(self, instance, validated_data): google_scholar_url = profile_data.get("google_scholar_url") linkedin_url = profile_data.get("linkedin_url") - instance = super(ProfileSerializer, self).update( - instance, validated_data - ) + instance = super().update(instance, validated_data) profile = instance.profile if profile_data: @@ -116,12 +114,13 @@ def get_email_options(self): if not user.is_active: raise ValidationError( { - "details": "Account is not active. Please contact the administrator." + "details": "Account is not active. " + "Please contact the administrator." } ) - else: - return super().get_email_options() + return super().get_email_options() except get_user_model().DoesNotExist: + exc = get_user_model().DoesNotExist() raise ValidationError( {"details": "User with the given email does not exist."} - ) + ) from exc diff --git a/apps/accounts/views.py b/apps/accounts/views.py index 9c89f3d83a..1b69b44306 100644 --- a/apps/accounts/views.py +++ b/apps/accounts/views.py @@ -28,7 +28,15 @@ @permission_classes((permissions.IsAuthenticated,)) @authentication_classes((JWTAuthentication, ExpiringTokenAuthentication)) def disable_user(request): - + """ + Disable a user account by setting is_active to False and logging them out. + + Args: + request (Request): HTTP request object with authenticated user + + Returns: + Response: HTTP 200 OK response on successful deactivation + """ user = request.user user.is_active = False user.save() @@ -41,6 +49,15 @@ def disable_user(request): @permission_classes((permissions.IsAuthenticated, HasVerifiedEmail)) @authentication_classes((JWTAuthentication, ExpiringTokenAuthentication)) def get_auth_token(request): + """ + Generate or retrieve JWT token for authenticated user. + + Args: + request (Request): HTTP request object with authenticated user + + Returns: + Response: Response with JWT token and expiry date + """ try: user = User.objects.get(email=request.user.email) except User.DoesNotExist: @@ -68,7 +85,7 @@ def get_auth_token(request): "-created_at" )[0] response_data = { - "token": "{}".format(token.refresh_token), + "token": f"{token.refresh_token}", "expires_at": outstanding_token.expires_at, } return Response(response_data, status=status.HTTP_200_OK) @@ -92,6 +109,16 @@ def resend_email_confirmation(request): @permission_classes((permissions.IsAuthenticated, HasVerifiedEmail)) @authentication_classes((JWTAuthentication, ExpiringTokenAuthentication)) def refresh_auth_token(request): + """ + Refresh the JWT auth token for an authenticated user. + + Args: + request (Request): HTTP request object with authenticated user + + Returns: + Response: Response with new JWT token on success, + error response otherwise + """ try: user = User.objects.get(email=request.user.email) except User.DoesNotExist: @@ -124,7 +151,7 @@ def refresh_auth_token(request): if token_serializer.is_valid(): token_serializer.save() token = token_serializer.instance - response_data = {"token": "{}".format(token.refresh_token)} + response_data = {"token": f"{token.refresh_token}"} return Response(response_data, status=status.HTTP_200_OK) return Response(response_data, status=status.HTTP_400_BAD_REQUEST)