# -*- coding: utf-8 -*-
"""Akvo RSR is covered by the GNU Affero General Public License.
See more details in the license.txt file located at the root folder of the Akvo RSR module.
For additional details on the GNU license please see < http://www.gnu.org/licenses/agpl.html >.
"""
from rest_framework import serializers
from akvo.rsr.models import ProjectLocation, AdministrativeLocation, Country
from ..fields import Base64ImageField
from .country import CountrySerializer
from .rsr_serializer import BaseRSRSerializer
[docs]class ProjectLocationRawSerializer(BaseRSRSerializer):
[docs]class AdministrativeLocationSerializer(BaseRSRSerializer):
location_unicode = serializers.ReadOnlyField(source='location.__str__')
vocabulary_label = serializers.ReadOnlyField(source='iati_vocabulary_unicode')
[docs]class ProjectLocationSerializer(ProjectLocationRawSerializer):
country_label = serializers.ReadOnlyField(source='iati_country_unicode')
vocabulary_label = serializers.ReadOnlyField(source='iati_vocabulary_unicode')
exactness_label = serializers.ReadOnlyField(source='iati_exactness_unicode')
reach_label = serializers.ReadOnlyField(source='iati_reach_unicode')
class_label = serializers.ReadOnlyField(source='iati_class_unicode')
feature_designation_label = serializers.ReadOnlyField(source='iati_designation_unicode')
administratives = AdministrativeLocationSerializer(many=True, read_only=True)
country_iso_code = serializers.CharField(source='country.iso_code', default=None)
[docs] def create(self, validated_data):
iso_code = validated_data.pop('country', {}).pop('iso_code', '')
location = super(ProjectLocationSerializer, self).create(validated_data)
if iso_code:
try:
country = Country.objects.get(iso_code__iexact=iso_code)
except Country.DoesNotExist:
pass
else:
location.country = country
location.save(update_fields=['country'])
return location
[docs] def update(self, instance, validated_data):
iso_code = validated_data.pop('country', {}).pop('iso_code', '')
if iso_code:
try:
country = Country.objects.get(iso_code__iexact=iso_code)
except Country.DoesNotExist:
pass
else:
instance.country = country
return super(ProjectLocationSerializer, self).update(instance, validated_data)
[docs]class MapProjectSerializer(serializers.Serializer):
"""To serialize the project field of the project map resource."""
id = serializers.IntegerField()
title = serializers.CharField()
current_image = Base64ImageField(required=False, allow_empty_file=True, allow_null=True)
[docs]class ProjectLocationCountryNameSerializer(serializers.Serializer):
country = serializers.StringRelatedField(read_only=True)
iso_code = serializers.StringRelatedField(source='country.iso_code', read_only=True)