from django.db import models from django.db.models import Q from .workspace import WorkspaceBaseModel class Label(WorkspaceBaseModel): parent = models.ForeignKey( "self", on_delete=models.CASCADE, null=True, blank=True, related_name="parent_label", ) name = models.CharField(max_length=255) description = models.TextField(blank=True) color = models.CharField(max_length=255, blank=True) sort_order = models.FloatField(default=65535) external_source = models.CharField(max_length=255, null=True, blank=True) external_id = models.CharField(max_length=255, blank=True, null=True) class Meta: unique_together = ["name", "project", "deleted_at"] constraints = [ models.UniqueConstraint( fields=["name", "project"], condition=Q(deleted_at__isnull=True), name="label_unique_name_project_when_deleted_at_null", ) ] verbose_name = "Label" verbose_name_plural = "Labels" db_table = "labels" ordering = ("-created_at",) def save(self, *args, **kwargs): if self._state.adding: # Get the maximum sequence value from the database last_id = Label.objects.filter(project=self.project).aggregate( largest=models.Max("sort_order") )["largest"] # if last_id is not None if last_id is not None: self.sort_order = last_id + 10000 super(Label, self).save(*args, **kwargs) def __str__(self): return str(self.name)