Added correct creating subscribe

This commit is contained in:
dormantman 2019-12-27 17:10:41 +03:00 committed by Kuroshini
parent eac841f41f
commit 7baf022a77
5 changed files with 76 additions and 22 deletions

View File

@ -8,6 +8,7 @@ from rest_framework import serializers
from rest_framework import validators as rest_validators
from account import models, tasks
from notification.models import Subscriber
from utils import exceptions as utils_exceptions
from utils import methods as utils_methods
@ -46,6 +47,12 @@ class UserSerializer(serializers.ModelSerializer):
'newsletter',
]
def create(self, validated_data):
user = super(UserSerializer, self).create(validated_data)
validated_data['user'] = user
Subscriber.objects.make_subscriber(**validated_data)
return user
def validate_email(self, value):
"""Validate email value"""
if value == self.instance.email:

View File

@ -21,7 +21,7 @@ class SubscriberManager(models.Manager):
"""Extended manager for Subscriber model."""
def make_subscriber(self, email=None, user=None, ip_address=None, country_code=None,
locale=None, subscription_type=None, *args, **kwargs):
locale=None, subscription_types=None, *args, **kwargs):
"""Make subscriber and update info."""
# search existing object
if not user:
@ -44,12 +44,12 @@ class SubscriberManager(models.Manager):
obj.locale = locale
obj.state = self.model.USABLE
obj.update_code = generate_string_code()
obj.subscription_type = subscription_type
obj.subscription_types = subscription_types
obj.save()
else:
obj = self.model.objects.create(user=user, email=email, ip_address=ip_address,
country_code=country_code, locale=locale,
subscription_type=subscription_type)
subscription_types=subscription_types)
return obj
def associate_user(self, user):
@ -127,6 +127,13 @@ class Subscriber(ProjectBaseMixin):
def unsubscribe(self):
"""Unsubscribe user."""
subscribes = Subscribe.objects.filter(subscriber=self)
self.subscription_types = []
subscribes.unsubscribe_date = now()
subscribes.save()
self.state = self.UNUSABLE
self.save()

View File

@ -1,6 +1,7 @@
"""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
@ -21,11 +22,11 @@ class SubscriptionTypeSerializer(serializers.ModelSerializer):
)
class SubscribeSerializer(serializers.ModelSerializer):
"""Subscribe serializer."""
class CreateSubscribeSerializer(serializers.ModelSerializer):
"""Create Subscribe serializer."""
email = serializers.EmailField(required=False, source='send_to')
subscription_type = SubscriptionTypeSerializer(read_only=True)
subscription_types = SubscriptionTypeSerializer(read_only=True)
class Meta:
"""Meta class."""
@ -33,10 +34,9 @@ class SubscribeSerializer(serializers.ModelSerializer):
model = models.Subscriber
fields = (
'email',
'subscription_type',
'subscription_types',
'state',
'subscribe_date',
'unsubscribe_date'
'link_to_unsubscribe',
)
read_only_fields = ('state',)
@ -47,6 +47,10 @@ class SubscribeSerializer(serializers.ModelSerializer):
# 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'))
@ -59,18 +63,39 @@ class SubscribeSerializer(serializers.ModelSerializer):
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_id = self.context.get('request').parser_context.get('kwargs').get("subscription_type_pk")
subscription_type_qs = models.SubscriptionType.objects.filter(id=subscription_type_id)
if not subscription_type_qs.exists():
raise serializers.ValidationError({'detail': _(f'SubscriptionType not found.')})
attrs["subscription_type"] = subscription_type_qs.first()
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."""
subscriber = models.Subscriber.objects.make_subscriber(**validated_data)
return subscriber
return models.Subscriber.objects.make_subscriber(**validated_data)
class SubscribeSerializer(serializers.ModelSerializer):
"""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',
'state',
'subscribe_date',
'unsubscribe_date'
'link_to_unsubscribe',
)
read_only_fields = ('state',)

View File

@ -5,6 +5,7 @@ from notification.views import common
app_name = "notification"
urlpatterns = [
path('subscribe/', common.CreateSubscribeView.as_view(), name='create-subscribe'),
path('subscribe/<int:subscription_type_pk>', common.SubscribeView.as_view(), name='subscribe'),
path('subscribe-info/', common.SubscribeInfoAuthUserView.as_view(), name='check-code-auth'),
path('subscribe-info/<code>/', common.SubscribeInfoView.as_view(), name='check-code'),

View File

@ -2,6 +2,7 @@
from django.shortcuts import get_object_or_404
from rest_framework import generics, permissions
from rest_framework.response import Response
from notification import models
from notification.serializers import common as serializers
@ -10,7 +11,7 @@ class SubscribeView(generics.GenericAPIView):
"""Subscribe View."""
queryset = models.Subscriber.objects.all()
permission_classes = (permissions.AllowAny, )
permission_classes = (permissions.AllowAny,)
serializer_class = serializers.SubscribeSerializer
def post(self, request, *args, **kwargs):
@ -20,12 +21,26 @@ class SubscribeView(generics.GenericAPIView):
return Response(data=serializer.data)
class CreateSubscribeView(generics.GenericAPIView):
"""Create subscribe View."""
queryset = models.Subscriber.objects.all()
permission_classes = (permissions.AllowAny,)
serializer_class = serializers.CreateSubscribeSerializer
def post(self, request, *args, **kwargs):
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
serializer.save()
return Response(data=serializer.data)
class SubscribeInfoView(generics.RetrieveAPIView):
"""Subscribe info view."""
lookup_field = 'update_code'
lookup_url_kwarg = 'code'
permission_classes = (permissions.AllowAny, )
permission_classes = (permissions.AllowAny,)
queryset = models.Subscriber.objects.all()
serializer_class = serializers.SubscribeSerializer
@ -33,7 +48,7 @@ class SubscribeInfoView(generics.RetrieveAPIView):
class SubscribeInfoAuthUserView(generics.ListAPIView):
"""Subscribe info auth user view."""
permission_classes = (permissions.IsAuthenticated, )
permission_classes = (permissions.IsAuthenticated,)
serializer_class = serializers.SubscribeSerializer
def get_queryset(self):
@ -47,7 +62,7 @@ class UnsubscribeView(generics.GenericAPIView):
lookup_field = 'update_code'
lookup_url_kwarg = 'code'
permission_classes = (permissions.AllowAny, )
permission_classes = (permissions.AllowAny,)
queryset = models.Subscriber.objects.all()
serializer_class = serializers.SubscribeSerializer
@ -61,7 +76,7 @@ class UnsubscribeView(generics.GenericAPIView):
class UnsubscribeAuthUserView(generics.GenericAPIView):
"""Unsubscribe auth user view."""
permission_classes = (permissions.IsAuthenticated, )
permission_classes = (permissions.IsAuthenticated,)
queryset = models.Subscriber.objects.all()
serializer_class = serializers.SubscribeSerializer
@ -78,4 +93,3 @@ class SubscriptionTypesView(generics.ListAPIView):
permission_classes = (permissions.AllowAny,)
queryset = models.SubscriptionType.objects.all()
serializer_class = serializers.SubscriptionTypeSerializer