From 236fd5c37b5ce79e6e34f31b54131a30b86402e4 Mon Sep 17 00:00:00 2001 From: Pablo Moreno Date: Mon, 13 May 2024 00:42:51 +0200 Subject: [PATCH] chore: blacked --- config/settings/base.py | 11 +-- config/urls.py | 2 +- files/api/v1/serializers.py | 4 +- files/api/v1/urls.py | 2 +- users/api/v1/serializers.py | 54 ++++++++----- users/api/v1/urls.py | 12 +-- users/api/v1/views.py | 10 ++- users/tests/test_change_password.py | 118 +++++++++++++++++----------- users/tests/test_login.py | 99 ++++++++++++++--------- users/tests/test_users_model.py | 12 +-- 10 files changed, 190 insertions(+), 134 deletions(-) diff --git a/config/settings/base.py b/config/settings/base.py index 020f03a..d023469 100644 --- a/config/settings/base.py +++ b/config/settings/base.py @@ -188,7 +188,6 @@ SIMPLE_JWT = { "ROTATE_REFRESH_TOKENS": False, "BLACKLIST_AFTER_ROTATION": False, "UPDATE_LAST_LOGIN": False, - "ALGORITHM": "HS256", "SIGNING_KEY": SECRET_KEY, "VERIFYING_KEY": "", @@ -197,23 +196,21 @@ SIMPLE_JWT = { "JSON_ENCODER": None, "JWK_URL": None, "LEEWAY": 0, - - "AUTH_HEADER_TYPES": ("Bearer", "JWT", ), + "AUTH_HEADER_TYPES": ( + "Bearer", + "JWT", + ), "AUTH_HEADER_NAME": "HTTP_AUTHORIZATION", "USER_ID_FIELD": "id", "USER_ID_CLAIM": "user_id", "USER_AUTHENTICATION_RULE": "rest_framework_simplejwt.authentication.default_user_authentication_rule", - "AUTH_TOKEN_CLASSES": ("rest_framework_simplejwt.tokens.AccessToken",), "TOKEN_TYPE_CLAIM": "token_type", "TOKEN_USER_CLASS": "rest_framework_simplejwt.models.TokenUser", - "JTI_CLAIM": "jti", - "SLIDING_TOKEN_REFRESH_EXP_CLAIM": "refresh_exp", "SLIDING_TOKEN_LIFETIME": datetime.timedelta(minutes=5), "SLIDING_TOKEN_REFRESH_LIFETIME": datetime.timedelta(days=1), - "TOKEN_OBTAIN_SERIALIZER": "rest_framework_simplejwt.serializers.TokenObtainPairSerializer", "TOKEN_REFRESH_SERIALIZER": "rest_framework_simplejwt.serializers.TokenRefreshSerializer", "TOKEN_VERIFY_SERIALIZER": "rest_framework_simplejwt.serializers.TokenVerifySerializer", diff --git a/config/urls.py b/config/urls.py index 062bfbe..68537ce 100644 --- a/config/urls.py +++ b/config/urls.py @@ -14,5 +14,5 @@ urlpatterns = [ ] if settings.DEBUG: - urlpatterns.append(path('__debug__/', include(debug_toolbar.urls))) + urlpatterns.append(path("__debug__/", include(debug_toolbar.urls))) urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) diff --git a/files/api/v1/serializers.py b/files/api/v1/serializers.py index 5551ae1..2a2ab07 100644 --- a/files/api/v1/serializers.py +++ b/files/api/v1/serializers.py @@ -6,5 +6,5 @@ from files.models import FileUpload class FileUploadSerializer(serializers.ModelSerializer): class Meta: model = FileUpload - fields = ('file', 'id') - read_only_fields = ('id', ) + fields = ("file", "id") + read_only_fields = ("id",) diff --git a/files/api/v1/urls.py b/files/api/v1/urls.py index e5784fe..c438164 100644 --- a/files/api/v1/urls.py +++ b/files/api/v1/urls.py @@ -3,6 +3,6 @@ from rest_framework.routers import DefaultRouter from files.api.v1.views import FileUploadViewSet router = DefaultRouter(trailing_slash=True) -router.register('', FileUploadViewSet) +router.register("", FileUploadViewSet) urlpatterns = router.urls diff --git a/users/api/v1/serializers.py b/users/api/v1/serializers.py index 844cce9..811c1a3 100644 --- a/users/api/v1/serializers.py +++ b/users/api/v1/serializers.py @@ -2,7 +2,10 @@ from typing import List from django.conf import settings from django.contrib.auth import get_user_model -from django.contrib.auth.password_validation import get_password_validators, validate_password +from django.contrib.auth.password_validation import ( + get_password_validators, + validate_password, +) from rest_framework import serializers from rest_framework.exceptions import ValidationError from rest_framework_simplejwt.serializers import TokenObtainPairSerializer @@ -10,7 +13,7 @@ from rest_framework_simplejwt.serializers import TokenObtainPairSerializer User = get_user_model() -AUTH_PASSWORD_VALIDATORS = getattr(settings, 'AUTH_PASSWORD_VALIDATORS') +AUTH_PASSWORD_VALIDATORS = getattr(settings, "AUTH_PASSWORD_VALIDATORS") class UserSerializer(serializers.ModelSerializer): @@ -25,15 +28,21 @@ class UserSerializer(serializers.ModelSerializer): class Meta: model = User fields = ( - 'username', - 'email', - 'first_name', - 'last_name', - 'is_staff', - 'is_superuser', - 'permissions', + "username", + "email", + "first_name", + "last_name", + "is_staff", + "is_superuser", + "permissions", + ) + read_only_fields = ( + "username", + "code", + "is_staff", + "is_superuser", + "permissions", ) - read_only_fields = ('username', 'code', 'is_staff', 'is_superuser', 'permissions', ) class UpdatePasswordSerializer(serializers.ModelSerializer): @@ -42,32 +51,39 @@ class UpdatePasswordSerializer(serializers.ModelSerializer): new_password2 = serializers.CharField(write_only=True) def validate_old_password(self, password): - user = self.context.get('request').user + user = self.context.get("request").user if not user.check_password(password): - raise ValidationError('Wrong old password') + raise ValidationError("Wrong old password") return password def validate_new_password(self, password): - old_password = self.context.get('request').data.get('old_password') + old_password = self.context.get("request").data.get("old_password") if password == old_password: - raise ValidationError('Password can\'t be the same as the old one') + raise ValidationError("Password can't be the same as the old one") - password2 = self.context.get('request').data.get('new_password2') + password2 = self.context.get("request").data.get("new_password2") if password != password2: - raise ValidationError('Password mismatch') + raise ValidationError("Password mismatch") - validate_password(password, password_validators=get_password_validators(AUTH_PASSWORD_VALIDATORS)) + validate_password( + password, + password_validators=get_password_validators(AUTH_PASSWORD_VALIDATORS), + ) return password def save(self, *args, **kwargs): - new_password = self.validated_data.get('new_password') + new_password = self.validated_data.get("new_password") self.instance.set_password(new_password) self.instance.save() class Meta: model = User - fields = ('old_password', 'new_password', 'new_password2', ) + fields = ( + "old_password", + "new_password", + "new_password2", + ) diff --git a/users/api/v1/urls.py b/users/api/v1/urls.py index c92b2fd..020724e 100644 --- a/users/api/v1/urls.py +++ b/users/api/v1/urls.py @@ -4,13 +4,13 @@ from users.api.v1.views import retrieve_update_me, change_password from rest_framework_simplejwt.views import ( token_refresh, token_obtain_pair, - token_verify + token_verify, ) urlpatterns = [ - path('login/', token_obtain_pair, name='login'), - path('refresh/', token_refresh, name='refresh_jwt'), - path('verify/', token_verify, name='verify_jwt'), - path('me/', retrieve_update_me, name='user_info'), - path('change-password/', change_password, name='change_password'), + path("login/", token_obtain_pair, name="login"), + path("refresh/", token_refresh, name="refresh_jwt"), + path("verify/", token_verify, name="verify_jwt"), + path("me/", retrieve_update_me, name="user_info"), + path("change-password/", change_password, name="change_password"), ] diff --git a/users/api/v1/views.py b/users/api/v1/views.py index f928085..b3d867d 100644 --- a/users/api/v1/views.py +++ b/users/api/v1/views.py @@ -7,10 +7,11 @@ from users.api.v1.serializers import UserSerializer, UpdatePasswordSerializer class RetrieveUpdateMe(RetrieveUpdateAPIView): """ - get: Return user info + get: Return user info - put: Update user info + put: Update user info """ + serializer_class = UserSerializer def get_object(self): @@ -19,10 +20,11 @@ class RetrieveUpdateMe(RetrieveUpdateAPIView): class ChangePassword(UpdateAPIView): """ - put: Update user's password + put: Update user's password """ + serializer_class = UpdatePasswordSerializer - permission_classes = (IsAuthenticated, ) + permission_classes = (IsAuthenticated,) queryset = User.objects.all() def get_object(self): diff --git a/users/tests/test_change_password.py b/users/tests/test_change_password.py index f29b4c7..9600620 100644 --- a/users/tests/test_change_password.py +++ b/users/tests/test_change_password.py @@ -7,79 +7,103 @@ User = get_user_model() class TestChangePassword(APITestCase): def setUp(self) -> None: - self.password = 'theonering' + self.password = "theonering" self.user = User.objects.create( - username='sauron', - email='sauron@mordor.middleearth', + username="sauron", + email="sauron@mordor.middleearth", ) self.user.set_password(self.password) self.user.save() def test_login_then_change_password(self): - response = self.client.post('/api/v1/auth/login/', { - 'username': self.user.username, - 'password': self.password, - }) + response = self.client.post( + "/api/v1/auth/login/", + { + "username": self.user.username, + "password": self.password, + }, + ) assert response.status_code == status.HTTP_200_OK - jwt_token = response.data.get('access') - self.client.credentials(HTTP_AUTHORIZATION=f'JWT {jwt_token}') - response = self.client.put('/api/v1/auth/change-password/', { - 'new_password': 'barad-dur', - 'new_password2': 'barad-dur', - 'old_password': self.password, - }) + jwt_token = response.data.get("access") + self.client.credentials(HTTP_AUTHORIZATION=f"JWT {jwt_token}") + response = self.client.put( + "/api/v1/auth/change-password/", + { + "new_password": "barad-dur", + "new_password2": "barad-dur", + "old_password": self.password, + }, + ) assert response.status_code == status.HTTP_200_OK def test_login_then_change_password_with_wrong_password(self): - response = self.client.post('/api/v1/auth/login/', { - 'username': self.user.username, - 'password': self.password, - }) + response = self.client.post( + "/api/v1/auth/login/", + { + "username": self.user.username, + "password": self.password, + }, + ) assert response.status_code == status.HTTP_200_OK - jwt_token = response.data.get('access') - self.client.credentials(HTTP_AUTHORIZATION=f'JWT {jwt_token}') - response = self.client.put('/api/v1/auth/change-password/', { - 'new_password': 'barad-dur', - 'new_password2': 'barad-dur', - 'old_password': 'incorrectoldpassword', - }) + jwt_token = response.data.get("access") + self.client.credentials(HTTP_AUTHORIZATION=f"JWT {jwt_token}") + response = self.client.put( + "/api/v1/auth/change-password/", + { + "new_password": "barad-dur", + "new_password2": "barad-dur", + "old_password": "incorrectoldpassword", + }, + ) assert response.status_code == status.HTTP_400_BAD_REQUEST def test_login_then_change_password_mismatch_password(self): - response = self.client.post('/api/v1/auth/login/', { - 'username': self.user.username, - 'password': self.password, - }) + response = self.client.post( + "/api/v1/auth/login/", + { + "username": self.user.username, + "password": self.password, + }, + ) assert response.status_code == status.HTTP_200_OK - jwt_token = response.data.get('access') - self.client.credentials(HTTP_AUTHORIZATION=f'JWT {jwt_token}') - response = self.client.put('/api/v1/auth/change-password/', { - 'new_password': 'barad-dur', - 'new_password2': 'mountdoom', - 'old_password': self.password, - }) + jwt_token = response.data.get("access") + self.client.credentials(HTTP_AUTHORIZATION=f"JWT {jwt_token}") + response = self.client.put( + "/api/v1/auth/change-password/", + { + "new_password": "barad-dur", + "new_password2": "mountdoom", + "old_password": self.password, + }, + ) assert response.status_code == status.HTTP_400_BAD_REQUEST def test_login_then_change_password_but_its_the_same(self): - response = self.client.post('/api/v1/auth/login/', { - 'username': self.user.username, - 'password': self.password, - }) + response = self.client.post( + "/api/v1/auth/login/", + { + "username": self.user.username, + "password": self.password, + }, + ) assert response.status_code == status.HTTP_200_OK - jwt_token = response.data.get('access') - self.client.credentials(HTTP_AUTHORIZATION=f'JWT {jwt_token}') - response = self.client.put('/api/v1/auth/change-password/', { - 'new_password': self.password, - 'new_password2': self.password, - 'old_password': self.password, - }) + jwt_token = response.data.get("access") + self.client.credentials(HTTP_AUTHORIZATION=f"JWT {jwt_token}") + response = self.client.put( + "/api/v1/auth/change-password/", + { + "new_password": self.password, + "new_password2": self.password, + "old_password": self.password, + }, + ) assert response.status_code == status.HTTP_400_BAD_REQUEST diff --git a/users/tests/test_login.py b/users/tests/test_login.py index 21a6341..f38d3eb 100644 --- a/users/tests/test_login.py +++ b/users/tests/test_login.py @@ -7,73 +7,94 @@ User = get_user_model() class TestLogin(APITestCase): def setUp(self) -> None: - self.password = 'theonering' + self.password = "theonering" self.user = User.objects.create( - username='sauron', - email='sauron@mordor.middleearth', + username="sauron", + email="sauron@mordor.middleearth", ) self.user.set_password(self.password) self.user.save() def test_login(self): - response = self.client.post('/api/v1/auth/login/', { - 'username': self.user.username, - 'password': self.password, - }) + response = self.client.post( + "/api/v1/auth/login/", + { + "username": self.user.username, + "password": self.password, + }, + ) assert response.status_code == status.HTTP_200_OK - assert response.data.get('access') is not None - assert response.data.get('refresh') is not None + assert response.data.get("access") is not None + assert response.data.get("refresh") is not None def test_login_then_verify(self): - response = self.client.post('/api/v1/auth/login/', { - 'username': self.user.username, - 'password': self.password, - }) + response = self.client.post( + "/api/v1/auth/login/", + { + "username": self.user.username, + "password": self.password, + }, + ) assert response.status_code == status.HTTP_200_OK - jwt_token = response.data.get('access') - response = self.client.post('/api/v1/auth/verify/', { - 'token': jwt_token, - }) + jwt_token = response.data.get("access") + response = self.client.post( + "/api/v1/auth/verify/", + { + "token": jwt_token, + }, + ) assert response.status_code == status.HTTP_200_OK def test_login_then_refresh(self): - response = self.client.post('/api/v1/auth/login/', { - 'username': self.user.username, - 'password': self.password, - }) + response = self.client.post( + "/api/v1/auth/login/", + { + "username": self.user.username, + "password": self.password, + }, + ) assert response.status_code == status.HTTP_200_OK - jwt_token = response.data.get('refresh') - response = self.client.post('/api/v1/auth/refresh/', { - 'refresh': jwt_token, - }) + jwt_token = response.data.get("refresh") + response = self.client.post( + "/api/v1/auth/refresh/", + { + "refresh": jwt_token, + }, + ) assert response.status_code == status.HTTP_200_OK - assert response.data.get('access') is not None - assert response.data.get('access') != jwt_token + assert response.data.get("access") is not None + assert response.data.get("access") != jwt_token def test_login_then_get_user_info(self): - response = self.client.post('/api/v1/auth/login/', { - 'username': self.user.username, - 'password': self.password, - }) + response = self.client.post( + "/api/v1/auth/login/", + { + "username": self.user.username, + "password": self.password, + }, + ) assert response.status_code == status.HTTP_200_OK - jwt_token = response.data.get('access') - self.client.credentials(HTTP_AUTHORIZATION=f'JWT {jwt_token}') - response = self.client.get('/api/v1/auth/me/') + jwt_token = response.data.get("access") + self.client.credentials(HTTP_AUTHORIZATION=f"JWT {jwt_token}") + response = self.client.get("/api/v1/auth/me/") assert response.status_code == status.HTTP_200_OK - assert response.data.get('email') == self.user.email + assert response.data.get("email") == self.user.email def test_login_failed(self): - response = self.client.post('/api/v1/auth/login/', { - 'username': self.user.username, - 'password': 'wrongpassword', - }) + response = self.client.post( + "/api/v1/auth/login/", + { + "username": self.user.username, + "password": "wrongpassword", + }, + ) assert response.status_code == status.HTTP_401_UNAUTHORIZED diff --git a/users/tests/test_users_model.py b/users/tests/test_users_model.py index fe7ee38..3de1334 100644 --- a/users/tests/test_users_model.py +++ b/users/tests/test_users_model.py @@ -11,27 +11,23 @@ User = get_user_model() class TestUsers(TestCase): def test_create_user(self): - User.objects.create_user({ - 'username': 'user 1', - 'password': 'password1' - }) + User.objects.create_user({"username": "user 1", "password": "password1"}) User.objects.all().count() == 1 def test_new_user_invalid_username(self): """Test creating user with no username raises error""" with pytest.raises(ValueError): - User.objects.create_user(None, 'test123') + User.objects.create_user(None, "test123") def test_create_new_superuser(self): """Test creating a new superuser""" # Creation with standard method user = User.objects.create_superuser( - 'testsuperuser@adminemail.com', - 'testadmin123' + "testsuperuser@adminemail.com", "testadmin123" ) assert user.is_superuser assert user.is_staff def test_create_group(self): - Group.objects.create(name='Group1') + Group.objects.create(name="Group1") assert Group.objects.count() == 1