diff --git a/apps/account/serializers/common.py b/apps/account/serializers/common.py index 09136934..62113d9b 100644 --- a/apps/account/serializers/common.py +++ b/apps/account/serializers/common.py @@ -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: diff --git a/apps/notification/models.py b/apps/notification/models.py index 3a703f29..0d76c292 100644 --- a/apps/notification/models.py +++ b/apps/notification/models.py @@ -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() diff --git a/apps/notification/serializers/common.py b/apps/notification/serializers/common.py index c7bfec42..d227deeb 100644 --- a/apps/notification/serializers/common.py +++ b/apps/notification/serializers/common.py @@ -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',) diff --git a/apps/notification/urls/common.py b/apps/notification/urls/common.py index 0f7571f5..05e6f72d 100644 --- a/apps/notification/urls/common.py +++ b/apps/notification/urls/common.py @@ -5,6 +5,7 @@ from notification.views import common app_name = "notification" urlpatterns = [ + path('subscribe/', common.CreateSubscribeView.as_view(), name='create-subscribe'), path('subscribe/', common.SubscribeView.as_view(), name='subscribe'), path('subscribe-info/', common.SubscribeInfoAuthUserView.as_view(), name='check-code-auth'), path('subscribe-info//', common.SubscribeInfoView.as_view(), name='check-code'), diff --git a/apps/notification/views/common.py b/apps/notification/views/common.py index cba9c343..460c9444 100644 --- a/apps/notification/views/common.py +++ b/apps/notification/views/common.py @@ -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 -