@@ -0,0 +1,99 @@
|
||||
from __future__ import annotations
|
||||
|
||||
from django.db import models
|
||||
from django.utils import timezone
|
||||
|
||||
from apps.core.models import TimeStampedModel
|
||||
|
||||
|
||||
class DigestOutbox(TimeStampedModel):
|
||||
class Status(models.TextChoices):
|
||||
PENDING = "pending", "Klaar"
|
||||
SENT = "sent", "Verzonden"
|
||||
FAILED = "failed", "Mislukt"
|
||||
SKIPPED = "skipped", "Overgeslagen"
|
||||
|
||||
profile = models.ForeignKey(
|
||||
"profiles.SearchProfile", on_delete=models.CASCADE, related_name="digests"
|
||||
)
|
||||
dedupe_key = models.CharField(max_length=200, unique=True)
|
||||
scheduled_for = models.DateTimeField(db_index=True)
|
||||
recipient = models.EmailField(blank=True)
|
||||
subject = models.CharField(max_length=300)
|
||||
payload = models.JSONField(default=dict)
|
||||
status = models.CharField(max_length=16, choices=Status.choices, default=Status.PENDING)
|
||||
sent_at = models.DateTimeField(null=True, blank=True)
|
||||
error_message = models.CharField(max_length=1000, blank=True)
|
||||
|
||||
class Meta:
|
||||
ordering = ["-scheduled_for"]
|
||||
|
||||
def mark_sent(self) -> None:
|
||||
self.status = self.Status.SENT
|
||||
self.sent_at = timezone.now()
|
||||
self.error_message = ""
|
||||
self.save(update_fields=["status", "sent_at", "error_message", "updated_at"])
|
||||
|
||||
def mark_failed(self, message: str) -> None:
|
||||
self.status = self.Status.FAILED
|
||||
self.error_message = message[:1000]
|
||||
self.save(update_fields=["status", "error_message", "updated_at"])
|
||||
|
||||
def mark_skipped(self, reason: str) -> None:
|
||||
self.status = self.Status.SKIPPED
|
||||
self.error_message = reason[:1000]
|
||||
self.save(update_fields=["status", "error_message", "updated_at"])
|
||||
|
||||
|
||||
class ReminderOutbox(TimeStampedModel):
|
||||
class ReminderType(models.TextChoices):
|
||||
CLOSING = "closing", "Sluitingsherinnering"
|
||||
FOLLOW_UP = "follow_up", "Opvolgherinnering"
|
||||
TOP_MATCH = "top_match", "Topmatch"
|
||||
|
||||
class Status(models.TextChoices):
|
||||
PENDING = "pending", "Klaar"
|
||||
SENT = "sent", "Verzonden"
|
||||
FAILED = "failed", "Mislukt"
|
||||
SKIPPED = "skipped", "Overgeslagen"
|
||||
|
||||
profile = models.ForeignKey(
|
||||
"profiles.SearchProfile", on_delete=models.CASCADE, related_name="reminders"
|
||||
)
|
||||
reminder_type = models.CharField(max_length=16, choices=ReminderType.choices)
|
||||
dedupe_key = models.CharField(max_length=255, unique=True)
|
||||
scheduled_for = models.DateTimeField(db_index=True)
|
||||
recipient = models.EmailField(blank=True)
|
||||
subject = models.CharField(max_length=300)
|
||||
payload = models.JSONField(default=dict)
|
||||
status = models.CharField(max_length=16, choices=Status.choices, default=Status.PENDING)
|
||||
job = models.ForeignKey(
|
||||
"jobs.JobPosting", on_delete=models.SET_NULL, null=True, blank=True, related_name="reminders"
|
||||
)
|
||||
application = models.ForeignKey(
|
||||
"jobs.Application", on_delete=models.SET_NULL, null=True, blank=True, related_name="reminders"
|
||||
)
|
||||
score_run = models.ForeignKey(
|
||||
"jobs.ScoreRun", on_delete=models.SET_NULL, null=True, blank=True, related_name="reminders"
|
||||
)
|
||||
sent_at = models.DateTimeField(null=True, blank=True)
|
||||
error_message = models.CharField(max_length=1000, blank=True)
|
||||
|
||||
class Meta:
|
||||
ordering = ["-scheduled_for"]
|
||||
|
||||
def mark_sent(self) -> None:
|
||||
self.status = self.Status.SENT
|
||||
self.sent_at = timezone.now()
|
||||
self.error_message = ""
|
||||
self.save(update_fields=["status", "sent_at", "error_message", "updated_at"])
|
||||
|
||||
def mark_failed(self, message: str) -> None:
|
||||
self.status = self.Status.FAILED
|
||||
self.error_message = message[:1000]
|
||||
self.save(update_fields=["status", "error_message", "updated_at"])
|
||||
|
||||
def mark_skipped(self, reason: str) -> None:
|
||||
self.status = self.Status.SKIPPED
|
||||
self.error_message = reason[:1000]
|
||||
self.save(update_fields=["status", "error_message", "updated_at"])
|
||||
Reference in New Issue
Block a user