from django.contrib.gis.db.models.fields import Point from rest_framework import serializers from product import models from transfer.models import WineColor, WineType, WineClassification class WineColorSerializer(serializers.ModelSerializer): NAME = 'wine_color' id = serializers.IntegerField() name = serializers.CharField(allow_null=True) order_number = serializers.IntegerField(allow_null=True) class Meta: model = models.Characteristic fields = ( 'id', 'name', 'value', 'priority', 'order_number', ) def validate(self, attrs): attrs['old_id'] = attrs.pop('id') attrs['value'] = attrs['name'] attrs['name'] = self.NAME attrs['priority'] = attrs.pop('order_number') return attrs class WineStandardSerializer(serializers.ModelSerializer): id = serializers.IntegerField() name = serializers.CharField() type = serializers.ChoiceField(choices=models.WineStandard.STANDARDS, allow_null=True) longitude = serializers.FloatField(allow_null=True) latitude = serializers.FloatField(allow_null=True) class Meta: model = models.WineStandard fields = ( 'id', 'name', 'type', 'longitude', 'latitude', ) def validate(self, attrs): latitude = attrs.pop('latitude', None) longitude = attrs.pop('longitude', None) attrs['coordinates'] = self.get_point(latitude, longitude) attrs['old_id'] = attrs.get('id') attrs['standard_type'] = attrs.pop('type', None) return attrs def get_point(self, latitude, longitude): if latitude and longitude: return Point(x=longitude, y=latitude, srid=4326) class WineStandardClassificationSerializer(serializers.ModelSerializer): id = serializers.IntegerField() name = serializers.CharField() possible_type_id = serializers.IntegerField(allow_null=True) possible_color_id = serializers.IntegerField() parent_id = serializers.IntegerField() class Meta: model = models.WineClassification fields = ( 'id', 'name', 'possible_type_id', 'possible_color_id', 'parent_id', ) def validate(self, attrs): possible_type_id = attrs.pop('possible_type_id', None) possible_color_id = attrs.pop('possible_color_id', None) parent_id = attrs.pop('parent_id', None) attrs['old_id'] = attrs.pop('id', None) attrs['possible_subtype'] = self.get_possible_type(possible_type_id) attrs['possible_color'] = self.get_possible_color(possible_color_id) attrs['standard'] = self.get_wine_standard(parent_id) return attrs def get_possible_type(self, possible_type_id): legacy_qs = WineClassification.objects.filter(id=possible_type_id) if legacy_qs.exists(): qs = models.ProductSubType.objects.filter(index_name=legacy_qs.first()) if qs.exists(): return qs.first() def get_possible_color(self, possible_color_id): qs = models.Characteristic.objects.filter(name=WineColorSerializer.NAME, old_id=possible_color_id) if qs.exists(): return qs.first() def get_wine_standard(self, parent_id): qs = models.WineStandard.objects.filter(old_id=parent_id) if qs.exists(): return qs.first()