Files
chengshishouce/backend/apps/moderation/models.py

190 lines
6.1 KiB
Python
Raw Normal View History

from django.db import models
from django.conf import settings
from apps.regions.models import Region
class ModeratorApplication(models.Model):
"""Model for moderator applications."""
STATUS_CHOICES = [
('pending', '待审核'),
('approved', '已通过'),
('rejected', '已拒绝'),
('cancelled', '已取消'),
]
RANK_CHOICES = [
('general', '将军'),
('colonel', '校官'),
('captain', '尉官'),
('soldier', '士兵'),
]
applicant = models.ForeignKey(
settings.AUTH_USER_MODEL,
on_delete=models.CASCADE,
related_name='moderator_applications',
verbose_name='申请者'
)
region = models.ForeignKey(
Region,
on_delete=models.CASCADE,
related_name='moderator_applications',
verbose_name='申请的版块'
)
support_count = models.IntegerField(default=0, verbose_name='支持人数')
deadline = models.DateTimeField(verbose_name='截止时间')
status = models.CharField(max_length=20, choices=STATUS_CHOICES, default='pending', verbose_name='状态')
rank = models.CharField(max_length=20, choices=RANK_CHOICES, verbose_name='军衔级别')
reviewed_by = models.ForeignKey(
settings.AUTH_USER_MODEL,
on_delete=models.SET_NULL,
null=True,
blank=True,
related_name='reviewed_applications',
verbose_name='审核人'
)
reviewed_at = models.DateTimeField(null=True, blank=True, verbose_name='审核时间')
created_at = models.DateTimeField(auto_now_add=True, verbose_name='申请时间')
class Meta:
db_table = 'moderator_applications'
verbose_name = '版主申请'
verbose_name_plural = '版主申请'
ordering = ['-created_at']
def __str__(self):
return f'{self.applicant.username} - {self.region.name} ({self.get_status_display()})'
def is_expired(self):
"""Check if the application has expired."""
from django.utils import timezone
return timezone.now() > self.deadline
def has_enough_support(self):
"""Check if the application has enough support."""
# TODO: Define minimum support count
return self.support_count >= 10
class ModeratorPermission(models.Model):
"""Model for moderator permissions."""
PERMISSION_STATUS_CHOICES = [
('active', '正常'),
('restricted', '限制'),
('revoked', '取消'),
]
RANK_CHOICES = [
('general', '将军'),
('colonel', '校官'),
('captain', '尉官'),
('soldier', '士兵'),
]
moderator = models.ForeignKey(
settings.AUTH_USER_MODEL,
on_delete=models.CASCADE,
related_name='moderator_permissions',
verbose_name='版主'
)
region = models.ForeignKey(
Region,
on_delete=models.CASCADE,
related_name='moderator_permissions',
verbose_name='管辖版块'
)
rank = models.CharField(max_length=20, choices=RANK_CHOICES, verbose_name='军衔级别')
status = models.CharField(
max_length=20,
choices=PERMISSION_STATUS_CHOICES,
default='active',
verbose_name='权限状态'
)
created_at = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
restricted_until = models.DateTimeField(null=True, blank=True, verbose_name='限制结束时间')
class Meta:
db_table = 'moderator_permissions'
verbose_name = '版主权限'
verbose_name_plural = '版主权限'
ordering = ['-created_at']
def __str__(self):
return f'{self.moderator.username} - {self.region.name} ({self.get_status_display()})'
def is_active(self):
"""Check if the permission is currently active."""
from django.utils import timezone
if self.status != 'active':
return False
if self.restricted_until and timezone.now() < self.restricted_until:
return False
return True
class ModeratorSupport(models.Model):
"""Model for moderator application supports."""
supporter = models.ForeignKey(
settings.AUTH_USER_MODEL,
on_delete=models.CASCADE,
related_name='supported_applications',
verbose_name='支持者'
)
application = models.ForeignKey(
ModeratorApplication,
on_delete=models.CASCADE,
related_name='supports',
verbose_name='版主申请'
)
created_at = models.DateTimeField(auto_now_add=True, verbose_name='支持时间')
class Meta:
db_table = 'moderator_supports'
verbose_name = '版主支持'
verbose_name_plural = '版主支持'
unique_together = ['supporter', 'application']
def __str__(self):
return f'{self.supporter.username} supports {self.application.region.name}'
class PermissionRestriction(models.Model):
"""Model for permission restrictions."""
RESTRICTION_TYPE_CHOICES = [
('partial', '部分限制'),
('full', '完全限制'),
]
operator = models.ForeignKey(
settings.AUTH_USER_MODEL,
on_delete=models.CASCADE,
related_name='created_restrictions',
verbose_name='操作者'
)
target_moderator = models.ForeignKey(
settings.AUTH_USER_MODEL,
on_delete=models.CASCADE,
related_name='received_restrictions',
verbose_name='被限制版主'
)
restriction_type = models.CharField(
max_length=20,
choices=RESTRICTION_TYPE_CHOICES,
verbose_name='限制类型'
)
start_time = models.DateTimeField(verbose_name='限制开始时间')
end_time = models.DateTimeField(verbose_name='限制结束时间')
created_at = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
class Meta:
db_table = 'permission_restrictions'
verbose_name = '权限限制'
verbose_name_plural = '权限限制'
ordering = ['-created_at']
def __str__(self):
return f'{self.operator.username} restricted {self.target_moderator.username} ({self.get_restriction_type_display()})'