from django.contrib.gis.db import models class SoilOrder(models.Model): code = models.CharField(unique=True, max_length=1) name = models.CharField(unique=True, max_length=50) def __str__(self): return f"{self.name} ({self.code})" class SoilVariant(models.Model): name = models.CharField(unique=True, max_length=10) def __str__(self): return self.name class SoilLayer(models.Model): nzsc_class = models.CharField(max_length=4) nzsc_group = models.CharField(max_length=2) nzsc_order = models.ForeignKey(SoilOrder, on_delete=models.CASCADE) shape_leng = models.FloatField() geom = models.PolygonField(srid=2193) def __str__(self): return self.nzsc_class class EcologicalRegion(models.Model): name = models.CharField(unique=True, max_length=50) def __str__(self): return self.name class EcologicalDistrictLayer(models.Model): ecological = models.CharField(max_length=5) ecologic_1 = models.CharField(max_length=50) ecologic_2 = models.ForeignKey(EcologicalRegion, on_delete=models.CASCADE) shape_leng = models.FloatField() shape_area = models.FloatField() geom = models.PolygonField(srid=2193) def __str__(self): return f"{self.ecologic_1} ({self.ecologic_2})" class ToleranceLevel(models.Model): level = models.CharField(max_length=1) def __str__(self): return self.level class Plant(models.Model): name = models.CharField(unique=True, max_length=50) commonname = models.CharField(null=True, blank=True, max_length=200) maxheight = models.FloatField() spacing = models.FloatField() synonym = models.CharField(null=True, blank=True, max_length=200) water_tolerance = models.ForeignKey( ToleranceLevel, related_name='water_tolerance', on_delete=models.CASCADE) drought_tolerance = models.ForeignKey( ToleranceLevel, related_name='drought_tolerance', on_delete=models.CASCADE) frost_tolerance = models.ForeignKey( ToleranceLevel, related_name='frost_tolerance', on_delete=models.CASCADE) salinity_tolerance = models.ForeignKey( ToleranceLevel, related_name='salinity_tolerance', on_delete=models.CASCADE) purpose = models.TextField(null=True, blank=True) stage = models.PositiveIntegerField() growth_form = models.CharField(null=True, blank=True, max_length=50) ecological_regions = models.ManyToManyField(EcologicalRegion) soil_order = models.ManyToManyField(SoilOrder) soil_variants = models.ManyToManyField(SoilVariant) def __str__(self): return self.name class Habitat(models.Model): name = models.CharField(max_length=50) def __str__(self): return self.name class HabitatImage(models.Model): habitat = models.ForeignKey( Habitat, related_name='habitat', on_delete=models.CASCADE) name = models.CharField(max_length=50) image_filename = models.CharField(max_length=50, default='-') def __str__(self): return self.name class Zone(models.Model): name = models.CharField(max_length=50) variant = models.CharField(null=True, blank=True, max_length=50) refined_variant = models.CharField(null=True, blank=True, max_length=100) redirect_habitat = models.ForeignKey( Habitat, blank=True, null=True, on_delete=models.CASCADE, related_name='redirect_habitat') def __str__(self): refined_variant_str = f", {self.refined_variant}" if self.refined_variant is not None else "" variant_str = f"({self.variant}{refined_variant_str})" if self.variant is not None else "" return f"{self.name} {variant_str}" class ZoneImageSegment(models.Model): zone = models.ForeignKey( Zone, on_delete=models.CASCADE, related_name='zone') habitat_image = models.ForeignKey( HabitatImage, on_delete=models.CASCADE, related_name='habitat_image') segment_order = models.PositiveIntegerField(default=0) segment_percentage_width = models.PositiveIntegerField(default=0) def __str__(self): return f"{self.habitat_image.name}, {self.zone.name}"