From a447dfa471acfd0503309aa96986e88933ef5269 Mon Sep 17 00:00:00 2001 From: dormantman Date: Tue, 14 Jan 2020 15:59:50 +0300 Subject: [PATCH 1/4] 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.""" From d3d4578bc7c509ede8e7f1ea1102c46dba82a81f Mon Sep 17 00:00:00 2001 From: dormantman Date: Tue, 14 Jan 2020 17:13:45 +0300 Subject: [PATCH 2/4] Auto creating subscriber --- apps/notification/views/common.py | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/apps/notification/views/common.py b/apps/notification/views/common.py index 8c3ef38f..de6e0c65 100644 --- a/apps/notification/views/common.py +++ b/apps/notification/views/common.py @@ -5,6 +5,7 @@ from rest_framework.response import Response from notification import models from notification.serializers import common as serializers +from utils.methods import get_user_ip class CreateSubscribeView(generics.CreateAPIView): @@ -43,7 +44,22 @@ class SubscribeInfoAuthUserView(generics.RetrieveAPIView): lookup_field = None def get_object(self): - return get_object_or_404(models.Subscriber, user=self.request.user) + user = self.request.user + + if user: + try: + subscriber = models.Subscriber.get(user=user) + + except models.Subscriber.DoesNotExist: + subscriber = models.Subscriber.objects.make_subscriber( + email=user.email, user=user, ip_address=get_user_ip(self.request), + country_code=self.request.country_code, locale=self.request.locale + ) + + else: + return get_object_or_404(models.Subscriber, user=user) + + return subscriber class UnsubscribeView(generics.UpdateAPIView): From 6dda459cc8686fec43eec19c182eb9b1ccfef76e Mon Sep 17 00:00:00 2001 From: dormantman Date: Tue, 14 Jan 2020 17:18:41 +0300 Subject: [PATCH 3/4] Fixed user authenticated --- apps/notification/views/common.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/notification/views/common.py b/apps/notification/views/common.py index de6e0c65..f80177c6 100644 --- a/apps/notification/views/common.py +++ b/apps/notification/views/common.py @@ -46,7 +46,7 @@ class SubscribeInfoAuthUserView(generics.RetrieveAPIView): def get_object(self): user = self.request.user - if user: + if user.is_authenticated: try: subscriber = models.Subscriber.get(user=user) From abf9cd684af9eb38f837dbd1aaa08ba87e914328 Mon Sep 17 00:00:00 2001 From: dormantman Date: Wed, 15 Jan 2020 23:06:38 +0300 Subject: [PATCH 4/4] Change description --- apps/notification/serializers/common.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/notification/serializers/common.py b/apps/notification/serializers/common.py index f32ceb6c..4acb9deb 100644 --- a/apps/notification/serializers/common.py +++ b/apps/notification/serializers/common.py @@ -29,7 +29,7 @@ class SubscriptionTypeSerializer(serializers.ModelSerializer): class CreateSubscribeSerializer(serializers.ModelSerializer): - """Create Subscribe serializer.""" + """Create and Update Subscribe serializer.""" email = serializers.EmailField(required=False, source='send_to') subscription_types = serializers.PrimaryKeyRelatedField(many=True, queryset=models.SubscriptionType.objects.all()) @@ -105,7 +105,7 @@ class CreateSubscribeSerializer(serializers.ModelSerializer): class UpdateSubscribeSerializer(serializers.ModelSerializer): - """Create Subscribe serializer.""" + """Update with code Subscribe serializer.""" subscription_types = serializers.PrimaryKeyRelatedField(many=True, queryset=models.SubscriptionType.objects.all())