from datetime import datetime
from django.db import models
from app.models import (
OrganizationType,
Organization,
CommentBase,
NaturalPerson,
)
__all__ = [
'FeedbackType',
'Feedback',
]
[文档]
class FeedbackType(models.Model):
class Meta:
verbose_name = "#EX.反馈类型"
verbose_name_plural = verbose_name
id = models.SmallIntegerField("反馈类型编号", primary_key=True)
name = models.CharField("反馈类型名称", max_length=20)
org_type: OrganizationType = models.ForeignKey(
OrganizationType, on_delete=models.CASCADE, null=True, blank=True)
org: Organization = models.ForeignKey(
Organization, on_delete=models.CASCADE, null=True, blank=True)
[文档]
class Flexible(models.IntegerChoices):
NO_DEFAULT = (0, "无默认值")
ORG_TYPE_DEFAULT = (1, "仅提供组织类型默认值")
ALL_DEFAULT = (2, "全部提供默认值")
flexible = models.SmallIntegerField(
choices=Flexible.choices, default=Flexible.NO_DEFAULT
)
def __str__(self):
return self.name
class FeedbackManager(models.Manager['Feedback']):
def activated(self):
'''返回所有未被删除的反馈'''
return self.exclude(issue_status=Feedback.IssueStatus.DELETED)
[文档]
class Feedback(CommentBase):
class Meta:
verbose_name = "#EX.反馈"
verbose_name_plural = verbose_name
type = models.ForeignKey(FeedbackType, on_delete=models.CASCADE)
title = models.CharField("标题", max_length=30, blank=False)
content = models.TextField("内容", blank=False)
person = models.ForeignKey(NaturalPerson, on_delete=models.CASCADE)
org_type: OrganizationType = models.ForeignKey(
OrganizationType, on_delete=models.CASCADE, null=True, blank=True)
org: Organization = models.ForeignKey(
Organization, on_delete=models.CASCADE, null=True, blank=True)
url = models.URLField("相关链接", max_length=256, default="", blank=True)
[文档]
class IssueStatus(models.IntegerChoices):
DRAFTED = (0, "草稿")
ISSUED = (1, "已发布")
DELETED = (2, "已删除")
[文档]
class ReadStatus(models.IntegerChoices):
READ = (0, "已读")
UNREAD = (1, "未读")
[文档]
class SolveStatus(models.IntegerChoices):
SOLVED = (0, "已解决")
SOLVING = (1, "解决中")
UNSOLVABLE = (2, "无法解决")
UNMARKED = (3, "未标记")
issue_status = models.SmallIntegerField(
'发布状态', choices=IssueStatus.choices, default=IssueStatus.DRAFTED
)
read_status = models.SmallIntegerField(
'阅读情况', choices=ReadStatus.choices, default=ReadStatus.UNREAD
)
solve_status = models.SmallIntegerField(
'解决进度', choices=SolveStatus.choices, default=SolveStatus.UNMARKED
)
feedback_time = models.DateTimeField('反馈时间', auto_now_add=True)
# anonymous = models.BooleanField("发布者是否匿名", default=True)
publisher_public = models.BooleanField('发布者是否公开', default=False)
org_public = models.BooleanField('组织是否公开', default=False)
public_time = models.DateTimeField('组织公开时间', default=datetime.now)
[文档]
class PublicStatus(models.IntegerChoices):
PUBLIC = (0, '公开')
PRIVATE = (1, '未公开')
WITHDRAWAL = (2, '撤销公开')
FORCE_PRIVATE = (3, '不予公开')
public_status = models.SmallIntegerField(
'公开状态', choices=PublicStatus.choices, default=PublicStatus.PRIVATE
)
def __str__(self):
return self.title
[文档]
def save(self, *args, **kwargs):
self.typename = "feedback"
super().save(*args, **kwargs)
[文档]
def get_absolute_url(self, absolute=False) -> str:
'''
获取显示页面网址
:param absolute: 是否返回绝对地址, defaults to False
:type absolute: bool, optional
:return: 显示页面的网址
:rtype: str
'''
if self.issue_status == Feedback.IssueStatus.DRAFTED:
url = f'/modifyFeedback/?feedback_id={self.id}'
else:
url = f'/viewFeedback/{self.id}'
return url
objects: FeedbackManager = FeedbackManager()