from django.db import models class AdventureCategory(models.Model): name = models.CharField(max_length=100, unique=True) slug = models.SlugField(max_length=120, unique=True) description = models.TextField(blank=True) def __str__(self) -> str: return self.name class AdventureOffering(models.Model): vendor = models.ForeignKey("accounts.VendorProfile", on_delete=models.CASCADE, related_name="adventure_offerings") category = models.ForeignKey(AdventureCategory, on_delete=models.PROTECT, related_name="offerings") title = models.CharField(max_length=255) public_id = models.CharField(max_length=64, unique=True) description = models.TextField(blank=True) meeting_point = models.CharField(max_length=255, blank=True) duration_minutes = models.PositiveIntegerField() capacity = models.PositiveIntegerField(default=1) price_per_person = models.DecimalField(max_digits=10, decimal_places=2) is_active = models.BooleanField(default=True) created_at = models.DateTimeField(auto_now_add=True) updated_at = models.DateTimeField(auto_now=True) class Meta: ordering = ("-created_at",) def __str__(self) -> str: return f"{self.title} ({self.public_id})" class AdventureImage(models.Model): offering = models.ForeignKey(AdventureOffering, on_delete=models.CASCADE, related_name="images") image = models.ImageField(upload_to="adventure_images/") alt_text = models.CharField(max_length=255, blank=True) sort_order = models.PositiveIntegerField(default=0) is_primary = models.BooleanField(default=False) class Meta: ordering = ("sort_order", "id") def __str__(self) -> str: return f"Image for {self.offering.public_id}"