from django.db import models from django.utils import timezone class ReadingType(models.Model): """阅读记录类型""" name = models.CharField(max_length=20, unique=True, verbose_name="名称") created_at = models.DateTimeField(auto_now_add=True, verbose_name="创建时间") updated_at = models.DateTimeField(auto_now=True, verbose_name="更新时间") class Meta: verbose_name = "阅读记录类型" verbose_name_plural = "阅读记录类型" ordering = ['name'] def __str__(self): return self.name class FamilyTaskType(models.Model): """家庭事项类型""" name = models.CharField(max_length=20, unique=True, verbose_name="名称") created_at = models.DateTimeField(auto_now_add=True, verbose_name="创建时间") updated_at = models.DateTimeField(auto_now=True, verbose_name="更新时间") class Meta: verbose_name = "家庭事项类型" verbose_name_plural = "家庭事项类型" ordering = ['name'] def __str__(self): return self.name class Priority(models.Model): """优先级""" name = models.CharField(max_length=10, unique=True, verbose_name="名称") created_at = models.DateTimeField(auto_now_add=True, verbose_name="创建时间") updated_at = models.DateTimeField(auto_now=True, verbose_name="更新时间") class Meta: verbose_name = "优先级" verbose_name_plural = "优先级" ordering = ['name'] def __str__(self): return self.name class Status(models.Model): """状态""" name = models.CharField(max_length=20, unique=True, verbose_name="名称") created_at = models.DateTimeField(auto_now_add=True, verbose_name="创建时间") updated_at = models.DateTimeField(auto_now=True, verbose_name="更新时间") class Meta: verbose_name = "状态" verbose_name_plural = "状态" ordering = ['name'] def __str__(self): return self.name class PlanType(models.Model): """今日计划类型""" name = models.CharField(max_length=20, unique=True, verbose_name="名称") created_at = models.DateTimeField(auto_now_add=True, verbose_name="创建时间") updated_at = models.DateTimeField(auto_now=True, verbose_name="更新时间") class Meta: verbose_name = "今日计划类型" verbose_name_plural = "今日计划类型" ordering = ['name'] def __str__(self): return self.name class FamilyMember(models.Model): """家庭成员""" name = models.CharField(max_length=20, unique=True, verbose_name="姓名") created_at = models.DateTimeField(auto_now_add=True, verbose_name="创建时间") updated_at = models.DateTimeField(auto_now=True, verbose_name="更新时间") class Meta: verbose_name = "家庭成员" verbose_name_plural = "家庭成员" ordering = ['name'] def __str__(self): return self.name class ReadingRecord(models.Model): """阅读记录表""" date = models.DateField(default=timezone.now, verbose_name="日期") type = models.ForeignKey(ReadingType, on_delete=models.CASCADE, verbose_name="类型") title = models.CharField(max_length=200, verbose_name="标题") source = models.CharField(max_length=200, blank=True, null=True, verbose_name="来源") progress = models.CharField(max_length=100, blank=True, null=True, verbose_name="进度") note = models.TextField(blank=True, null=True, verbose_name="阅读笔记") file = models.FileField(upload_to='reading_files/', blank=True, null=True, verbose_name="上传文件") created_at = models.DateTimeField(auto_now_add=True, verbose_name="创建时间") updated_at = models.DateTimeField(auto_now=True, verbose_name="更新时间") class Meta: verbose_name = "阅读记录" verbose_name_plural = "阅读记录" ordering = ['-date', '-created_at'] def __str__(self): return f"{self.title} ({self.type.name})" class InsightRecord(models.Model): """感悟记录表""" date = models.DateField(default=timezone.now, verbose_name="日期") content = models.TextField(verbose_name="内容") speaker = models.ForeignKey(FamilyMember, on_delete=models.CASCADE, verbose_name="发言人") file = models.FileField(upload_to='insight_files/', blank=True, null=True, verbose_name="上传文件") created_at = models.DateTimeField(auto_now_add=True, verbose_name="创建时间") updated_at = models.DateTimeField(auto_now=True, verbose_name="更新时间") class Meta: verbose_name = "感悟记录" verbose_name_plural = "感悟记录" ordering = ['-date', '-created_at'] def __str__(self): return f"感悟记录 - {self.date}" class FamilyTask(models.Model): """家庭事项表""" type = models.ForeignKey(FamilyTaskType, on_delete=models.CASCADE, verbose_name="类型") content = models.TextField(verbose_name="内容") priority = models.ForeignKey(Priority, on_delete=models.CASCADE, default=2, verbose_name="优先级") status = models.ForeignKey(Status, on_delete=models.CASCADE, default=1, verbose_name="状态") deadline = models.DateField(blank=True, null=True, verbose_name="截止日期") created_at = models.DateTimeField(auto_now_add=True, verbose_name="创建时间") updated_at = models.DateTimeField(auto_now=True, verbose_name="更新时间") class Meta: verbose_name = "家庭事项" verbose_name_plural = "家庭事项" ordering = ['-priority', '-deadline', '-created_at'] def __str__(self): return f"{self.type.name} - {self.content[:20]}..." class TodayPlan(models.Model): """今日计划表""" date = models.DateField(default=timezone.now, verbose_name="日期") content = models.TextField(verbose_name="内容") speaker = models.ForeignKey(FamilyMember, on_delete=models.CASCADE, default=1, verbose_name="发言人") priority = models.ForeignKey(Priority, on_delete=models.CASCADE, default=2, verbose_name="优先级") type = models.ForeignKey(PlanType, on_delete=models.CASCADE, default=4, verbose_name="类型") status = models.ForeignKey(Status, on_delete=models.CASCADE, default=1, verbose_name="状态") created_at = models.DateTimeField(auto_now_add=True, verbose_name="创建时间") updated_at = models.DateTimeField(auto_now=True, verbose_name="更新时间") class Meta: verbose_name = "今日计划" verbose_name_plural = "今日计划" ordering = ['-priority', '-created_at'] def __str__(self): return f"{self.date} - {self.content[:20]}..." class SummaryCategory(models.Model): """汇总分类""" name = models.CharField(max_length=20, unique=True, verbose_name="名称") created_at = models.DateTimeField(auto_now_add=True, verbose_name="创建时间") updated_at = models.DateTimeField(auto_now=True, verbose_name="更新时间") class Meta: verbose_name = "汇总分类" verbose_name_plural = "汇总分类" ordering = ['name'] def __str__(self): return self.name class Summary(models.Model): """汇总记录表""" date = models.DateField(default=timezone.now, verbose_name="日期") category = models.ForeignKey(SummaryCategory, on_delete=models.CASCADE, verbose_name="分类") speaker = models.ForeignKey(FamilyMember, on_delete=models.CASCADE, verbose_name="发言人") content = models.TextField(verbose_name="内容") source = models.CharField(max_length=200, blank=True, null=True, verbose_name="来源") file = models.FileField(upload_to='summary_files/', blank=True, null=True, verbose_name="上传文件") created_at = models.DateTimeField(auto_now_add=True, verbose_name="创建时间") updated_at = models.DateTimeField(auto_now=True, verbose_name="更新时间") class Meta: verbose_name = "汇总记录" verbose_name_plural = "汇总记录" ordering = ['-date', '-created_at'] def __str__(self): return f"{self.category.name} - {self.date}" class SystemConfig(models.Model): """系统配置表""" smtp_server = models.CharField(max_length=100, blank=True, null=True, verbose_name="SMTP服务器") smtp_port = models.IntegerField(default=587, verbose_name="SMTP端口") smtp_username = models.CharField(max_length=100, blank=True, null=True, verbose_name="SMTP用户名") smtp_password = models.CharField(max_length=100, blank=True, null=True, verbose_name="SMTP密码") sender_email = models.EmailField(blank=True, null=True, verbose_name="发件人邮箱") send_time = models.TimeField(default='08:00', verbose_name="每日发送时间") recipient_email = models.EmailField(blank=True, null=True, verbose_name="收件人邮箱") created_at = models.DateTimeField(auto_now_add=True, verbose_name="创建时间") updated_at = models.DateTimeField(auto_now=True, verbose_name="更新时间") class Meta: verbose_name = "系统配置" verbose_name_plural = "系统配置" def __str__(self): return "系统配置" @classmethod def get_config(cls): """获取系统配置,单例模式""" config, created = cls.objects.get_or_create(pk=1) return config class PublicContentType(models.Model): """公开内容类型""" name = models.CharField(max_length=20, unique=True, verbose_name="名称") created_at = models.DateTimeField(auto_now_add=True, verbose_name="创建时间") updated_at = models.DateTimeField(auto_now=True, verbose_name="更新时间") class Meta: verbose_name = "公开内容类型" verbose_name_plural = "公开内容类型" ordering = ['name'] def __str__(self): return self.name class PublicContent(models.Model): """公开内容表""" type = models.ForeignKey(PublicContentType, on_delete=models.CASCADE, verbose_name="类型") title = models.CharField(max_length=200, verbose_name="标题") content = models.TextField(blank=True, null=True, verbose_name="内容") file = models.FileField(upload_to='public_files/', blank=True, null=True, verbose_name="上传文件") url = models.URLField(blank=True, null=True, verbose_name="链接地址") sort_order = models.IntegerField(default=0, verbose_name="排序") is_published = models.BooleanField(default=True, verbose_name="是否发布") is_temp_file = models.BooleanField(default=False, verbose_name="临时文件") expire_type = models.CharField( max_length=10, choices=[ ('expire_1h', '1小时'), ('expire_1d', '1天'), ('expire_7d', '7天'), ], blank=True, null=True, verbose_name="过期类型" ) expire_at = models.DateTimeField(blank=True, null=True, verbose_name="过期时间") created_at = models.DateTimeField(auto_now_add=True, verbose_name="创建时间") updated_at = models.DateTimeField(auto_now=True, verbose_name="更新时间") class Meta: verbose_name = "公开内容" verbose_name_plural = "公开内容" ordering = ['sort_order', '-created_at'] def __str__(self): return f"{self.type.name} - {self.title}" class TempMessage(models.Model): """临时留言""" username = models.CharField(max_length=20, blank=True, null=True, verbose_name="用户名") content = models.CharField(max_length=1000, verbose_name="内容") ip_address = models.GenericIPAddressField(blank=True, null=True, verbose_name="来源IP") created_at = models.DateTimeField(auto_now_add=True, verbose_name="创建时间") expire_at = models.DateTimeField(blank=True, null=True, verbose_name="过期时间") class Meta: verbose_name = "临时留言" verbose_name_plural = "临时留言" ordering = ['-created_at'] def __str__(self): return f"{self.username or '匿名'} - {self.content[:20]}..."