from django.core.exceptions import ValidationError from django.db import models from accounts.models import DepotUser from common.fields import ContainerNumberField, UpperCaseCharField from common.models import ContainerTypeModel, LinesModel, OperationModel # Create your models here. class Booking(models.Model): STATUS_CHOICES = [ ('active', 'Active'), ('finished', 'Finished'), ('canceled', 'Canceled'), ] number = UpperCaseCharField(max_length=50) vehicles = UpperCaseCharField(blank=True, null=True) container_type = models.ForeignKey( ContainerTypeModel, on_delete=models.CASCADE, related_name='booking_container_types', ) container_count = models.PositiveIntegerField() container_expedited_count = models.PositiveIntegerField(default=0) carrier = models.CharField(max_length=100, blank=True, null=True) line = models.ForeignKey( LinesModel, on_delete=models.CASCADE, related_name='booking_lines', ) visible = models.BooleanField(default=True) is_new = models.BooleanField(default=True) container_number = ContainerNumberField(max_length=11, blank=True, null=True) vehicles_left = models.CharField(blank=True, null=True) created_on = models.DateTimeField(auto_now_add=True) created_by = models.ForeignKey(DepotUser, related_name='booking_created_user', on_delete=models.CASCADE) updated_on = models.DateTimeField(auto_now=True) updated_by = models.ForeignKey(DepotUser, related_name='booking_updated_user', on_delete=models.CASCADE) status = models.CharField( max_length=10, choices=STATUS_CHOICES, default='active' ) @property def containers_left(self): return self.container_count - (self.container_expedited_count or 0) class Meta: app_label = 'booking' def clean(self): if Booking.objects.filter(number=self.number, status='active').exclude(id=self.id).exists(): raise ValidationError(f'Booking with number {self.number} already exists and is active.')