119 lines
4.6 KiB
Python
119 lines
4.6 KiB
Python
# apps/accounts/models.py
|
|
from django.contrib.auth.models import AbstractUser
|
|
from django.db import models
|
|
from django.utils import timezone
|
|
from django.core.exceptions import ValidationError
|
|
import uuid
|
|
import logging
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
class User(AbstractUser):
|
|
"""自定义用户模型"""
|
|
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
|
|
|
|
ROLE_CHOICES = (
|
|
('admin', '管理员'),
|
|
('leader', '组长'),
|
|
('member', '组员'),
|
|
)
|
|
|
|
name = models.CharField(max_length=150, verbose_name='真实姓名', default='未设置')
|
|
role = models.CharField(max_length=20, choices=ROLE_CHOICES, verbose_name='角色', default='member')
|
|
department = models.CharField(max_length=100, verbose_name='部门', default='未分配')
|
|
group = models.CharField(max_length=100, null=True, blank=True, verbose_name='小组')
|
|
|
|
class Meta:
|
|
db_table = 'users'
|
|
verbose_name = '用户'
|
|
verbose_name_plural = '用户'
|
|
|
|
def __str__(self):
|
|
return f"{self.username}({self.name})"
|
|
|
|
def can_manage_department(self):
|
|
"""检查是否可以管理部门"""
|
|
return self.role in ['admin', 'leader']
|
|
|
|
def can_manage_knowledge_base(self, knowledge_base):
|
|
"""检查是否可以管理知识库"""
|
|
if self.role == 'admin':
|
|
return knowledge_base.type != 'private' # 管理员不能管理私人知识库
|
|
if self.role == 'leader' and self.department == knowledge_base.department:
|
|
return knowledge_base.type == 'member' # 组长只能管理本部门的成员知识库
|
|
return knowledge_base.user_id == str(self.id) # 用户可以管理自己创建的知识库
|
|
|
|
def has_access_permission(self, knowledge_base):
|
|
"""检查用户是否有权限访问知识库"""
|
|
from apps.permissions.models import Permission
|
|
|
|
# 1. 如果是私人知识库
|
|
if knowledge_base.type == 'private':
|
|
# 创建者直接允许
|
|
if str(knowledge_base.user_id) == str(self.id):
|
|
return True
|
|
# 其他人需要申请权限
|
|
return Permission.objects.filter(
|
|
resource_type='knowledge',
|
|
resource_id=str(knowledge_base.id),
|
|
applicant=self,
|
|
status='approved',
|
|
expires_at__gt=timezone.now()
|
|
).exists()
|
|
|
|
# 2. 如果是管理级知识库
|
|
if knowledge_base.type == 'admin':
|
|
# 管理员直接允许
|
|
if self.role == 'admin':
|
|
return True
|
|
# 其他人需要申请权限
|
|
return Permission.objects.filter(
|
|
resource_type='knowledge',
|
|
resource_id=str(knowledge_base.id),
|
|
applicant=self,
|
|
status='approved'
|
|
).exists()
|
|
|
|
# 3. 如果是部门级知识库
|
|
if knowledge_base.type == 'leader':
|
|
# 同部门的管理员和组长可以访问
|
|
if self.department == knowledge_base.department:
|
|
return self.role in ['admin', 'leader']
|
|
return False
|
|
|
|
# 4. 如果是成员级知识库
|
|
if knowledge_base.type == 'member':
|
|
# 同部门的所有人可以访问
|
|
return self.department == knowledge_base.department
|
|
|
|
class UserProfile(models.Model):
|
|
"""用户档案模型"""
|
|
user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='profile')
|
|
department = models.CharField(max_length=100, blank=True, help_text="部门")
|
|
group = models.CharField(max_length=100, blank=True, help_text="小组")
|
|
auto_recommend_reply = models.BooleanField(default=False, help_text="是否启用自动推荐回复功能")
|
|
|
|
class Meta:
|
|
db_table = 'user_profiles'
|
|
|
|
def __str__(self):
|
|
return f"{self.user.username}的个人资料"
|
|
|
|
class UserGoal(models.Model):
|
|
"""用户目标模型 - 存储用户设定的沟通或销售目标"""
|
|
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
|
|
user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='goals')
|
|
description = models.TextField(verbose_name='目标描述')
|
|
created_at = models.DateTimeField(auto_now_add=True)
|
|
updated_at = models.DateTimeField(auto_now=True)
|
|
is_active = models.BooleanField(default=True, verbose_name='是否激活')
|
|
|
|
class Meta:
|
|
db_table = 'user_goals'
|
|
verbose_name = '用户目标'
|
|
verbose_name_plural = '用户目标'
|
|
ordering = ['-updated_at']
|
|
|
|
def __str__(self):
|
|
return f"{self.user.username}的目标"
|