Source code for feder.alerts.models

from django.conf import settings
from django.contrib.contenttypes.fields import GenericForeignKey
from django.contrib.contenttypes.models import ContentType
from django.core.mail import send_mail
from django.db import models
from django.db.models.signals import post_save
from django.dispatch import receiver
from django.urls import reverse
from django.utils.translation import gettext_lazy as _
from model_utils.models import TimeStampedModel

from feder.monitorings.models import Monitoring

ALERT_INDEX = _("Alerts index")


[docs] class AlertQuerySet(models.QuerySet): def monitoring(self, monitoring): return self.filter(monitoring=monitoring) def link_object(self, obj): obj_type = ContentType.objects.get_for_model(obj) return self.filter(content_type__pk=obj_type.id, object_id=obj.id) def for_user(self, user): return self
[docs] class Alert(TimeStampedModel): monitoring = models.ForeignKey( Monitoring, on_delete=models.CASCADE, verbose_name=_("Monitoring") ) reason = models.TextField(verbose_name=_("Reason")) author = models.ForeignKey( settings.AUTH_USER_MODEL, on_delete=models.CASCADE, verbose_name=_("Author"), related_name="alert_author", null=True, ) solver = models.ForeignKey( settings.AUTH_USER_MODEL, on_delete=models.CASCADE, verbose_name=_("Solver"), related_name="alert_solver", null=True, ) status = models.BooleanField(default=False, verbose_name=_("Status")) content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE, null=True) object_id = models.PositiveIntegerField(null=True) link_object = GenericForeignKey() objects = AlertQuerySet.as_manager() class Meta: verbose_name = _("Alert") verbose_name_plural = _("Alerts") ordering = ["created"] def get_status_display(self): return _("Closed") if self.status else _("Open") @property def is_closed(self): return self.status @property def is_open(self): return not self.status def __str__(self): return str(self.created) def get_absolute_url(self): return reverse("alerts:details", kwargs={"pk": self.pk})
@receiver(post_save, sender=Alert, dispatch_uid="notify_users") def notify_users(sender, instance, created, **kwargs): if created and instance.monitoring.notify_alert: recipient_list = [ x.email for x in instance.monitoring.get_users_with_perm("view_alert") ] send_mail( subject="New alert", message=f"in monitoring {instance.monitoring}", from_email=settings.EMAIL_NOTIFICATION, recipient_list=recipient_list, )