from django.conf import settings from django.db import models class Species(models.Model): common_name = models.CharField(max_length=120, unique=True) scientific_name = models.CharField(max_length=160, blank=True) def __str__(self): return self.common_name class WaterBody(models.Model): name = models.CharField(max_length=180) region = models.CharField(max_length=120) latitude = models.DecimalField(max_digits=9, decimal_places=6) longitude = models.DecimalField(max_digits=9, decimal_places=6) species = models.ManyToManyField(Species, related_name="water_bodies", blank=True) class Meta: constraints = [models.UniqueConstraint(fields=["name", "region"], name="unique_water_body_region")] def __str__(self): return f"{self.name}, {self.region}" class Trip(models.Model): STATUS_CHOICES = [("planned", "Planned"), ("active", "Active"), ("complete", "Complete")] owner = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name="trips") water_body = models.ForeignKey(WaterBody, on_delete=models.PROTECT, related_name="trips") target_species = models.ManyToManyField(Species, related_name="trips") starts_at = models.DateTimeField() ends_at = models.DateTimeField() status = models.CharField(max_length=12, choices=STATUS_CHOICES, default="planned") notes = models.TextField(blank=True) created_at = models.DateTimeField(auto_now_add=True) class Recommendation(models.Model): trip = models.ForeignKey(Trip, on_delete=models.CASCADE, related_name="recommendations") title = models.CharField(max_length=180) rationale = models.TextField() tackle_setup = models.JSONField(default=dict) confidence = models.DecimalField(max_digits=4, decimal_places=3) generated_at = models.DateTimeField(auto_now_add=True)