You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
181 lines
7.2 KiB
181 lines
7.2 KiB
#lsx 评论模型定义
|
|
|
|
from django.db import models
|
|
from django.contrib.auth import get_user_model
|
|
from django.urls import reverse
|
|
from django.utils import timezone
|
|
from django.utils.translation import gettext_lazy as _
|
|
|
|
#lsx 评论模型,用于存储用户对文章的评论
|
|
class Comment(models.Model):
|
|
#lsx 评论状态:待审核和已启用
|
|
STATUS = (('n', _('Pending')), ('p', _('Published')))
|
|
#lsx 评论正文
|
|
body = models.TextField(_('comment content'), max_length=2000)
|
|
#lsx 评论者邮箱(未登录用户)
|
|
email = models.EmailField(_('email address'), max_length=100, blank=True, null=True)
|
|
#lsx 评论者用户名(未登录用户)
|
|
name = models.CharField(_('name'), max_length=50, blank=True, null=True)
|
|
#lsx 评论者网址(未登录用户)
|
|
url = models.URLField(_('url'), blank=True, null=True, max_length=100)
|
|
#lsx 评论状态
|
|
status = models.CharField(
|
|
_('status'), max_length=1, choices=STATUS, default='n')
|
|
#lsx 评论时间
|
|
create_time = models.DateTimeField(_('create time'), default=timezone.now)
|
|
#lsx 是否启用
|
|
is_enable = models.BooleanField(_('is enable'), default=False)
|
|
#lsx 评论所属文章
|
|
article = models.ForeignKey(
|
|
'blog.Article', verbose_name=_('article'), on_delete=models.CASCADE)
|
|
#lsx 评论作者(外键关联用户)
|
|
author = models.ForeignKey(
|
|
get_user_model(),
|
|
verbose_name=_('author'),
|
|
blank=True,
|
|
null=True,
|
|
on_delete=models.CASCADE)
|
|
#lsx 父评论(用于回复功能)
|
|
parent_comment = models.ForeignKey(
|
|
'self',
|
|
verbose_name=_('parent comment'),
|
|
blank=True,
|
|
null=True,
|
|
on_delete=models.CASCADE)
|
|
|
|
#lsx 返回评论内容的前20个字符作为对象的字符串表示
|
|
def __str__(self):
|
|
return self.body[:20]
|
|
|
|
class Meta:
|
|
ordering = ['create_time'] #lsx 按创建时间排序
|
|
verbose_name = _('comment') #lsx 在管理后台显示的名称
|
|
verbose_name_plural = _('comments') #lsx 复数形式
|
|
|
|
#lsx 获取评论的绝对URL
|
|
def get_absolute_url(self):
|
|
return reverse('blog:article_detail', kwargs={'article_id': self.article_id})
|
|
|
|
#lsx 获取评论在管理后台的编辑URL
|
|
def get_admin_url(self):
|
|
return reverse('admin:comments_comment_change', kwargs={'object_id': self.id})
|
|
|
|
#lsx 保存评论时的逻辑处理
|
|
def save(self, *args, **kwargs):
|
|
super().save(*args, **kwargs)
|
|
#lsx 如果是回复评论,自动设置为已启用
|
|
if self.parent_comment:
|
|
self.is_enable = True
|
|
super().save(*args, **kwargs)
|
|
|
|
#lsx 回复评论模型(备选方案,目前使用自关联方式实现回复)
|
|
class Reply(models.Model):
|
|
#lsx 回复内容
|
|
content = models.TextField(_('reply content'), max_length=1000)
|
|
#lsx 回复时间
|
|
create_time = models.DateTimeField(_('create time'), default=timezone.now)
|
|
#lsx 回复所属评论
|
|
comment = models.ForeignKey(Comment, verbose_name=_('comment'), on_delete=models.CASCADE)
|
|
#lsx 回复作者
|
|
author = models.ForeignKey(
|
|
get_user_model(), verbose_name=_('author'), on_delete=models.CASCADE)
|
|
|
|
#lsx 返回回复内容的前20个字符作为对象的字符串表示
|
|
def __str__(self):
|
|
return self.content[:20]
|
|
|
|
class Meta:
|
|
ordering = ['create_time'] #lsx 按创建时间排序
|
|
verbose_name = _('reply') #lsx 在管理后台显示的名称
|
|
verbose_name_plural = _('replies') #lsx 复数形式
|
|
|
|
#lsx 评论配置模型(可选,用于存储评论相关设置)
|
|
class CommentConfig(models.Model):
|
|
#lsx 是否开启评论功能
|
|
is_open = models.BooleanField(_('is open'), default=True)
|
|
#lsx 是否需要审核
|
|
need_review = models.BooleanField(_('need review'), default=True)
|
|
#lsx 配置更新时间
|
|
update_time = models.DateTimeField(_('update time'), default=timezone.now)
|
|
|
|
#lsx 返回配置标识
|
|
def __str__(self):
|
|
return 'Comment Configuration'
|
|
|
|
class Meta:
|
|
verbose_name = _('comment configuration') #lsx 在管理后台显示的名称
|
|
verbose_name_plural = verbose_name #lsx 复数形式
|
|
|
|
#lsx 保存配置时更新时间
|
|
def save(self, *args, **kwargs):
|
|
self.update_time = timezone.now()
|
|
super().save(*args, **kwargs)
|
|
|
|
#lsx 评论统计模型(可选,用于统计评论数据)
|
|
class CommentStats(models.Model):
|
|
#lsx 文章ID
|
|
article_id = models.IntegerField(_('article id'), unique=True)
|
|
#lsx 评论总数
|
|
comment_count = models.IntegerField(_('comment count'), default=0)
|
|
#lsx 已启用评论数
|
|
enabled_count = models.IntegerField(_('enabled count'), default=0)
|
|
#lsx 最后评论时间
|
|
last_comment_time = models.DateTimeField(_('last comment time'), null=True, blank=True)
|
|
|
|
#lsx 返回文章ID和评论数
|
|
def __str__(self):
|
|
return f'Article {self.article_id}: {self.comment_count} comments'
|
|
|
|
class Meta:
|
|
ordering = ['-comment_count'] #lsx 按评论数倒序排序
|
|
verbose_name = _('comment statistics') #lsx 在管理后台显示的名称
|
|
verbose_name_plural = verbose_name #lsx 复数形式
|
|
|
|
#lsx 评论通知模型(可选,用于通知功能)
|
|
class CommentNotification(models.Model):
|
|
#lsx 通知类型:评论、回复
|
|
TYPE = (('c', _('Comment')), ('r', _('Reply')))
|
|
#lsx 通知状态:未读、已读
|
|
STATUS = (('u', _('Unread')), ('r', _('Read')))
|
|
#lsx 通知类型
|
|
notification_type = models.CharField(
|
|
_('notification type'), max_length=1, choices=TYPE, default='c')
|
|
#lsx 通知状态
|
|
status = models.CharField(
|
|
_('status'), max_length=1, choices=STATUS, default='u')
|
|
#lsx 通知时间
|
|
create_time = models.DateTimeField(_('create time'), default=timezone.now)
|
|
#lsx 相关评论
|
|
comment = models.ForeignKey(Comment, verbose_name=_('comment'), on_delete=models.CASCADE)
|
|
#lsx 接收通知的用户
|
|
recipient = models.ForeignKey(
|
|
get_user_model(), verbose_name=_('recipient'), on_delete=models.CASCADE)
|
|
|
|
#lsx 返回通知信息
|
|
def __str__(self):
|
|
return f'Notification for {self.recipient}: {self.comment.body[:20]}'
|
|
|
|
class Meta:
|
|
ordering = ['-create_time'] #lsx 按创建时间倒序排序
|
|
verbose_name = _('comment notification') #lsx 在管理后台显示的名称
|
|
verbose_name_plural = verbose_name #lsx 复数形式
|
|
|
|
#lsx 评论点赞模型(可选,用于点赞功能)
|
|
class CommentLike(models.Model):
|
|
#lsx 点赞时间
|
|
create_time = models.DateTimeField(_('create time'), default=timezone.now)
|
|
#lsx 点赞的评论
|
|
comment = models.ForeignKey(Comment, verbose_name=_('comment'), on_delete=models.CASCADE)
|
|
#lsx 点赞的用户
|
|
user = models.ForeignKey(
|
|
get_user_model(), verbose_name=_('user'), on_delete=models.CASCADE)
|
|
|
|
#lsx 返回点赞信息
|
|
def __str__(self):
|
|
return f'{self.user} likes comment {self.comment.id}'
|
|
|
|
class Meta:
|
|
unique_together = ('comment', 'user') #lsx 一个用户只能给一个评论点赞一次
|
|
verbose_name = _('comment like') #lsx 在管理后台显示的名称
|
|
verbose_name_plural = verbose_name #lsx 复数形式
|