feat: added users app

This commit is contained in:
Pablo Moreno
2024-05-13 00:26:49 +02:00
parent d148cc9c61
commit 6e987cd035
31 changed files with 521 additions and 17 deletions
View File
View File
+73
View File
@@ -0,0 +1,73 @@
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 rest_framework import serializers
from rest_framework.exceptions import ValidationError
from rest_framework_simplejwt.serializers import TokenObtainPairSerializer
User = get_user_model()
AUTH_PASSWORD_VALIDATORS = getattr(settings, 'AUTH_PASSWORD_VALIDATORS')
class UserSerializer(serializers.ModelSerializer):
permissions = serializers.SerializerMethodField()
def get_permissions(self, obj: User) -> List[str]:
group_permissions = obj.get_group_permissions()
user_permissions = obj.get_user_permissions()
return sorted(user_permissions.union(group_permissions))
class Meta:
model = User
fields = (
'username',
'email',
'first_name',
'last_name',
'is_staff',
'is_superuser',
'permissions',
)
read_only_fields = ('username', 'code', 'is_staff', 'is_superuser', 'permissions', )
class UpdatePasswordSerializer(serializers.ModelSerializer):
old_password = serializers.CharField(write_only=True)
new_password = serializers.CharField(write_only=True)
new_password2 = serializers.CharField(write_only=True)
def validate_old_password(self, password):
user = self.context.get('request').user
if not user.check_password(password):
raise ValidationError('Wrong old password')
return password
def validate_new_password(self, 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')
password2 = self.context.get('request').data.get('new_password2')
if password != password2:
raise ValidationError('Password mismatch')
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')
self.instance.set_password(new_password)
self.instance.save()
class Meta:
model = User
fields = ('old_password', 'new_password', 'new_password2', )
+16
View File
@@ -0,0 +1,16 @@
from django.urls import path
from users.api.v1.views import retrieve_update_me, change_password
from rest_framework_simplejwt.views import (
token_refresh,
token_obtain_pair,
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'),
]
+33
View File
@@ -0,0 +1,33 @@
from django.contrib.auth.models import User
from rest_framework.generics import RetrieveUpdateAPIView, UpdateAPIView
from rest_framework.permissions import IsAuthenticated
from users.api.v1.serializers import UserSerializer, UpdatePasswordSerializer
class RetrieveUpdateMe(RetrieveUpdateAPIView):
"""
get: Return user info
put: Update user info
"""
serializer_class = UserSerializer
def get_object(self):
return self.request.user
class ChangePassword(UpdateAPIView):
"""
put: Update user's password
"""
serializer_class = UpdatePasswordSerializer
permission_classes = (IsAuthenticated, )
queryset = User.objects.all()
def get_object(self):
return self.request.user
retrieve_update_me = RetrieveUpdateMe.as_view()
change_password = ChangePassword.as_view()