class EventType(models.Model): """Explicit model for Event types, represented by the event verb. It's used to enable or disable the generation of notifications. """ verb = models.CharField(max_length=255, null=True, choices=manager.choices(), unique=True) enabled = models.BooleanField(default=True, verbose_name=_("enabled")) class Meta: verbose_name = _("event type") verbose_name_plural = _("event types") ordering = ("verb", ) def __str__(self) -> str: return self.verb
class Event(TimeStampedModel): """A 'event' is generated when an 'actor' performs 'verb', involving 'action', in the 'target'. It could be: <actor> <verb> <actor> <verb> <target> <actor> <verb> <trigger> <target> Reference: http://activitystrea.ms/specs/atom/1.0/ """ actor_content_type = models.ForeignKey( ContentType, related_name="actor_actions", null=True, on_delete=models.CASCADE, verbose_name=_("actor content type"), ) actor_object_id = models.PositiveIntegerField(_("actor object id"), null=True) actor = GenericForeignKey("actor_content_type", "actor_object_id") verb = models.CharField(_("verb"), max_length=255, null=True, choices=manager.choices()) trigger_content_type = models.ForeignKey( ContentType, related_name="trigger_actions", blank=True, null=True, on_delete=models.CASCADE, verbose_name=_("trigger content type"), ) trigger_object_id = models.PositiveIntegerField(_("trigger object id"), blank=True, null=True) trigger = GenericForeignKey("trigger_content_type", "trigger_object_id") target_content_type = models.ForeignKey( ContentType, related_name="target_actions", blank=True, null=True, on_delete=models.CASCADE, verbose_name=_("target content type"), ) target_object_id = models.PositiveIntegerField(_("target object id"), blank=True, null=True) target = GenericForeignKey("target_content_type", "target_object_id") notified = models.BooleanField(_("notified"), default=False) class Meta: verbose_name = _("event") verbose_name_plural = _("events") def __str__(self) -> str: handler = self.handler() return handler.get_text() def handler(self, notification: "Notification" = None) -> "EventHandler": """Gets the handler for the event.""" return manager.handler(self, notification=notification) def notify(self) -> None: """Creates the notifications associated to this action, .""" handler = self.handler() if handler.should_notify: handler.notify() self.notified = True self.save() def save(self, *args, **kwargs) -> None: super().save(*args, **kwargs) if not self.notified: self.notify()