from django.db import models from django.conf import settings class BugReport(models.Model): PRIORITY_CHOICES = [ ('high', '高'), ('medium', '中'), ('low', '低'), ] STATUS_CHOICES = [ ('pending', '待处理'), ('processing', '处理中'), ('resolved', '已解决'), ('rejected', '已拒绝'), ] TYPE_CHOICES = [ ('feature', '功能问题'), ('ui', '界面问题'), ('performance', '性能问题'), ('other', '其他'), ] user = models.ForeignKey( settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='bug_reports', verbose_name='用户' ) title = models.CharField(max_length=200, verbose_name='问题标题') bug_type = models.CharField(max_length=20, choices=TYPE_CHOICES, verbose_name='问题类型') priority = models.CharField(max_length=10, choices=PRIORITY_CHOICES, verbose_name='优先级') status = models.CharField(max_length=20, choices=STATUS_CHOICES, default='pending', verbose_name='状态') description = models.TextField(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 = 'Bug反馈' verbose_name_plural = 'Bug反馈' ordering = ['-created_at'] def __str__(self): return f"[{self.get_status_display()}] {self.title}" class BugReportImage(models.Model): bug_report = models.ForeignKey( BugReport, on_delete=models.CASCADE, related_name='images', verbose_name='Bug反馈' ) image = models.ImageField(upload_to='bug_reports/%Y/%m/', verbose_name='图片') created_at = models.DateTimeField(auto_now_add=True, verbose_name='上传时间') class Meta: verbose_name = 'Bug反馈图片' verbose_name_plural = 'Bug反馈图片' def __str__(self): return f"图片 - {self.bug_report.title}" class BugReportAttachment(models.Model): bug_report = models.ForeignKey( BugReport, on_delete=models.CASCADE, related_name='attachments', verbose_name='Bug反馈' ) file = models.FileField(upload_to='bug_reports/attachments/%Y/%m/', verbose_name='附件') filename = models.CharField(max_length=255, verbose_name='文件名') file_size = models.PositiveIntegerField(verbose_name='文件大小(字节)') created_at = models.DateTimeField(auto_now_add=True, verbose_name='上传时间') class Meta: verbose_name = 'Bug反馈附件' verbose_name_plural = 'Bug反馈附件' def __str__(self): return self.filename class BugReportComment(models.Model): bug_report = models.ForeignKey( BugReport, on_delete=models.CASCADE, related_name='comments', verbose_name='Bug反馈' ) user = models.ForeignKey( settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='bug_comments', verbose_name='用户' ) content = models.TextField(verbose_name='回复内容') is_admin = models.BooleanField(default=False, verbose_name='是否管理员回复') created_at = models.DateTimeField(auto_now_add=True, verbose_name='回复时间') class Meta: verbose_name = 'Bug反馈回复' verbose_name_plural = 'Bug反馈回复' ordering = ['created_at'] def __str__(self): return f"回复 - {self.bug_report.title}" class BugReportCommentImage(models.Model): comment = models.ForeignKey( BugReportComment, on_delete=models.CASCADE, related_name='images', verbose_name='回复' ) image = models.ImageField(upload_to='bug_comments/%Y/%m/', verbose_name='图片') created_at = models.DateTimeField(auto_now_add=True, verbose_name='上传时间') class Meta: verbose_name = '回复图片' verbose_name_plural = '回复图片' def __str__(self): return f"回复图片 - {self.comment}" class BugReportCommentAttachment(models.Model): comment = models.ForeignKey( BugReportComment, on_delete=models.CASCADE, related_name='attachments', verbose_name='回复' ) file = models.FileField(upload_to='bug_comments/attachments/%Y/%m/', verbose_name='附件') filename = models.CharField(max_length=255, verbose_name='文件名') file_size = models.PositiveIntegerField(verbose_name='文件大小(字节)') created_at = models.DateTimeField(auto_now_add=True, verbose_name='上传时间') class Meta: verbose_name = '回复附件' verbose_name_plural = '回复附件' def __str__(self): return self.filename