from django.db import models from common.models import Suburb class Company(models.Model): name = models.CharField(max_length=50, unique=True) contact_name = models.CharField(max_length=50, blank=True) contact_number = models.CharField(max_length=15, blank=True) contact_mobile = models.CharField(max_length=15, blank=True) contact_email = models.CharField(max_length=50, blank=True) address = models.CharField(max_length=50, blank=True) suburb = models.ForeignKey(Suburb, on_delete=models.CASCADE) notes = models.TextField(blank=True) class Meta: verbose_name_plural = "Companies" def __str__(self): return f"{self.name}" class Bus(models.Model): company = models.ForeignKey(Company, on_delete=models.CASCADE) route_name = models.CharField(max_length=50, unique=True) contract_number = models.CharField(max_length=20, blank=True) registration = models.CharField(max_length=10, blank=True) seating_capacity = models.SmallIntegerField() make = models.CharField(max_length=15, blank=True) model = models.CharField(max_length=15, blank=True) notes = models.TextField(blank=True) class Meta: verbose_name_plural = "Buses" ordering = ["route_name"] def __str__(self): return f"{self.route_name}" def traveller_count(self, date=None): count = 0 from traveller.models import Traveller for traveller in Traveller.objects.filter(bus_stops__bus=self): if traveller._is_active(date): count += 1 return count class Shuttle(models.Model): bus = models.ForeignKey(Bus, on_delete=models.CASCADE) school = models.ForeignKey("traveller.School", on_delete=models.CASCADE) custom_name = models.CharField(max_length=10, blank=True) # transfer_school = models.ForeignKey(School, related_name='transfer_school', on_delete=models.CASCADE) am_service = models.BooleanField(default=True) pm_service = models.BooleanField(default=True) class Meta: ordering = ["school__name"] def __str__(self): custom_name = self.custom_name if custom_name: custom_name = f" ({self.custom_name})" else: custom_name = "" return f"{self.school.shortName} <-> {self.bus.route_name}{custom_name}" def traveller_count(self, date=None): count = 0 from traveller.models import Traveller for traveller in Traveller.objects.filter(shuttle=self): if traveller._is_active(date): count += 1 return count class Driver(models.Model): bus = models.ForeignKey(Bus, on_delete=models.CASCADE) first_name = models.CharField(max_length=50) last_name = models.CharField(max_length=50) phone_number = models.CharField(max_length=15, blank=True) class Meta: ordering = ["last_name"] def __str__(self): return f"{self.first_name} {self.last_name}" class BusStop(models.Model): bus = models.ForeignKey(Bus, on_delete=models.CASCADE) am_time = models.TimeField() pm_time = models.TimeField() address = models.CharField(max_length=100) notes = models.TextField(blank=True) class Meta: ordering = ["bus__route_name", "am_time"] def get_stop_number(self): return BusStop.objects.filter(bus=self.bus, am_time__lt=self.am_time).count() + 1 def __str__(self): return f"{self.bus.route_name} #{self.get_stop_number()} - {self.address}"