from django.db import models from django.utils.text import slugify from django.urls import reverse from typing import Tuple, Optional, ClassVar, TYPE_CHECKING if TYPE_CHECKING: from history_tracking.models import HistoricalSlug class Company(models.Model): name = models.CharField(max_length=255) slug = models.SlugField(max_length=255, unique=True) website = models.URLField(blank=True) headquarters = models.CharField(max_length=255, blank=True) description = models.TextField(blank=True) total_parks = models.IntegerField(default=0) total_rides = models.IntegerField(default=0) created_at = models.DateTimeField(auto_now_add=True) updated_at = models.DateTimeField(auto_now=True) objects: ClassVar[models.Manager['Company']] class Meta: verbose_name_plural = 'companies' ordering = ['name'] def __str__(self) -> str: return self.name def save(self, *args, **kwargs) -> None: if not self.slug: self.slug = slugify(self.name) super().save(*args, **kwargs) @classmethod def get_by_slug(cls, slug: str) -> Tuple['Company', bool]: """Get company by slug, checking historical slugs if needed""" try: return cls.objects.get(slug=slug), False except cls.DoesNotExist: # Check historical slugs from history_tracking.models import HistoricalSlug try: historical = HistoricalSlug.objects.get( content_type__model='company', slug=slug ) return cls.objects.get(pk=historical.object_id), True except (HistoricalSlug.DoesNotExist, cls.DoesNotExist): raise cls.DoesNotExist() class Manufacturer(models.Model): name = models.CharField(max_length=255) slug = models.SlugField(max_length=255, unique=True) website = models.URLField(blank=True) headquarters = models.CharField(max_length=255, blank=True) description = models.TextField(blank=True) total_rides = models.IntegerField(default=0) total_roller_coasters = models.IntegerField(default=0) created_at = models.DateTimeField(auto_now_add=True) updated_at = models.DateTimeField(auto_now=True) objects: ClassVar[models.Manager['Manufacturer']] class Meta: ordering = ['name'] def __str__(self) -> str: return self.name def save(self, *args, **kwargs) -> None: if not self.slug: self.slug = slugify(self.name) super().save(*args, **kwargs) @classmethod def get_by_slug(cls, slug: str) -> Tuple['Manufacturer', bool]: """Get manufacturer by slug, checking historical slugs if needed""" try: return cls.objects.get(slug=slug), False except cls.DoesNotExist: # Check historical slugs from history_tracking.models import HistoricalSlug try: historical = HistoricalSlug.objects.get( content_type__model='manufacturer', slug=slug ) return cls.objects.get(pk=historical.object_id), True except (HistoricalSlug.DoesNotExist, cls.DoesNotExist): raise cls.DoesNotExist()