Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 9 additions & 13 deletions apps/accounts/admin.py
Original file line number Diff line number Diff line change
@@ -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
Expand Down Expand Up @@ -54,27 +54,27 @@ 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):
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)
Expand All @@ -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)
6 changes: 3 additions & 3 deletions apps/accounts/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand All @@ -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"
Expand All @@ -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"
Expand Down
11 changes: 3 additions & 8 deletions apps/accounts/permissions.py
Original file line number Diff line number Diff line change
Expand Up @@ -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()
13 changes: 6 additions & 7 deletions apps/accounts/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down Expand Up @@ -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
33 changes: 30 additions & 3 deletions apps/accounts/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand All @@ -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:
Expand Down Expand Up @@ -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)
Expand All @@ -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:
Expand Down Expand Up @@ -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)