from rest_framework import serializers, exceptions from right_tree.api.models import * 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'] class SoilOrderSerializer(serializers.HyperlinkedModelSerializer): soil_name = serializers.CharField(max_length=50, source='name') soil_code = serializers.CharField(max_length=1, source='code') class Meta: model = SoilOrder fields = ['soil_name', 'soil_code'] class SoilVariantSerializer(serializers.HyperlinkedModelSerializer): class Meta: model = SoilVariant fields = ['name'] class HabitatImageSerializer(serializers.HyperlinkedModelSerializer): id = serializers.ReadOnlyField() class Meta: model = HabitatImage fields = ['id', 'name', 'image_filename'] class HabitatSerializer(serializers.HyperlinkedModelSerializer): id = serializers.ReadOnlyField() images = HabitatImageSerializer(many=True) class Meta: model = Habitat fields = ['id', 'name', 'images'] class ZoneSerializer(serializers.HyperlinkedModelSerializer): id = serializers.ReadOnlyField() habitat = HabitatSerializer() redirect_habitat = HabitatSerializer() class Meta: model = Zone fields = ['id', 'name', 'variant', 'refined_variant', 'habitat', 'related_svg_segment', 'redirect_habitat', 'ignore_soil_order_filter', 'ignore_location_filter', 'tooltip_display_text'] 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() 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 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)