chore: blacked

This commit is contained in:
Pablo Moreno
2024-05-13 00:42:51 +02:00
parent f3b4f3e509
commit 236fd5c37b
10 changed files with 190 additions and 134 deletions
+4 -7
View File
@@ -188,7 +188,6 @@ SIMPLE_JWT = {
"ROTATE_REFRESH_TOKENS": False, "ROTATE_REFRESH_TOKENS": False,
"BLACKLIST_AFTER_ROTATION": False, "BLACKLIST_AFTER_ROTATION": False,
"UPDATE_LAST_LOGIN": False, "UPDATE_LAST_LOGIN": False,
"ALGORITHM": "HS256", "ALGORITHM": "HS256",
"SIGNING_KEY": SECRET_KEY, "SIGNING_KEY": SECRET_KEY,
"VERIFYING_KEY": "", "VERIFYING_KEY": "",
@@ -197,23 +196,21 @@ SIMPLE_JWT = {
"JSON_ENCODER": None, "JSON_ENCODER": None,
"JWK_URL": None, "JWK_URL": None,
"LEEWAY": 0, "LEEWAY": 0,
"AUTH_HEADER_TYPES": (
"AUTH_HEADER_TYPES": ("Bearer", "JWT", ), "Bearer",
"JWT",
),
"AUTH_HEADER_NAME": "HTTP_AUTHORIZATION", "AUTH_HEADER_NAME": "HTTP_AUTHORIZATION",
"USER_ID_FIELD": "id", "USER_ID_FIELD": "id",
"USER_ID_CLAIM": "user_id", "USER_ID_CLAIM": "user_id",
"USER_AUTHENTICATION_RULE": "rest_framework_simplejwt.authentication.default_user_authentication_rule", "USER_AUTHENTICATION_RULE": "rest_framework_simplejwt.authentication.default_user_authentication_rule",
"AUTH_TOKEN_CLASSES": ("rest_framework_simplejwt.tokens.AccessToken",), "AUTH_TOKEN_CLASSES": ("rest_framework_simplejwt.tokens.AccessToken",),
"TOKEN_TYPE_CLAIM": "token_type", "TOKEN_TYPE_CLAIM": "token_type",
"TOKEN_USER_CLASS": "rest_framework_simplejwt.models.TokenUser", "TOKEN_USER_CLASS": "rest_framework_simplejwt.models.TokenUser",
"JTI_CLAIM": "jti", "JTI_CLAIM": "jti",
"SLIDING_TOKEN_REFRESH_EXP_CLAIM": "refresh_exp", "SLIDING_TOKEN_REFRESH_EXP_CLAIM": "refresh_exp",
"SLIDING_TOKEN_LIFETIME": datetime.timedelta(minutes=5), "SLIDING_TOKEN_LIFETIME": datetime.timedelta(minutes=5),
"SLIDING_TOKEN_REFRESH_LIFETIME": datetime.timedelta(days=1), "SLIDING_TOKEN_REFRESH_LIFETIME": datetime.timedelta(days=1),
"TOKEN_OBTAIN_SERIALIZER": "rest_framework_simplejwt.serializers.TokenObtainPairSerializer", "TOKEN_OBTAIN_SERIALIZER": "rest_framework_simplejwt.serializers.TokenObtainPairSerializer",
"TOKEN_REFRESH_SERIALIZER": "rest_framework_simplejwt.serializers.TokenRefreshSerializer", "TOKEN_REFRESH_SERIALIZER": "rest_framework_simplejwt.serializers.TokenRefreshSerializer",
"TOKEN_VERIFY_SERIALIZER": "rest_framework_simplejwt.serializers.TokenVerifySerializer", "TOKEN_VERIFY_SERIALIZER": "rest_framework_simplejwt.serializers.TokenVerifySerializer",
+1 -1
View File
@@ -14,5 +14,5 @@ urlpatterns = [
] ]
if settings.DEBUG: 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) urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
+2 -2
View File
@@ -6,5 +6,5 @@ from files.models import FileUpload
class FileUploadSerializer(serializers.ModelSerializer): class FileUploadSerializer(serializers.ModelSerializer):
class Meta: class Meta:
model = FileUpload model = FileUpload
fields = ('file', 'id') fields = ("file", "id")
read_only_fields = ('id', ) read_only_fields = ("id",)
+1 -1
View File
@@ -3,6 +3,6 @@ from rest_framework.routers import DefaultRouter
from files.api.v1.views import FileUploadViewSet from files.api.v1.views import FileUploadViewSet
router = DefaultRouter(trailing_slash=True) router = DefaultRouter(trailing_slash=True)
router.register('', FileUploadViewSet) router.register("", FileUploadViewSet)
urlpatterns = router.urls urlpatterns = router.urls
+35 -19
View File
@@ -2,7 +2,10 @@ from typing import List
from django.conf import settings from django.conf import settings
from django.contrib.auth import get_user_model 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 import serializers
from rest_framework.exceptions import ValidationError from rest_framework.exceptions import ValidationError
from rest_framework_simplejwt.serializers import TokenObtainPairSerializer from rest_framework_simplejwt.serializers import TokenObtainPairSerializer
@@ -10,7 +13,7 @@ from rest_framework_simplejwt.serializers import TokenObtainPairSerializer
User = get_user_model() User = get_user_model()
AUTH_PASSWORD_VALIDATORS = getattr(settings, 'AUTH_PASSWORD_VALIDATORS') AUTH_PASSWORD_VALIDATORS = getattr(settings, "AUTH_PASSWORD_VALIDATORS")
class UserSerializer(serializers.ModelSerializer): class UserSerializer(serializers.ModelSerializer):
@@ -25,15 +28,21 @@ class UserSerializer(serializers.ModelSerializer):
class Meta: class Meta:
model = User model = User
fields = ( fields = (
'username', "username",
'email', "email",
'first_name', "first_name",
'last_name', "last_name",
'is_staff', "is_staff",
'is_superuser', "is_superuser",
'permissions', "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): class UpdatePasswordSerializer(serializers.ModelSerializer):
@@ -42,32 +51,39 @@ class UpdatePasswordSerializer(serializers.ModelSerializer):
new_password2 = serializers.CharField(write_only=True) new_password2 = serializers.CharField(write_only=True)
def validate_old_password(self, password): def validate_old_password(self, password):
user = self.context.get('request').user user = self.context.get("request").user
if not user.check_password(password): if not user.check_password(password):
raise ValidationError('Wrong old password') raise ValidationError("Wrong old password")
return password return password
def validate_new_password(self, 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: 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: 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 return password
def save(self, *args, **kwargs): 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.set_password(new_password)
self.instance.save() self.instance.save()
class Meta: class Meta:
model = User model = User
fields = ('old_password', 'new_password', 'new_password2', ) fields = (
"old_password",
"new_password",
"new_password2",
)
+6 -6
View File
@@ -4,13 +4,13 @@ from users.api.v1.views import retrieve_update_me, change_password
from rest_framework_simplejwt.views import ( from rest_framework_simplejwt.views import (
token_refresh, token_refresh,
token_obtain_pair, token_obtain_pair,
token_verify token_verify,
) )
urlpatterns = [ urlpatterns = [
path('login/', token_obtain_pair, name='login'), path("login/", token_obtain_pair, name="login"),
path('refresh/', token_refresh, name='refresh_jwt'), path("refresh/", token_refresh, name="refresh_jwt"),
path('verify/', token_verify, name='verify_jwt'), path("verify/", token_verify, name="verify_jwt"),
path('me/', retrieve_update_me, name='user_info'), path("me/", retrieve_update_me, name="user_info"),
path('change-password/', change_password, name='change_password'), path("change-password/", change_password, name="change_password"),
] ]
+3 -1
View File
@@ -11,6 +11,7 @@ class RetrieveUpdateMe(RetrieveUpdateAPIView):
put: Update user info put: Update user info
""" """
serializer_class = UserSerializer serializer_class = UserSerializer
def get_object(self): def get_object(self):
@@ -21,8 +22,9 @@ class ChangePassword(UpdateAPIView):
""" """
put: Update user's password put: Update user's password
""" """
serializer_class = UpdatePasswordSerializer serializer_class = UpdatePasswordSerializer
permission_classes = (IsAuthenticated, ) permission_classes = (IsAuthenticated,)
queryset = User.objects.all() queryset = User.objects.all()
def get_object(self): def get_object(self):
+71 -47
View File
@@ -7,79 +7,103 @@ User = get_user_model()
class TestChangePassword(APITestCase): class TestChangePassword(APITestCase):
def setUp(self) -> None: def setUp(self) -> None:
self.password = 'theonering' self.password = "theonering"
self.user = User.objects.create( self.user = User.objects.create(
username='sauron', username="sauron",
email='sauron@mordor.middleearth', email="sauron@mordor.middleearth",
) )
self.user.set_password(self.password) self.user.set_password(self.password)
self.user.save() self.user.save()
def test_login_then_change_password(self): def test_login_then_change_password(self):
response = self.client.post('/api/v1/auth/login/', { response = self.client.post(
'username': self.user.username, "/api/v1/auth/login/",
'password': self.password, {
}) "username": self.user.username,
"password": self.password,
},
)
assert response.status_code == status.HTTP_200_OK assert response.status_code == status.HTTP_200_OK
jwt_token = response.data.get('access') jwt_token = response.data.get("access")
self.client.credentials(HTTP_AUTHORIZATION=f'JWT {jwt_token}') self.client.credentials(HTTP_AUTHORIZATION=f"JWT {jwt_token}")
response = self.client.put('/api/v1/auth/change-password/', { response = self.client.put(
'new_password': 'barad-dur', "/api/v1/auth/change-password/",
'new_password2': 'barad-dur', {
'old_password': self.password, "new_password": "barad-dur",
}) "new_password2": "barad-dur",
"old_password": self.password,
},
)
assert response.status_code == status.HTTP_200_OK assert response.status_code == status.HTTP_200_OK
def test_login_then_change_password_with_wrong_password(self): def test_login_then_change_password_with_wrong_password(self):
response = self.client.post('/api/v1/auth/login/', { response = self.client.post(
'username': self.user.username, "/api/v1/auth/login/",
'password': self.password, {
}) "username": self.user.username,
"password": self.password,
},
)
assert response.status_code == status.HTTP_200_OK assert response.status_code == status.HTTP_200_OK
jwt_token = response.data.get('access') jwt_token = response.data.get("access")
self.client.credentials(HTTP_AUTHORIZATION=f'JWT {jwt_token}') self.client.credentials(HTTP_AUTHORIZATION=f"JWT {jwt_token}")
response = self.client.put('/api/v1/auth/change-password/', { response = self.client.put(
'new_password': 'barad-dur', "/api/v1/auth/change-password/",
'new_password2': 'barad-dur', {
'old_password': 'incorrectoldpassword', "new_password": "barad-dur",
}) "new_password2": "barad-dur",
"old_password": "incorrectoldpassword",
},
)
assert response.status_code == status.HTTP_400_BAD_REQUEST assert response.status_code == status.HTTP_400_BAD_REQUEST
def test_login_then_change_password_mismatch_password(self): def test_login_then_change_password_mismatch_password(self):
response = self.client.post('/api/v1/auth/login/', { response = self.client.post(
'username': self.user.username, "/api/v1/auth/login/",
'password': self.password, {
}) "username": self.user.username,
"password": self.password,
},
)
assert response.status_code == status.HTTP_200_OK assert response.status_code == status.HTTP_200_OK
jwt_token = response.data.get('access') jwt_token = response.data.get("access")
self.client.credentials(HTTP_AUTHORIZATION=f'JWT {jwt_token}') self.client.credentials(HTTP_AUTHORIZATION=f"JWT {jwt_token}")
response = self.client.put('/api/v1/auth/change-password/', { response = self.client.put(
'new_password': 'barad-dur', "/api/v1/auth/change-password/",
'new_password2': 'mountdoom', {
'old_password': self.password, "new_password": "barad-dur",
}) "new_password2": "mountdoom",
"old_password": self.password,
},
)
assert response.status_code == status.HTTP_400_BAD_REQUEST assert response.status_code == status.HTTP_400_BAD_REQUEST
def test_login_then_change_password_but_its_the_same(self): def test_login_then_change_password_but_its_the_same(self):
response = self.client.post('/api/v1/auth/login/', { response = self.client.post(
'username': self.user.username, "/api/v1/auth/login/",
'password': self.password, {
}) "username": self.user.username,
"password": self.password,
},
)
assert response.status_code == status.HTTP_200_OK assert response.status_code == status.HTTP_200_OK
jwt_token = response.data.get('access') jwt_token = response.data.get("access")
self.client.credentials(HTTP_AUTHORIZATION=f'JWT {jwt_token}') self.client.credentials(HTTP_AUTHORIZATION=f"JWT {jwt_token}")
response = self.client.put('/api/v1/auth/change-password/', { response = self.client.put(
'new_password': self.password, "/api/v1/auth/change-password/",
'new_password2': self.password, {
'old_password': self.password, "new_password": self.password,
}) "new_password2": self.password,
"old_password": self.password,
},
)
assert response.status_code == status.HTTP_400_BAD_REQUEST assert response.status_code == status.HTTP_400_BAD_REQUEST
+60 -39
View File
@@ -7,73 +7,94 @@ User = get_user_model()
class TestLogin(APITestCase): class TestLogin(APITestCase):
def setUp(self) -> None: def setUp(self) -> None:
self.password = 'theonering' self.password = "theonering"
self.user = User.objects.create( self.user = User.objects.create(
username='sauron', username="sauron",
email='sauron@mordor.middleearth', email="sauron@mordor.middleearth",
) )
self.user.set_password(self.password) self.user.set_password(self.password)
self.user.save() self.user.save()
def test_login(self): def test_login(self):
response = self.client.post('/api/v1/auth/login/', { response = self.client.post(
'username': self.user.username, "/api/v1/auth/login/",
'password': self.password, {
}) "username": self.user.username,
"password": self.password,
},
)
assert response.status_code == status.HTTP_200_OK assert response.status_code == status.HTTP_200_OK
assert response.data.get('access') is not None assert response.data.get("access") is not None
assert response.data.get('refresh') is not None assert response.data.get("refresh") is not None
def test_login_then_verify(self): def test_login_then_verify(self):
response = self.client.post('/api/v1/auth/login/', { response = self.client.post(
'username': self.user.username, "/api/v1/auth/login/",
'password': self.password, {
}) "username": self.user.username,
"password": self.password,
},
)
assert response.status_code == status.HTTP_200_OK assert response.status_code == status.HTTP_200_OK
jwt_token = response.data.get('access') jwt_token = response.data.get("access")
response = self.client.post('/api/v1/auth/verify/', { response = self.client.post(
'token': jwt_token, "/api/v1/auth/verify/",
}) {
"token": jwt_token,
},
)
assert response.status_code == status.HTTP_200_OK assert response.status_code == status.HTTP_200_OK
def test_login_then_refresh(self): def test_login_then_refresh(self):
response = self.client.post('/api/v1/auth/login/', { response = self.client.post(
'username': self.user.username, "/api/v1/auth/login/",
'password': self.password, {
}) "username": self.user.username,
"password": self.password,
},
)
assert response.status_code == status.HTTP_200_OK assert response.status_code == status.HTTP_200_OK
jwt_token = response.data.get('refresh') jwt_token = response.data.get("refresh")
response = self.client.post('/api/v1/auth/refresh/', { response = self.client.post(
'refresh': jwt_token, "/api/v1/auth/refresh/",
}) {
"refresh": jwt_token,
},
)
assert response.status_code == status.HTTP_200_OK assert response.status_code == status.HTTP_200_OK
assert response.data.get('access') is not None assert response.data.get("access") is not None
assert response.data.get('access') != jwt_token assert response.data.get("access") != jwt_token
def test_login_then_get_user_info(self): def test_login_then_get_user_info(self):
response = self.client.post('/api/v1/auth/login/', { response = self.client.post(
'username': self.user.username, "/api/v1/auth/login/",
'password': self.password, {
}) "username": self.user.username,
"password": self.password,
},
)
assert response.status_code == status.HTTP_200_OK assert response.status_code == status.HTTP_200_OK
jwt_token = response.data.get('access') jwt_token = response.data.get("access")
self.client.credentials(HTTP_AUTHORIZATION=f'JWT {jwt_token}') self.client.credentials(HTTP_AUTHORIZATION=f"JWT {jwt_token}")
response = self.client.get('/api/v1/auth/me/') response = self.client.get("/api/v1/auth/me/")
assert response.status_code == status.HTTP_200_OK 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): def test_login_failed(self):
response = self.client.post('/api/v1/auth/login/', { response = self.client.post(
'username': self.user.username, "/api/v1/auth/login/",
'password': 'wrongpassword', {
}) "username": self.user.username,
"password": "wrongpassword",
},
)
assert response.status_code == status.HTTP_401_UNAUTHORIZED assert response.status_code == status.HTTP_401_UNAUTHORIZED
+4 -8
View File
@@ -11,27 +11,23 @@ User = get_user_model()
class TestUsers(TestCase): class TestUsers(TestCase):
def test_create_user(self): def test_create_user(self):
User.objects.create_user({ User.objects.create_user({"username": "user 1", "password": "password1"})
'username': 'user 1',
'password': 'password1'
})
User.objects.all().count() == 1 User.objects.all().count() == 1
def test_new_user_invalid_username(self): def test_new_user_invalid_username(self):
"""Test creating user with no username raises error""" """Test creating user with no username raises error"""
with pytest.raises(ValueError): with pytest.raises(ValueError):
User.objects.create_user(None, 'test123') User.objects.create_user(None, "test123")
def test_create_new_superuser(self): def test_create_new_superuser(self):
"""Test creating a new superuser""" """Test creating a new superuser"""
# Creation with standard method # Creation with standard method
user = User.objects.create_superuser( user = User.objects.create_superuser(
'testsuperuser@adminemail.com', "testsuperuser@adminemail.com", "testadmin123"
'testadmin123'
) )
assert user.is_superuser assert user.is_superuser
assert user.is_staff assert user.is_staff
def test_create_group(self): def test_create_group(self):
Group.objects.create(name='Group1') Group.objects.create(name="Group1")
assert Group.objects.count() == 1 assert Group.objects.count() == 1