forked from erp-dev/erp
64 lines
2.3 KiB
Python
64 lines
2.3 KiB
Python
from django.db import models
|
|
|
|
from flower.common import ModelBase
|
|
|
|
|
|
class NotifierChannelEnum(models.TextChoices):
|
|
WECOM_WEBHOOK = "wecom_webhook", "企业微信机器人"
|
|
|
|
|
|
class NotificationEventKeyEnum(models.TextChoices):
|
|
MISSION_CREATED = "mission.created", "任务已创建"
|
|
MISSION_REPLIED = "mission.replied", "任务有新回应"
|
|
MISSION_COMPLETED = "mission.completed", "任务已完成"
|
|
MISSION_REPLY_REJECTED = "mission.reply_rejected", "任务回应已撤销"
|
|
MISSION_REOPENED = "mission.reopened", "任务已重新打开"
|
|
MISSION_CANCELLED = "mission.cancelled", "任务已取消"
|
|
|
|
|
|
class Notifier(ModelBase):
|
|
id = models.BigAutoField(primary_key=True)
|
|
merchant = models.ForeignKey(
|
|
"basic_info.Merchant",
|
|
on_delete=models.PROTECT,
|
|
related_name="notifiers",
|
|
verbose_name="所属商户",
|
|
)
|
|
name = models.CharField(max_length=100, verbose_name="通知器名称")
|
|
event_key = models.CharField(
|
|
max_length=100,
|
|
choices=NotificationEventKeyEnum.choices,
|
|
db_index=True,
|
|
verbose_name="事件标识",
|
|
)
|
|
channel = models.CharField(
|
|
max_length=50,
|
|
choices=NotifierChannelEnum.choices,
|
|
default=NotifierChannelEnum.WECOM_WEBHOOK,
|
|
verbose_name="通知渠道",
|
|
)
|
|
template_key = models.CharField(max_length=100, verbose_name="模板标识")
|
|
is_enabled = models.BooleanField(default=True, db_index=True, verbose_name="是否启用")
|
|
config = models.JSONField(default=dict, blank=True, verbose_name="渠道配置")
|
|
description = models.TextField(blank=True, null=True, verbose_name="备注描述")
|
|
|
|
def get_template_name(self) -> str:
|
|
return f"notifier/events/{self.template_key}.md"
|
|
|
|
def get_config_value(self, key: str, default=None):
|
|
config = self.config or {}
|
|
return config.get(key, default)
|
|
|
|
def __str__(self):
|
|
return f"{self.name} ({self.event_key})"
|
|
|
|
class Meta:
|
|
verbose_name = "通知器"
|
|
verbose_name_plural = "通知器"
|
|
constraints = [
|
|
models.UniqueConstraint(fields=["merchant", "name"], name="unique_notifier_name_per_merchant"),
|
|
]
|
|
indexes = [
|
|
models.Index(fields=["merchant", "event_key", "is_enabled"]),
|
|
]
|