Exemple #1
0
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
Exemple #2
0
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()