mirror of
https://github.com/1Panel-dev/MaxKB.git
synced 2025-12-30 01:32:49 +00:00
114 lines
5.5 KiB
Python
114 lines
5.5 KiB
Python
# coding=utf-8
|
||
"""
|
||
@project: MaxKB
|
||
@Author:虎虎
|
||
@file: user.py
|
||
@date:2025/4/14 19:18
|
||
@desc:
|
||
"""
|
||
import re
|
||
|
||
from django.db import transaction
|
||
from django.db.models import QuerySet, Q
|
||
from rest_framework import serializers
|
||
import uuid_utils.compat as uuid
|
||
from common.constants.exception_code_constants import ExceptionCodeConstants
|
||
from common.constants.permission_constants import RoleConstants
|
||
from common.utils.common import valid_license, password_encrypt
|
||
from users.models import User
|
||
from django.utils.translation import gettext_lazy as _
|
||
from django.core import validators
|
||
|
||
|
||
class UserProfileResponse(serializers.ModelSerializer):
|
||
is_edit_password = serializers.BooleanField(required=True, label=_('Is Edit Password'))
|
||
permissions = serializers.ListField(required=True, label=_('permissions'))
|
||
|
||
class Meta:
|
||
model = User
|
||
fields = ['id', 'username', 'nick_name', 'email', 'role', 'permissions', 'language', 'is_edit_password']
|
||
|
||
|
||
class CreateUserSerializer(serializers.ModelSerializer):
|
||
username = serializers.CharField(required=True, label=_('Username'))
|
||
password = serializers.CharField(required=True, label=_('Password'))
|
||
email = serializers.EmailField(required=True, label=_('Email'))
|
||
nick_name = serializers.CharField(required=False, label=_('Nick name'))
|
||
phone = serializers.CharField(required=False, label=_('Phone'))
|
||
|
||
|
||
class UserProfileSerializer(serializers.Serializer):
|
||
@staticmethod
|
||
def profile(user: User):
|
||
"""
|
||
获取用户详情
|
||
:param user: 用户对象
|
||
:return:
|
||
"""
|
||
return {'id': user.id,
|
||
'username': user.username,
|
||
'nick_name': user.nick_name,
|
||
'email': user.email,
|
||
'role': user.role,
|
||
'permissions': [str(p) for p in []],
|
||
'is_edit_password': user.password == 'd880e722c47a34d8e9fce789fc62389d' if user.role == 'ADMIN' else False,
|
||
'language': user.language}
|
||
|
||
|
||
class UserManageSerializer(serializers.Serializer):
|
||
class UserInstance(serializers.Serializer):
|
||
email = serializers.EmailField(
|
||
required=True,
|
||
label=_("Email"),
|
||
validators=[validators.EmailValidator(message=ExceptionCodeConstants.EMAIL_FORMAT_ERROR.value.message,
|
||
code=ExceptionCodeConstants.EMAIL_FORMAT_ERROR.value.code)])
|
||
|
||
username = serializers.CharField(required=True,
|
||
label=_("Username"),
|
||
max_length=20,
|
||
min_length=6,
|
||
validators=[
|
||
validators.RegexValidator(regex=re.compile("^.{6,20}$"),
|
||
message=_(
|
||
'Username must be 6-20 characters long'))
|
||
])
|
||
password = serializers.CharField(required=True, label=_("Password"), max_length=20, min_length=6,
|
||
validators=[validators.RegexValidator(regex=re.compile(
|
||
"^(?![a-zA-Z]+$)(?![A-Z0-9]+$)(?![A-Z_!@#$%^&*`~.()-+=]+$)(?![a-z0-9]+$)(?![a-z_!@#$%^&*`~()-+=]+$)"
|
||
"(?![0-9_!@#$%^&*`~()-+=]+$)[a-zA-Z0-9_!@#$%^&*`~.()-+=]{6,20}$")
|
||
, message=_(
|
||
"The password must be 6-20 characters long and must be a combination of letters, numbers, and special characters."))])
|
||
|
||
nick_name = serializers.CharField(required=False, label=_("Nick name"), max_length=64,
|
||
allow_null=True, allow_blank=True)
|
||
phone = serializers.CharField(required=False, label=_("Phone"), max_length=20,
|
||
allow_null=True, allow_blank=True)
|
||
|
||
def is_valid(self, *, raise_exception=True):
|
||
super().is_valid(raise_exception=True)
|
||
username = self.data.get('username')
|
||
email = self.data.get('email')
|
||
u = QuerySet(User).filter(Q(username=username) | Q(email=email)).first()
|
||
if u is not None:
|
||
if u.email == email:
|
||
raise ExceptionCodeConstants.EMAIL_IS_EXIST.value.to_app_api_exception()
|
||
if u.username == username:
|
||
raise ExceptionCodeConstants.USERNAME_IS_EXIST.value.to_app_api_exception()
|
||
|
||
@valid_license(model=User, count=2,
|
||
message=_(
|
||
'The community version supports up to 2 users. If you need more users, please contact us (https://fit2cloud.com/).'))
|
||
@transaction.atomic
|
||
def save(self, instance, with_valid=True):
|
||
if with_valid:
|
||
UserManageSerializer.UserInstance(data=instance).is_valid(raise_exception=True)
|
||
|
||
user = User(id=uuid.uuid7(), email=instance.get('email'),
|
||
phone="" if instance.get('phone') is None else instance.get('phone'),
|
||
nick_name="" if instance.get('nick_name') is None else instance.get('nick_name')
|
||
, username=instance.get('username'), password=password_encrypt(instance.get('password')),
|
||
role=RoleConstants.USER.name, source="LOCAL",
|
||
is_active=True)
|
||
user.save()
|
||
return UserProfileSerializer(user).data
|