gault-millau/apps/transfer/serializers/notification.py
2019-11-16 15:56:23 +03:00

90 lines
3.0 KiB
Python

from django.db import IntegrityError
from rest_framework import serializers
from account.models import User
from notification.models import Subscriber
class SubscriberSerializer(serializers.ModelSerializer):
email = serializers.CharField()
locale = serializers.CharField(allow_null=True)
country_code = serializers.CharField(allow_null=True)
class Meta:
model = Subscriber
fields = (
"email",
"locale",
"country_code"
)
def validate(self, data):
data["email"] = self.get_email(data)
data["locale"] = self.get_locale(data)
data["country_code"] = self.get_country_code(data)
return data
def create(self, validated_data):
inst, created = Subscriber.objects.get_or_create(**validated_data)
return inst
def get_email(self, obj):
return obj["email"]
def get_locale(self, obj):
return obj["locale"]
def get_country_code(self, obj):
return obj["country_code"]
class NewsletterSubscriberSerializer(serializers.Serializer):
id = serializers.IntegerField()
email_address__email = serializers.CharField()
email_address__account_id = serializers.IntegerField(allow_null=True)
email_address__ip = serializers.CharField(allow_null=True, allow_blank=True)
email_address__country_code = serializers.CharField(allow_null=True, allow_blank=True)
email_address__locale = serializers.CharField(allow_null=True, allow_blank=True)
updated_at = serializers.DateTimeField(format='%m-%d-%Y %H:%M:%S')
def validate(self, data):
data.update({
'old_id': data.pop('id'),
'email': data.pop('email_address__email'),
'ip_address': data.pop('email_address__ip'),
'country_code': data.pop('email_address__country_code'),
'locale': data.pop('email_address__locale'),
'created': data.pop('updated_at'),
'user_id': self.get_user(data),
})
data.pop('email_address__account_id')
return data
def create(self, validated_data):
try:
obj = Subscriber.objects.get(email=validated_data['email'])
except Subscriber.DoesNotExist:
obj = Subscriber.objects.create(**validated_data)
else:
current_data = obj.created
if validated_data['created'] > current_data:
obj.ip_address = validated_data['ip_address']
obj.locale = validated_data['locale']
obj.country_code = validated_data['country_code']
obj.old_id = validated_data['old_id']
obj.created = validated_data['created']
obj.user_id = validated_data['user_id']
obj.save()
return obj
@staticmethod
def get_user(data):
if not data['email_address__account_id']:
return None
user = User.objects.filter(old_id=data['email_address__account_id']).first()
if user:
return user.id
return None