82 lines
2.3 KiB
Python
82 lines
2.3 KiB
Python
from django.contrib.auth.models import AbstractUser
|
||
from django.db import models
|
||
from django.utils import timezone
|
||
import random
|
||
import string
|
||
|
||
|
||
class VerificationCode(models.Model):
|
||
"""邮箱验证码模型"""
|
||
email = models.EmailField()
|
||
code = models.CharField(max_length=6)
|
||
created_at = models.DateTimeField(auto_now_add=True)
|
||
is_verified = models.BooleanField(default=False)
|
||
attempts = models.IntegerField(default=0)
|
||
locked_until = models.DateTimeField(null=True, blank=True)
|
||
|
||
class Meta:
|
||
verbose_name = '验证码'
|
||
verbose_name_plural = '验证码'
|
||
unique_together = [['email', 'code']]
|
||
|
||
def is_valid(self):
|
||
"""检查验证码是否有效"""
|
||
if self.is_verified:
|
||
return False
|
||
if self.locked_until and timezone.now() < self.locked_until:
|
||
return False
|
||
# 检查10分钟内有效
|
||
if (timezone.now() - self.created_at).total_seconds() > 600:
|
||
return False
|
||
return True
|
||
|
||
def increment_attempts(self):
|
||
"""增加失败尝试次数,5次后锁定"""
|
||
self.attempts += 1
|
||
if self.attempts >= 5:
|
||
self.locked_until = timezone.now() + timezone.timedelta(minutes=10)
|
||
self.save()
|
||
|
||
def mark_as_verified(self):
|
||
"""标记为已使用"""
|
||
self.is_verified = True
|
||
self.save()
|
||
|
||
@staticmethod
|
||
def generate_code():
|
||
"""生成6位数字验证码"""
|
||
return ''.join(random.choices(string.digits, k=6))
|
||
|
||
|
||
class User(AbstractUser):
|
||
ROLE_CHOICES = [
|
||
('superadmin', '超级管理员'),
|
||
('admin', '公司管理员'),
|
||
('seeker', '求职者'),
|
||
]
|
||
email = models.EmailField(unique=True) # 设置邮箱为唯一且必填
|
||
role = models.CharField(max_length=20, choices=ROLE_CHOICES, default='seeker')
|
||
phone = models.CharField(max_length=20)
|
||
organization = models.ForeignKey(
|
||
'organizations.Organization',
|
||
null=True, blank=True,
|
||
on_delete=models.SET_NULL,
|
||
related_name='admins'
|
||
)
|
||
|
||
@property
|
||
def is_superadmin(self):
|
||
return self.role == 'superadmin'
|
||
|
||
@property
|
||
def is_admin(self):
|
||
return self.role == 'admin'
|
||
|
||
@property
|
||
def is_seeker(self):
|
||
return self.role == 'seeker'
|
||
|
||
class Meta:
|
||
verbose_name = '用户'
|
||
verbose_name_plural = '用户'
|