right-tree/backend/right_tree/api/models.py

120 lines
No EOL
4.1 KiB
Python

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 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='images', 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}"
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)
zones = models.ManyToManyField(Zone)
def __str__(self):
return self.name