From 66780ef093ef81f14d0fcfe6b07bf86c58ef1819 Mon Sep 17 00:00:00 2001 From: dormantman Date: Tue, 21 Jan 2020 12:04:55 +0300 Subject: [PATCH 1/5] Added subscriptions associate --- apps/authorization/serializers/common.py | 14 +++++++++----- apps/notification/models.py | 12 +++++++----- 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/apps/authorization/serializers/common.py b/apps/authorization/serializers/common.py index 8f5bfc57..8249e062 100644 --- a/apps/authorization/serializers/common.py +++ b/apps/authorization/serializers/common.py @@ -89,11 +89,15 @@ class SignupSerializer(serializers.ModelSerializer): user_id=obj.id, country_code=request.country_code) - # Make subscriber - Subscriber.objects.make_subscriber( - email=obj.email, user=obj, ip_address=get_user_ip(request), - country_code=request.country_code, locale=request.locale - ) + # Make subscriber or associate user + + subscriber = Subscriber.objects.associate_user(user=obj) + + if subscriber is None: + Subscriber.objects.make_subscriber( + email=obj.email, user=obj, ip_address=get_user_ip(request), + country_code=request.country_code, locale=request.locale + ) return obj diff --git a/apps/notification/models.py b/apps/notification/models.py index 48362894..3f52f5cc 100644 --- a/apps/notification/models.py +++ b/apps/notification/models.py @@ -38,6 +38,9 @@ class SubscriberManager(models.Manager): else: obj = self.model.objects.filter(email=email).first() + if subscription_types is None: + subscription_types = [] + # update or create if obj: if user: @@ -51,18 +54,17 @@ class SubscriberManager(models.Manager): obj.country_code = country_code obj.locale = locale obj.update_code = generate_string_code() + obj.subscription_types.set(subscription_types) + obj.subscribe_set.update(unsubscribe_date=None) obj.save() else: obj = self.model.objects.create( user=user, email=email, ip_address=ip_address, - country_code=country_code, locale=locale + country_code=country_code, locale=locale, + subscription_types=subscription_types, ) - if subscription_types is not None: - obj.subscription_types.set(subscription_types) - obj.subscribe_set.update(unsubscribe_date=None) - return obj def associate_user(self, user): From 36b9474e36639cfe5e1f6736f08597493825a719 Mon Sep 17 00:00:00 2001 From: dormantman Date: Tue, 21 Jan 2020 12:56:54 +0300 Subject: [PATCH 2/5] Fixed subscriptions --- apps/notification/models.py | 22 ++++++++++++++-------- apps/notification/serializers/common.py | 14 +++----------- apps/notification/tasks.py | 7 +++++-- apps/notification/views/common.py | 2 +- 4 files changed, 23 insertions(+), 22 deletions(-) diff --git a/apps/notification/models.py b/apps/notification/models.py index 3f52f5cc..9ddd955d 100644 --- a/apps/notification/models.py +++ b/apps/notification/models.py @@ -30,17 +30,20 @@ class SubscriberManager(models.Manager): locale=None, subscription_types=None, *args, **kwargs): """Make subscriber and update info.""" # search existing object + if not user: user = User.objects.filter(email=email).first() if user: - obj = self.model.objects.filter(models.Q(user=user) | models.Q(email=user.email)).first() + obj = self.model.objects.filter(user=user).first() + + if obj is None: + obj = self.model.objects.filter(email=user.email).first() + self.associate_user(user=user) + else: obj = self.model.objects.filter(email=email).first() - if subscription_types is None: - subscription_types = [] - # update or create if obj: if user: @@ -54,17 +57,20 @@ class SubscriberManager(models.Manager): obj.country_code = country_code obj.locale = locale obj.update_code = generate_string_code() - obj.subscription_types.set(subscription_types) - obj.subscribe_set.update(unsubscribe_date=None) + obj.save() else: obj = self.model.objects.create( user=user, email=email, ip_address=ip_address, country_code=country_code, locale=locale, - subscription_types=subscription_types, ) + if subscription_types is not None: + obj.subscription_types.set(subscription_types) + obj.subscribe_set.update(unsubscribe_date=None) + obj.save() + return obj def associate_user(self, user): @@ -76,7 +82,7 @@ class SubscriberManager(models.Manager): if obj: obj.user = user - obj.email = None + obj.email = user.email obj.save() return obj diff --git a/apps/notification/serializers/common.py b/apps/notification/serializers/common.py index 4acb9deb..869879cb 100644 --- a/apps/notification/serializers/common.py +++ b/apps/notification/serializers/common.py @@ -28,7 +28,7 @@ class SubscriptionTypeSerializer(serializers.ModelSerializer): ) -class CreateSubscribeSerializer(serializers.ModelSerializer): +class CreateAndUpdateSubscribeSerializer(serializers.ModelSerializer): """Create and Update Subscribe serializer.""" email = serializers.EmailField(required=False, source='send_to') @@ -89,20 +89,12 @@ class CreateSubscribeSerializer(serializers.ModelSerializer): subscriber = models.Subscriber.objects.make_subscriber(**validated_data) if settings.USE_CELERY: - send_subscribes_update_email.delay(subscriber.pk) + send_subscribes_update_email.delay(subscriber.email) else: - send_subscribes_update_email(subscriber.pk) + send_subscribes_update_email(subscriber.email) return subscriber - 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 UpdateSubscribeSerializer(serializers.ModelSerializer): """Update with code Subscribe serializer.""" diff --git a/apps/notification/tasks.py b/apps/notification/tasks.py index 38b11cd5..5129ad59 100644 --- a/apps/notification/tasks.py +++ b/apps/notification/tasks.py @@ -10,8 +10,11 @@ from notification import models @shared_task -def send_subscribes_update_email(subscriber_id): - subscriber = models.Subscriber.objects.get(id=subscriber_id) +def send_subscribes_update_email(email): + subscriber = models.Subscriber.objects.filter(email=email).first() + + if subscriber is None: + return country_code = subscriber.country_code diff --git a/apps/notification/views/common.py b/apps/notification/views/common.py index 9830683d..b6584394 100644 --- a/apps/notification/views/common.py +++ b/apps/notification/views/common.py @@ -13,7 +13,7 @@ class CreateSubscribeView(generics.CreateAPIView): queryset = models.Subscriber.objects.all() permission_classes = (permissions.AllowAny,) - serializer_class = serializers.CreateSubscribeSerializer + serializer_class = serializers.CreateAndUpdateSubscribeSerializer class UpdateSubscribeView(generics.UpdateAPIView): From a8dd7f9347204f2a47987765dcdf64ec577ef0fc Mon Sep 17 00:00:00 2001 From: dormantman Date: Tue, 21 Jan 2020 13:07:56 +0300 Subject: [PATCH 3/5] Added valid link to unsubscribe --- apps/notification/models.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/apps/notification/models.py b/apps/notification/models.py index 9ddd955d..4c221280 100644 --- a/apps/notification/models.py +++ b/apps/notification/models.py @@ -148,10 +148,11 @@ class Subscriber(ProjectBaseMixin): def link_to_unsubscribe(self): """Link to unsubscribe.""" schema = settings.SCHEMA_URI - site_domain = settings.SITE_DOMAIN_URI + site_domain = settings.DOMAIN_URI url = settings.SITE_REDIRECT_URL_UNSUBSCRIBE query = f'?code={self.update_code}' - return f'{schema}://{site_domain}{url}{query}' + country_code = '%s.' % self.country_code if self.country_code else '' + return f'{schema}://{country_code}{site_domain}{url}{query}' @property def active_subscriptions(self): From 8e6d433ffdcb3644e92bec85565d51473f779a02 Mon Sep 17 00:00:00 2001 From: dormantman Date: Tue, 21 Jan 2020 14:39:49 +0300 Subject: [PATCH 4/5] Added localization to subscribes --- apps/notification/models.py | 15 +++++++------- apps/notification/tasks.py | 20 +++++++++++-------- .../templates/notification/update_email.html | 9 +++++---- 3 files changed, 25 insertions(+), 19 deletions(-) diff --git a/apps/notification/models.py b/apps/notification/models.py index 4c221280..e0855c62 100644 --- a/apps/notification/models.py +++ b/apps/notification/models.py @@ -57,7 +57,6 @@ class SubscriberManager(models.Manager): obj.country_code = country_code obj.locale = locale obj.update_code = generate_string_code() - obj.save() else: @@ -66,10 +65,12 @@ class SubscriberManager(models.Manager): country_code=country_code, locale=locale, ) - if subscription_types is not None: - obj.subscription_types.set(subscription_types) - obj.subscribe_set.update(unsubscribe_date=None) - obj.save() + if subscription_types is None: + subscription_types = [] + + obj.subscription_types.set(subscription_types) + obj.subscribe_set.update(unsubscribe_date=None) + obj.save() return obj @@ -135,9 +136,9 @@ class Subscriber(ProjectBaseMixin): self.subscribe_set.update(unsubscribe_date=now()) if settings.USE_CELERY: - send_unsubscribe_email.delay(self.pk) + send_unsubscribe_email.delay(self.email) else: - send_unsubscribe_email(self.pk) + send_unsubscribe_email(self.email) @property def send_to(self): diff --git a/apps/notification/tasks.py b/apps/notification/tasks.py index 5129ad59..790c9650 100644 --- a/apps/notification/tasks.py +++ b/apps/notification/tasks.py @@ -3,6 +3,7 @@ from datetime import datetime from celery import shared_task from django.conf import settings from django.core.mail import send_mail +from django.utils.translation import gettext_lazy as _ from django.template.loader import get_template, render_to_string from main.models import SiteSettings @@ -27,11 +28,11 @@ def send_subscribes_update_email(email): socials_for_subscriber = socials.get(country_code) context = { - "title": "You have subscribed on news G&M", - "description": "
".join([ - name.get(subscriber.locale) + "title": _("You have subscribed on news G&M"), + "description": _("
".join([ + name.get(subscriber.locale) if subscriber.locale in name else name.get(next(iter(name.keys()))) for name in subscriber.subscription_types.values_list('name', flat=True) - ]), + ])), "code": subscriber.update_code, "link_to_unsubscribe": subscriber.link_to_unsubscribe, "twitter_page_url": socials_for_subscriber.twitter_page_url if socials_for_subscriber else '#', @@ -42,7 +43,7 @@ def send_subscribes_update_email(email): } send_mail( - subject="G&M Subscriptions", + subject=_("G&M Subscriptions"), message=render_to_string(settings.NOTIFICATION_SUBSCRIBE_TEMPLATE, context), from_email=settings.EMAIL_HOST_USER, recipient_list=[subscriber.send_to], @@ -52,8 +53,11 @@ def send_subscribes_update_email(email): @shared_task -def send_unsubscribe_email(subscriber_id): - subscriber = models.Subscriber.objects.get(id=subscriber_id) +def send_unsubscribe_email(email): + subscriber = models.Subscriber.objects.filter(email=email).first() + + if subscriber is None: + return country_code = subscriber.country_code @@ -66,7 +70,7 @@ def send_unsubscribe_email(subscriber_id): socials_for_subscriber = socials.get(country_code) context = { - "title": "You have successfully unsubscribed from G&M news", + "title": _("You have successfully unsubscribed from G&M news"), "description": "", "code": subscriber.update_code, "link_to_unsubscribe": subscriber.link_to_unsubscribe, diff --git a/project/templates/notification/update_email.html b/project/templates/notification/update_email.html index 0b4444c2..dd39f790 100644 --- a/project/templates/notification/update_email.html +++ b/project/templates/notification/update_email.html @@ -1,4 +1,5 @@ +{% load i18n %} @@ -40,9 +41,9 @@