gault-millau/apps/notification/serializers/common.py
2019-12-30 22:23:16 +03:00

109 lines
3.0 KiB
Python

"""Notification app serializers."""
from django.utils.translation import ugettext_lazy as _
from rest_framework import serializers
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()
class Meta:
"""Meta class."""
model = models.SubscriptionType
fields = (
'id',
'index_name',
'name_translated',
)
class CreateSubscribeSerializer(serializers.ModelSerializer):
"""Create Subscribe serializer."""
email = serializers.EmailField(required=False, source='send_to')
subscription_types = SubscriptionTypeSerializer(read_only=True)
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
subscription_type_ids = self.context.get('request') \
.parser_context.get('kwargs') \
.get("subscription_types_pk")
attrs['subscription_types'] = subscription_type_ids
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 = ()
read_only_fields = ('subscribe_date', 'unsubscribe_date', 'state',)
class SubscribeSerializer(serializers.ModelSerializer):
"""Subscribe serializer."""
email = serializers.EmailField(required=False, source='send_to')
subscription_types = SubscriptionTypeSerializer(read_only=True)
subscribe_objects = SubscribeObjectSerializer(read_only=True)
class Meta:
"""Meta class."""
model = models.Subscriber
fields = (
'email',
'subscription_types',
'link_to_unsubscribe',
'subscribe_objects',
)