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"])