90 lines
3.0 KiB
Python
90 lines
3.0 KiB
Python
![]() |
from django.db import models
|
|||
|
from django.contrib.auth import get_user_model
|
|||
|
from django.core.validators import MinLengthValidator
|
|||
|
|
|||
|
User = get_user_model()
|
|||
|
|
|||
|
|
|||
|
class DailyReport(models.Model):
|
|||
|
"""日报模型"""
|
|||
|
user = models.ForeignKey(
|
|||
|
User,
|
|||
|
on_delete=models.CASCADE,
|
|||
|
verbose_name="提交人",
|
|||
|
related_name='daily_reports'
|
|||
|
)
|
|||
|
work_summary = models.TextField(
|
|||
|
"工作总结",
|
|||
|
validators=[MinLengthValidator(10, message="工作总结至少需要10个字符")]
|
|||
|
)
|
|||
|
next_day_plan = models.TextField(
|
|||
|
"明日计划",
|
|||
|
validators=[MinLengthValidator(10, message="明日计划至少需要10个字符")]
|
|||
|
)
|
|||
|
difficulties = models.TextField(
|
|||
|
"遇到的困难",
|
|||
|
blank=True,
|
|||
|
null=True,
|
|||
|
help_text="可选:描述工作中遇到的问题或困难"
|
|||
|
)
|
|||
|
suggestions = models.TextField(
|
|||
|
"建议或意见",
|
|||
|
blank=True,
|
|||
|
null=True,
|
|||
|
help_text="可选:对工作或团队的建议"
|
|||
|
)
|
|||
|
report_date = models.DateField("日报日期", help_text="填写日报对应的日期")
|
|||
|
created_at = models.DateTimeField("提交时间", auto_now_add=True)
|
|||
|
updated_at = models.DateTimeField("更新时间", auto_now=True)
|
|||
|
is_draft = models.BooleanField("草稿状态", default=False, help_text="是否为草稿")
|
|||
|
|
|||
|
class Meta:
|
|||
|
verbose_name = "日报"
|
|||
|
verbose_name_plural = verbose_name
|
|||
|
ordering = ['-report_date', '-created_at']
|
|||
|
unique_together = [['user', 'report_date']] # 每个用户每天只能有一份日报
|
|||
|
indexes = [
|
|||
|
models.Index(fields=['user', 'report_date']),
|
|||
|
models.Index(fields=['report_date']),
|
|||
|
models.Index(fields=['-created_at']),
|
|||
|
]
|
|||
|
|
|||
|
def __str__(self):
|
|||
|
return f'{self.user.username} - {self.report_date}'
|
|||
|
|
|||
|
@property
|
|||
|
def work_summary_preview(self):
|
|||
|
"""工作总结预览(前100个字符)"""
|
|||
|
return self.work_summary[:100] + '...' if len(self.work_summary) > 100 else self.work_summary
|
|||
|
|
|||
|
@property
|
|||
|
def next_day_plan_preview(self):
|
|||
|
"""明日计划预览(前100个字符)"""
|
|||
|
return self.next_day_plan[:100] + '...' if len(self.next_day_plan) > 100 else self.next_day_plan
|
|||
|
|
|||
|
|
|||
|
class ReportComment(models.Model):
|
|||
|
"""日报评论模型"""
|
|||
|
report = models.ForeignKey(
|
|||
|
DailyReport,
|
|||
|
on_delete=models.CASCADE,
|
|||
|
related_name='comments',
|
|||
|
verbose_name="关联日报"
|
|||
|
)
|
|||
|
user = models.ForeignKey(
|
|||
|
User,
|
|||
|
on_delete=models.CASCADE,
|
|||
|
verbose_name="评论人"
|
|||
|
)
|
|||
|
content = models.TextField("评论内容")
|
|||
|
created_at = models.DateTimeField("评论时间", auto_now_add=True)
|
|||
|
updated_at = models.DateTimeField("更新时间", auto_now=True)
|
|||
|
|
|||
|
class Meta:
|
|||
|
verbose_name = "日报评论"
|
|||
|
verbose_name_plural = verbose_name
|
|||
|
ordering = ['-created_at']
|
|||
|
|
|||
|
def __str__(self):
|
|||
|
return f'{self.user.username} 评论了 {self.report}'
|