""" System models — system_settings, background_jobs, job_locks, distributed_locks. Maps to AGENT.md DBML: Lines 629-657. """ from django.db import models from core.models import BaseModel class SystemSetting(models.Model): """Platform-wide key-value configuration store.""" key = models.CharField(max_length=255, primary_key=True) value = models.TextField(blank=True, default="") description = models.CharField(max_length=500, blank=True, default="") updated_at = models.DateTimeField(auto_now=True) class Meta: db_table = "system_settings" def __str__(self) -> str: return f"{self.key}={self.value[:50]}" class BackgroundJob(BaseModel): """Tracks background/async jobs.""" class Status(models.TextChoices): PENDING = "pending", "Pending" RUNNING = "running", "Running" COMPLETED = "completed", "Completed" FAILED = "failed", "Failed" queue = models.CharField(max_length=100, db_index=True) payload = models.JSONField(default=dict, blank=True) status = models.CharField(max_length=20, choices=Status.choices, default=Status.PENDING) attempts = models.PositiveIntegerField(default=0) max_attempts = models.PositiveIntegerField(default=3) error_message = models.TextField(blank=True, default="") run_at = models.DateTimeField(null=True, blank=True) failed_at = models.DateTimeField(null=True, blank=True) class Meta: db_table = "background_jobs" ordering = ["-created_at"] def __str__(self) -> str: return f"Job {self.pk} ({self.get_status_display()})" class JobLock(models.Model): """Prevents concurrent execution of the same job.""" lock_key = models.CharField(max_length=255, primary_key=True) locked_by = models.CharField(max_length=255, blank=True, default="") expires_at = models.DateTimeField() class Meta: db_table = "job_locks" def __str__(self) -> str: return self.lock_key class DistributedLock(models.Model): """General-purpose distributed lock.""" lock_key = models.CharField(max_length=255, primary_key=True) owner_id = models.CharField(max_length=255) acquired_at = models.DateTimeField(auto_now_add=True) expires_at = models.DateTimeField() class Meta: db_table = "distributed_locks" def __str__(self) -> str: return f"{self.lock_key} by {self.owner_id}"