diff --git a/spug_api/apps/alarm/__init__.py b/spug_api/apps/alarm/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/spug_api/apps/alarm/models.py b/spug_api/apps/alarm/models.py new file mode 100644 index 0000000..4cc70dc --- /dev/null +++ b/spug_api/apps/alarm/models.py @@ -0,0 +1,75 @@ +from django.db import models +from libs import ModelMixin, human_time +from apps.account.models import User +import json + + +class Alarm(models.Model, ModelMixin): + MODES = ( + ('1', '微信'), + ('2', '短信'), + ('3', '钉钉'), + ('4', '邮件'), + ) + STATUS = ( + ('1', '报警发生'), + ('2', '故障恢复'), + ) + name = models.CharField(max_length=50) + type = models.CharField(max_length=50) + notify_mode = models.CharField(max_length=2, choices=MODES) + notify_grp = models.CharField(max_length=255) + status = models.CharField(max_length=2, choices=STATUS) + duration = models.CharField(max_length=50) + created_at = models.CharField(max_length=20, default=human_time) + + def to_dict(self, *args, **kwargs): + tmp = super().to_dict(*args, **kwargs) + tmp['notify_mode_alias'] = self.get_notify_mode_display() + tmp['status_alias'] = self.get_status_display() + return tmp + + def __repr__(self): + return '' % self.name + + class Meta: + db_table = 'alarms' + ordering = ('-id',) + + +class Group(models.Model, ModelMixin): + name = models.CharField(max_length=50) + desc = models.CharField(max_length=255, null=True) + contacts = models.TextField(null=True) + created_at = models.CharField(max_length=20, default=human_time) + created_by = models.ForeignKey(User, models.PROTECT, related_name='+') + + def to_dict(self, *args, **kwargs): + tmp = super().to_dict(*args, **kwargs) + tmp['contacts'] = json.loads(self.contacts) + return tmp + + def __repr__(self): + return '' % self.name + + class Meta: + db_table = 'alarm_groups' + ordering = ('-id',) + + +class Contact(models.Model, ModelMixin): + name = models.CharField(max_length=50) + phone = models.CharField(max_length=20, null=True) + email = models.CharField(max_length=255, null=True) + ding = models.CharField(max_length=255, null=True) + wx_token = models.CharField(max_length=255, null=True) + + created_at = models.CharField(max_length=20, default=human_time) + created_by = models.ForeignKey(User, models.PROTECT, related_name='+') + + def __repr__(self): + return '' % self.name + + class Meta: + db_table = 'alarm_contacts' + ordering = ('-id',) diff --git a/spug_api/apps/alarm/views.py b/spug_api/apps/alarm/views.py new file mode 100644 index 0000000..a62d493 --- /dev/null +++ b/spug_api/apps/alarm/views.py @@ -0,0 +1,78 @@ +from django.views.generic import View +from libs import json_response, JsonParser, Argument +from apps.alarm.models import Alarm, Group, Contact +from apps.monitor.models import Detection +import json + + +class AlarmView(View): + def get(self, request): + alarms = Alarm.objects.all() + return json_response(alarms) + + +class GroupView(View): + def get(self, request): + groups = Group.objects.all() + return json_response(groups) + + def post(self, request): + form, error = JsonParser( + Argument('id', type=int, required=False), + Argument('name', help='请输入组名'), + Argument('contacts', type=list, help='请选择模版类型'), + Argument('desc', required=False) + ).parse(request.body) + if error is None: + form.contacts = json.dumps(form.contacts) + if form.id: + Group.objects.filter(pk=form.id).update(**form) + else: + form.created_by = request.user + Group.objects.create(**form) + return json_response(error=error) + + def delete(self, request): + form, error = JsonParser( + Argument('id', type=int, help='请指定操作对象') + ).parse(request.GET) + if error is None: + detection = Detection.objects.filter(notify_grp__contains=f'\"{form.id}\"').first() + if detection: + return json_response(error=f'监控任务【{detection.name}】正在使用该报警组,请解除关联后再尝试删除该联系组') + Group.objects.filter(pk=form.id).delete() + return json_response(error=error) + + +class ContactView(View): + def get(self, request): + contacts = Contact.objects.all() + return json_response(contacts) + + def post(self, request): + form, error = JsonParser( + Argument('id', type=int, required=False), + Argument('name', help='请输入联系人姓名'), + Argument('phone', required=False), + Argument('email', required=False), + Argument('ding', required=False), + Argument('wx_token', required=False), + ).parse(request.body) + if error is None: + if form.id: + Contact.objects.filter(pk=form.id).update(**form) + else: + form.created_by = request.user + Contact.objects.create(**form) + return json_response(error=error) + + def delete(self, request): + form, error = JsonParser( + Argument('id', type=int, help='请指定操作对象') + ).parse(request.GET) + if error is None: + group = Group.objects.filter(contacts__contains=f'\"{form.id}\"').first() + if group: + return json_response(error=f'报警联系组【{group.name}】包含此联系人,请解除关联后再尝试删除该联系人') + Contact.objects.filter(pk=form.id).delete() + return json_response(error=error)