from django.db import models from django_ckeditor_5.fields import CKEditor5Field from base.models import MainMenu from common.base import BaseEntity from users.models import User, Department # Create your models here. class Article(BaseEntity): title = models.CharField("标题", max_length=200) section = models.ForeignKey(MainMenu, on_delete=models.SET_NULL, null=True, blank=True, verbose_name="所属板块") author = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, verbose_name="作者") content = CKEditor5Field("正文") # 需安装 django-ckeditor cover = models.ImageField("封面图", upload_to='articles/%Y/%m/%d/', blank=True) # 标记是否为投稿(决定是否需要审核) is_contribution = models.BooleanField("是否投稿", default=False) is_published = models.BooleanField("已发布", default=True) class Meta: verbose_name = "文章" verbose_name_plural = "文章管理" def __str__(self): return self.title # --- 新增:附件模型 --- class ArticleAttachment(BaseEntity): # 关联文章:related_name='attachments' 允许我们通过 article.attachments.all() 访问 article = models.ForeignKey( Article, on_delete=models.CASCADE, related_name='attachments', verbose_name="所属文章" ) file = models.FileField("附件文件", upload_to='articles/attachments/%Y/%m/%d/') class Meta: verbose_name = "文章附件" verbose_name_plural = "文章附件管理" def __str__(self): return f"{self.article.title} - {self.file.name}" class Carousel(BaseEntity): title = models.CharField("轮播标题", max_length=100) image = models.ImageField("图片", upload_to='carousel/%Y/%m/%d/') link_url = models.URLField("跳转链接", blank=True) order = models.IntegerField("排序", default=0) active = models.BooleanField("启用", default=True) class Meta: verbose_name = "轮播图" verbose_name_plural = "轮播管理" class Notice(BaseEntity): title = models.CharField("通知标题", max_length=200) content = CKEditor5Field("通知内容") publisher = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, verbose_name="发布人") target_departments = models.ManyToManyField(Department, blank=True, verbose_name="接收部门") # 可指定发给哪些部门 require_sign = models.BooleanField("是否需要签收", default=False) is_published = models.BooleanField("已发布", default=True) created_at = models.DateTimeField("发布时间", auto_now_add=True) updated_at = models.DateTimeField("更新时间", auto_now=True) class Meta: verbose_name = "通知" verbose_name_plural = "通知管理" def __str__(self): return self.title class NoticeReceipt(BaseEntity): """签收记录""" notice = models.ForeignKey(Notice, on_delete=models.CASCADE, related_name='receipts') user = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name="签收人") signed_at = models.DateTimeField("签收时间", auto_now_add=True) class Meta: unique_together = ('notice', 'user') # 防止重复签收 verbose_name = "签收记录" verbose_name_plural = "签收管理" def __str__(self): return f"{self.user.cname} 已签收《{self.notice.title}》"