From a447dfa471acfd0503309aa96986e88933ef5269 Mon Sep 17 00:00:00 2001 From: dormantman Date: Tue, 14 Jan 2020 15:59:50 +0300 Subject: [PATCH] Added method subscribe with code --- apps/notification/serializers/common.py | 56 ++++++++++++++++++++++++- apps/notification/urls/common.py | 1 + apps/notification/views/common.py | 10 +++++ 3 files changed, 66 insertions(+), 1 deletion(-) diff --git a/apps/notification/serializers/common.py b/apps/notification/serializers/common.py index 88585da7..f32ceb6c 100644 --- a/apps/notification/serializers/common.py +++ b/apps/notification/serializers/common.py @@ -33,6 +33,7 @@ class CreateSubscribeSerializer(serializers.ModelSerializer): email = serializers.EmailField(required=False, source='send_to') subscription_types = serializers.PrimaryKeyRelatedField(many=True, queryset=models.SubscriptionType.objects.all()) + country_code = serializers.CharField(required=False, allow_blank=True) class Meta: """Meta class.""" @@ -42,7 +43,10 @@ class CreateSubscribeSerializer(serializers.ModelSerializer): 'email', 'subscription_types', 'link_to_unsubscribe', + 'country_code', + 'update_code' ) + read_only_fields = ('link_to_unsubscribe', 'update_code') def validate(self, attrs): """Validate attrs.""" @@ -64,7 +68,13 @@ class CreateSubscribeSerializer(serializers.ModelSerializer): # append info attrs['email'] = email - attrs['country_code'] = request.country_code + + if request.country_code: + attrs['country_code'] = request.country_code + + else: + attrs['country_code'] = attrs.get('country_code') + attrs['locale'] = request.locale attrs['ip_address'] = get_user_ip(request) @@ -94,6 +104,50 @@ class CreateSubscribeSerializer(serializers.ModelSerializer): return super().update(instance, validated_data) +class UpdateSubscribeSerializer(serializers.ModelSerializer): + """Create Subscribe serializer.""" + + subscription_types = serializers.PrimaryKeyRelatedField(many=True, queryset=models.SubscriptionType.objects.all()) + + class Meta: + """Meta class.""" + + model = models.Subscriber + fields = ( + 'subscription_types', + 'link_to_unsubscribe', + 'update_code' + ) + read_only_fields = ('link_to_unsubscribe', 'update_code') + + def validate(self, attrs): + """Validate attrs.""" + request = self.context.get('request') + user = request.user + + if request.country_code: + attrs['country_code'] = request.country_code + + else: + attrs['country_code'] = attrs.get('country_code') + + attrs['locale'] = request.locale + attrs['ip_address'] = get_user_ip(request) + + if user.is_authenticated: + attrs['user'] = user + + return attrs + + def update(self, instance, validated_data): + if settings.USE_CELERY: + send_subscribes_update_email.delay(instance.pk) + else: + send_subscribes_update_email(instance.pk) + + return super().update(instance, validated_data) + + class SubscribeObjectSerializer(serializers.ModelSerializer): """Subscribe serializer.""" diff --git a/apps/notification/urls/common.py b/apps/notification/urls/common.py index 2ec6f152..050d5c34 100644 --- a/apps/notification/urls/common.py +++ b/apps/notification/urls/common.py @@ -6,6 +6,7 @@ app_name = "notification" urlpatterns = [ path('subscribe/', common.CreateSubscribeView.as_view(), name='create-subscribe'), + path('subscribe//', common.UpdateSubscribeView.as_view(), name='update-subscribe'), path('subscribe-info/', common.SubscribeInfoAuthUserView.as_view(), name='check-code-auth'), path('subscribe-info//', common.SubscribeInfoView.as_view(), name='check-code'), path('unsubscribe/', common.UnsubscribeAuthUserView.as_view(), name='unsubscribe-auth'), diff --git a/apps/notification/views/common.py b/apps/notification/views/common.py index 1861f39f..8c3ef38f 100644 --- a/apps/notification/views/common.py +++ b/apps/notification/views/common.py @@ -15,6 +15,16 @@ class CreateSubscribeView(generics.CreateAPIView): serializer_class = serializers.CreateSubscribeSerializer +class UpdateSubscribeView(generics.UpdateAPIView): + """Subscribe info view.""" + + lookup_field = 'update_code' + lookup_url_kwarg = 'code' + permission_classes = (permissions.AllowAny,) + queryset = models.Subscriber.objects.all() + serializer_class = serializers.UpdateSubscribeSerializer + + class SubscribeInfoView(generics.RetrieveAPIView): """Subscribe info view."""