Refactor Assignment model to enforce single rota assignment per worker and update related view logic to prevent multiple assignments

This commit is contained in:
Ross
2025-12-19 21:10:43 +00:00
parent f4ab0be347
commit 5cf2480602
3 changed files with 59 additions and 8 deletions
+7 -2
View File
@@ -297,13 +297,18 @@ class Worker(models.Model):
class Assignment(models.Model):
"""Join model assigning a worker to a rota (can hold role / metadata)."""
worker = models.ForeignKey(Worker, on_delete=models.CASCADE)
# Enforce that a Worker may only be assigned to a single RotaSchedule by
# using a OneToOneField here. This ensures at the DB level that each
# Worker has at most one Assignment (and therefore at most one rota).
worker = models.OneToOneField(Worker, on_delete=models.CASCADE)
rota = models.ForeignKey(RotaSchedule, on_delete=models.CASCADE)
role = models.CharField(max_length=100, blank=True)
created_at = models.DateTimeField(auto_now_add=True)
class Meta:
unique_together = ("worker", "rota")
# With OneToOneField on worker, uniqueness for (worker, rota) is
# implied by the worker uniqueness. Keep ordering for convenience.
ordering = ("-created_at",)
def __str__(self):
return f"{self.worker} -> {self.rota}"