operations_project/apps/accounts/services/auth_service.py

104 lines
2.8 KiB
Python
Raw Normal View History

2025-05-07 18:01:48 +08:00
# apps/accounts/services/auth_service.py
from django.contrib.auth import authenticate
from django.core.exceptions import ValidationError
from django.core.validators import validate_email
from rest_framework.authtoken.models import Token
from apps.accounts.models import User
import logging
logger = logging.getLogger(__name__)
def authenticate_user(request, username, password):
"""验证用户身份"""
return authenticate(request, username=username, password=password)
def create_user(data):
"""创建用户"""
required_fields = ['username', 'password', 'email', 'role', 'name']
for field in required_fields:
if not data.get(field):
return {
"code": 400,
"message": f"缺少必填字段: {field}",
"data": None,
"status": 400
}
valid_roles = ['admin', 'leader', 'member']
if data['role'] not in valid_roles:
return {
"code": 400,
"message": f"无效的角色,必须是: {', '.join(valid_roles)}",
"data": None,
"status": 400
}
if User.objects.filter(username=data['username']).exists():
return {
"code": 400,
"message": "用户名已存在",
"data": None,
"status": 400
}
if User.objects.filter(email=data['email']).exists():
return {
"code": 400,
"message": "邮箱已被注册",
"data": None,
"status": 400
}
if len(data['password']) < 8:
return {
"code": 400,
"message": "密码长度必须至少为8位",
"data": None,
"status": 400
}
try:
validate_email(data['email'])
except ValidationError:
return {
"code": 400,
"message": "邮箱格式不正确",
"data": None,
"status": 400
}
try:
user = User.objects.create_user(
username=data['username'],
email=data['email'],
password=data['password'],
role=data['role'],
department=data.get('department'),
name=data['name'],
group=data.get('group'),
is_staff=False,
is_superuser=False
)
return user
except Exception as e:
logger.error(f"创建用户失败: {str(e)}")
return {
"code": 500,
"message": f"创建用户失败: {str(e)}",
"data": None,
"status": 500
}
def generate_token(user):
"""生成或获取用户token"""
token, _ = Token.objects.get_or_create(user=user)
return token.key
def delete_token(user):
"""删除用户token"""
try:
user.auth_token.delete()
except Token.DoesNotExist:
pass