"""Notification app serializers.""" from django.utils.translation import ugettext_lazy as _ from rest_framework import serializers from location.serializers import CountrySimpleSerializer from notification import models from utils.methods import get_user_ip from utils.serializers import TranslatedField class SubscriptionTypeSerializer(serializers.ModelSerializer): """Subscription type serializer.""" name_translated = TranslatedField() country = CountrySimpleSerializer() class Meta: """Meta class.""" model = models.SubscriptionType fields = ( 'id', 'index_name', 'name_translated', 'country', ) class CreateSubscribeSerializer(serializers.ModelSerializer): """Create Subscribe serializer.""" email = serializers.EmailField(required=False, source='send_to') subscription_types = serializers.PrimaryKeyRelatedField(many=True, queryset=models.SubscriptionType.objects.all()) class Meta: """Meta class.""" model = models.Subscriber fields = ( 'email', 'subscription_types', 'link_to_unsubscribe', ) def validate(self, attrs): """Validate attrs.""" request = self.context.get('request') user = request.user # validate email email = attrs.get('send_to') if attrs.get('email'): email = attrs.get('email') if user.is_authenticated: if email is not None and email != user.email: raise serializers.ValidationError(_('Does not match user email')) else: if email is None: raise serializers.ValidationError({'email': _('This field is required.')}) # append info attrs['email'] = email attrs['country_code'] = request.country_code attrs['locale'] = request.locale attrs['ip_address'] = get_user_ip(request) if user.is_authenticated: attrs['user'] = user return attrs def create(self, validated_data): """Create obj.""" return models.Subscriber.objects.make_subscriber(**validated_data) class SubscribeObjectSerializer(serializers.ModelSerializer): """Subscribe serializer.""" class Meta: """Meta class.""" model = models.Subscriber fields = ('subscriber',) read_only_fields = ('subscribe_date', 'unsubscribe_date',) class SubscribeSerializer(serializers.ModelSerializer): """Subscribe serializer.""" email = serializers.EmailField(required=False, source='send_to') subscription_types = SubscriptionTypeSerializer(source='active_subscriptions', read_only=True, many=True) class Meta: """Meta class.""" model = models.Subscriber fields = ( 'email', 'subscription_types', 'link_to_unsubscribe', )