Skip to content
Snippets Groups Projects
Commit b3432aed authored by Timothee P's avatar Timothee P :sunflower:
Browse files

feat(signup): création d'un utilisateur avec ajout dans groupe d'utilisateurs

parent e3debda1
No related branches found
No related tags found
1 merge request!532REDMINE_ISSUE-25582 | Mise en place d’un système de vérification lors de la création d’un compte utilisateur
Pipeline #40966 passed
......@@ -28,6 +28,7 @@ from .project import ProjectDetailedSerializer
from .project import ProjectCreationSerializer
from .project import ProjectAuthorizationSerializer
from .project import ProjectAttributeSerializer
from .user import UserCreateSerializer
from .user import UsersGroupsSerializer
from .user import UserLevelsPermissionSerializer
from .user import GeneratedTokenSerializer
......@@ -65,6 +66,7 @@ __all__ = [
'ProjectAttributeSerializer',
'StackedEventSerializer',
'UserSerializer',
'UserCreateSerializer',
'UsersGroupsSerializer',
'UserLevelsPermissionSerializer',
]
......@@ -4,6 +4,7 @@ from rest_framework import serializers
from geocontrib.models import Authorization
from geocontrib.models import UsersGroup
from geocontrib.models import UserGroupMembership
from geocontrib.models import UserLevelPermission
from geocontrib.models import GeneratedToken
......@@ -34,6 +35,36 @@ class UserSerializer(serializers.ModelSerializer):
'id',
]
class UserCreateSerializer(serializers.ModelSerializer):
password = serializers.CharField(write_only=True, required=True, style={'input_type': 'password'})
usersgroups = serializers.ListField(
child=serializers.CharField(), required=False, write_only=True
)
class Meta:
model = User
fields = ['username', 'first_name', 'last_name', 'email', 'password', 'usersgroups']
def create(self, validated_data):
usersgroups_data = validated_data.pop('usersgroups', []) # Récupère et supprime `usersgroups`
# Création de l'utilisateur
user = User.objects.create_user(
username=validated_data['username'],
first_name=validated_data.get('first_name', ''),
last_name=validated_data.get('last_name', ''),
email=validated_data.get('email', ''),
password=validated_data['password']
)
# Ajout de l'utilisateur aux groupes s'ils existent
for group_codename in usersgroups_data:
group = UsersGroup.objects.filter(codename=group_codename).first()
if group:
UserGroupMembership.objects.create(user=user, group=group)
return user
class UserLevelPermissionSerializer(serializers.ModelSerializer):
class Meta:
......
......@@ -9,10 +9,12 @@ from rest_framework import mixins
from rest_framework import views
from rest_framework import viewsets
from rest_framework import permissions
from rest_framework import status
from rest_framework.generics import ListAPIView
from rest_framework.response import Response
from api.serializers import UserSerializer
from api.serializers import UserCreateSerializer
from api.serializers import UsersGroupsSerializer
from api.serializers import UserLevelsPermissionSerializer
from api.serializers import GeneratedTokenSerializer
......@@ -288,7 +290,11 @@ class LoginByTokenView(views.APIView):
class UserViewSet(viewsets.ModelViewSet):
queryset = User.objects.all().order_by('-date_joined')
serializer_class = UserSerializer
permission_classes = [permissions.IsAuthenticated]
def get_permissions(self):
if self.action == 'create': # Permettre l'accès à tout le monde pour la création
return [permissions.AllowAny()]
return [permissions.IsAuthenticated()] # Authentification requise pour les autres actions
@swagger_auto_schema(
tags=["users"],
......@@ -306,10 +312,22 @@ class UserViewSet(viewsets.ModelViewSet):
@swagger_auto_schema(
tags=["users"],
operation_summary="Create a new user"
operation_summary="Create a new user",
request_body=UserCreateSerializer
)
def create(self, request, *args, **kwargs):
return super().create(request, *args, **kwargs)
serializer = UserCreateSerializer(data=request.data)
if serializer.is_valid():
user = serializer.save()
return Response({
"message": "User created successfully",
"user_id": user.id,
"username": user.username,
"first_name": user.first_name,
"last_name": user.last_name,
"email": user.email
}, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
@swagger_auto_schema(
tags=["users"],
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment