66 @date:2025/4/14 19:18
77 @desc:
88"""
9- from rest_framework import serializers
9+ import re
1010
11+ from django .db import transaction
12+ from django .db .models import QuerySet , Q
13+ from rest_framework import serializers
14+ import uuid_utils .compat as uuid
15+ from common .constants .exception_code_constants import ExceptionCodeConstants
16+ from common .constants .permission_constants import RoleConstants
17+ from common .utils .common import valid_license , password_encrypt
1118from users .models import User
19+ from django .utils .translation import gettext_lazy as _
20+ from django .core import validators
1221
1322
1423class UserProfileResponse (serializers .ModelSerializer ):
15- is_edit_password = serializers .BooleanField (required = True , label = "是否修改密码" )
16- permissions = serializers .ListField (required = True , label = "权限" )
24+ is_edit_password = serializers .BooleanField (required = True , label = _ ( 'Is Edit Password' ) )
25+ permissions = serializers .ListField (required = True , label = _ ( 'permissions' ) )
1726
1827 class Meta :
1928 model = User
20- fields = ['id' , 'username' , 'email' , 'role' , 'permissions' , 'language' , 'is_edit_password' ]
29+ fields = ['id' , 'username' , 'nick_name' , 'email' , 'role' , 'permissions' , 'language' , 'is_edit_password' ]
30+
31+
32+ class CreateUserSerializer (serializers .ModelSerializer ):
33+ username = serializers .CharField (required = True , label = _ ('Username' ))
34+ password = serializers .CharField (required = True , label = _ ('Password' ))
35+ email = serializers .EmailField (required = True , label = _ ('Email' ))
36+ nick_name = serializers .CharField (required = False , label = _ ('Nick name' ))
37+ phone = serializers .CharField (required = False , label = _ ('Phone' ))
2138
2239
2340class UserProfileSerializer (serializers .Serializer ):
@@ -30,8 +47,67 @@ def profile(user: User):
3047 """
3148 return {'id' : user .id ,
3249 'username' : user .username ,
50+ 'nick_name' : user .nick_name ,
3351 'email' : user .email ,
3452 'role' : user .role ,
3553 'permissions' : [str (p ) for p in []],
3654 'is_edit_password' : user .password == 'd880e722c47a34d8e9fce789fc62389d' if user .role == 'ADMIN' else False ,
3755 'language' : user .language }
56+
57+
58+ class UserManageSerializer (serializers .Serializer ):
59+ class UserInstance (serializers .Serializer ):
60+ email = serializers .EmailField (
61+ required = True ,
62+ label = _ ("Email" ),
63+ validators = [validators .EmailValidator (message = ExceptionCodeConstants .EMAIL_FORMAT_ERROR .value .message ,
64+ code = ExceptionCodeConstants .EMAIL_FORMAT_ERROR .value .code )])
65+
66+ username = serializers .CharField (required = True ,
67+ label = _ ("Username" ),
68+ max_length = 20 ,
69+ min_length = 6 ,
70+ validators = [
71+ validators .RegexValidator (regex = re .compile ("^.{6,20}$" ),
72+ message = _ (
73+ 'Username must be 6-20 characters long' ))
74+ ])
75+ password = serializers .CharField (required = True , label = _ ("Password" ), max_length = 20 , min_length = 6 ,
76+ validators = [validators .RegexValidator (regex = re .compile (
77+ "^(?![a-zA-Z]+$)(?![A-Z0-9]+$)(?![A-Z_!@#$%^&*`~.()-+=]+$)(?![a-z0-9]+$)(?![a-z_!@#$%^&*`~()-+=]+$)"
78+ "(?![0-9_!@#$%^&*`~()-+=]+$)[a-zA-Z0-9_!@#$%^&*`~.()-+=]{6,20}$" )
79+ , message = _ (
80+ "The password must be 6-20 characters long and must be a combination of letters, numbers, and special characters." ))])
81+
82+ nick_name = serializers .CharField (required = False , label = _ ("Nick name" ), max_length = 64 ,
83+ allow_null = True , allow_blank = True )
84+ phone = serializers .CharField (required = False , label = _ ("Phone" ), max_length = 20 ,
85+ allow_null = True , allow_blank = True )
86+
87+ def is_valid (self , * , raise_exception = True ):
88+ super ().is_valid (raise_exception = True )
89+ username = self .data .get ('username' )
90+ email = self .data .get ('email' )
91+ u = QuerySet (User ).filter (Q (username = username ) | Q (email = email )).first ()
92+ if u is not None :
93+ if u .email == email :
94+ raise ExceptionCodeConstants .EMAIL_IS_EXIST .value .to_app_api_exception ()
95+ if u .username == username :
96+ raise ExceptionCodeConstants .USERNAME_IS_EXIST .value .to_app_api_exception ()
97+
98+ @valid_license (model = User , count = 2 ,
99+ message = _ (
100+ 'The community version supports up to 2 users. If you need more users, please contact us (https://fit2cloud.com/).' ))
101+ @transaction .atomic
102+ def save (self , instance , with_valid = True ):
103+ if with_valid :
104+ UserManageSerializer .UserInstance (data = instance ).is_valid (raise_exception = True )
105+
106+ user = User (id = uuid .uuid7 (), email = instance .get ('email' ),
107+ phone = "" if instance .get ('phone' ) is None else instance .get ('phone' ),
108+ nick_name = "" if instance .get ('nick_name' ) is None else instance .get ('nick_name' )
109+ , username = instance .get ('username' ), password = password_encrypt (instance .get ('password' )),
110+ role = RoleConstants .USER .name , source = "LOCAL" ,
111+ is_active = True )
112+ user .save ()
113+ return UserProfileSerializer (user ).data
0 commit comments