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

140 lines
4.3 KiB
Python
Raw Permalink Normal View History

from rest_framework import serializers, exceptions
2023-04-20 15:12:22 +12:00
from .models import (
ToleranceLevel,
EcologicalRegion,
EcologicalDistrictLayer,
SoilOrder,
SoilVariant,
HabitatImage,
Habitat,
Zone,
Plant,
Questionnaire,
ActivationKey,
)
2021-10-20 12:37:45 +13:00
class ToleranceLevelSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = ToleranceLevel
fields = ['level']
class EcologicalRegionSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = EcologicalRegion
fields = ['name']
class EcologicalDistrictLayerSerializer(serializers.HyperlinkedModelSerializer):
ecological_district = serializers.CharField(
max_length=50, source='ecologic_1')
ecological_region = serializers.CharField(
max_length=50, source='ecologic_2')
class Meta:
model = EcologicalDistrictLayer
fields = ['ecological_district', 'ecological_region']
2021-10-20 12:37:45 +13:00
class SoilOrderSerializer(serializers.HyperlinkedModelSerializer):
soil_name = serializers.CharField(max_length=50, source='name')
soil_code = serializers.CharField(max_length=1, source='code')
2021-10-20 12:37:45 +13:00
class Meta:
model = SoilOrder
fields = ['soil_name', 'soil_code']
2021-10-20 12:37:45 +13:00
class SoilVariantSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = SoilVariant
fields = ['name']
2023-04-20 15:12:22 +12:00
class HabitatImageSerializer(serializers.HyperlinkedModelSerializer):
id = serializers.ReadOnlyField()
2023-04-20 15:12:22 +12:00
class Meta:
model = HabitatImage
fields = ['id', 'name', 'image_filename']
2021-11-11 13:26:04 +13:00
class HabitatSerializer(serializers.HyperlinkedModelSerializer):
2021-11-11 13:26:04 +13:00
id = serializers.ReadOnlyField()
images = HabitatImageSerializer(many=True)
2021-11-11 13:26:04 +13:00
class Meta:
model = Habitat
fields = ['id', 'name', 'images']
2023-04-20 15:12:22 +12:00
class ZoneSerializer(serializers.HyperlinkedModelSerializer):
id = serializers.ReadOnlyField()
habitat = HabitatSerializer()
redirect_habitat = HabitatSerializer()
class Meta:
model = Zone
fields = ['id', 'name', 'variant',
2021-12-13 11:56:14 +13:00
'refined_variant', 'habitat', 'related_svg_segment', 'redirect_habitat', 'ignore_soil_order_filter', 'ignore_location_filter', 'tooltip_display_text']
2023-04-20 15:12:22 +12:00
class LocationDetailsSerializer(serializers.Serializer):
ecologic_1 = serializers.CharField(max_length=50)
ecologic_2 = serializers.CharField(max_length=50)
code = serializers.CharField(max_length=1)
name = serializers.CharField(max_length=50)
class PlantSerializer(serializers.HyperlinkedModelSerializer):
id = serializers.ReadOnlyField()
2021-10-20 12:37:45 +13:00
water_tolerance = ToleranceLevelSerializer()
drought_tolerance = ToleranceLevelSerializer()
frost_tolerance = ToleranceLevelSerializer()
salinity_tolerance = ToleranceLevelSerializer()
ecological_regions = EcologicalRegionSerializer(many=True, read_only=True)
soil_order = SoilOrderSerializer(many=True, read_only=True)
soil_variants = SoilVariantSerializer(many=True, read_only=True)
zones = ZoneSerializer(many=True, read_only=True)
display_name = serializers.CharField(max_length=300)
display_growth_form = serializers.CharField(max_length=300)
moisture_preferences = serializers.CharField(max_length=50)
plant_tolerances = serializers.CharField(max_length=50)
ecosystem_services = serializers.CharField(max_length=200)
carbon_sequestration = serializers.CharField(max_length=50)
class Meta:
model = Plant
2021-10-20 12:37:45 +13:00
fields = '__all__'
class AddressSerializer(serializers.Serializer):
full_address = serializers.CharField(max_length=500)
class QuestionnaireSerializer(serializers.ModelSerializer):
soil_variant = serializers.CharField(max_length=10)
key = serializers.CharField(max_length=20, write_only=True)
class Meta:
model = Questionnaire
exclude = ['id']
def validate_soil_variant(self, value):
try:
return SoilVariant.objects.get(name__startswith=value)
except SoilVariant.DoesNotExist as e:
raise exceptions.ValidationError(e)
def validate_key(self, value):
try:
if (ak := ActivationKey.objects.get(key=value)).remaining_activations > 0:
return ak
raise exceptions.ValidationError("no remaining activations")
except ActivationKey.DoesNotExist as e:
raise exceptions.ValidationError(e)