diff --git a/apps/notification/migrations/0011_auto_20200124_1351.py b/apps/notification/migrations/0011_auto_20200124_1351.py new file mode 100644 index 00000000..5b86c7ec --- /dev/null +++ b/apps/notification/migrations/0011_auto_20200124_1351.py @@ -0,0 +1,39 @@ +# Generated by Django 2.2.7 on 2020-01-24 13:51 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('notification', '0010_auto_20191231_0135'), + ] + + operations = [ + migrations.AddField( + model_name='subscribe', + name='old_subscriber_id', + field=models.PositiveIntegerField(null=True, verbose_name='Old subscriber id'), + ), + migrations.AddField( + model_name='subscribe', + name='old_subscription_type_id', + field=models.PositiveIntegerField(null=True, verbose_name='Old subscription type id'), + ), + migrations.AlterField( + model_name='subscribe', + name='subscribe_date', + field=models.DateTimeField(blank=True, default=None, null=True, verbose_name='Last subscribe date'), + ), + migrations.AlterField( + model_name='subscribe', + name='subscriber', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='notification.Subscriber'), + ), + migrations.AlterField( + model_name='subscribe', + name='subscription_type', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='notification.SubscriptionType'), + ), + ] diff --git a/apps/notification/models.py b/apps/notification/models.py index e0855c62..6f1ab33c 100644 --- a/apps/notification/models.py +++ b/apps/notification/models.py @@ -2,6 +2,7 @@ from django.conf import settings from django.db import models +from django.db.models import F from django.utils.timezone import now from django.utils.translation import ugettext_lazy as _ @@ -10,6 +11,7 @@ from location.models import Country from notification.tasks import send_unsubscribe_email from utils.methods import generate_string_code from utils.models import ProjectBaseMixin, TJSONField, TranslatedFieldsMixin +from notification.tasks import send_unsubscribe_email class SubscriptionType(ProjectBaseMixin, TranslatedFieldsMixin): @@ -133,7 +135,12 @@ class Subscriber(ProjectBaseMixin): def unsubscribe(self, query: dict): """Unsubscribe user.""" - self.subscribe_set.update(unsubscribe_date=now()) + + self.subscribe_set.update( + unsunbscribe_date=now(), + old_subscriber_id=F('subscriber_id'), + old_subscription_type_id=F('subscription_type_id') + ).update(subscriber_id=None, subscription_type_id=None) if settings.USE_CELERY: send_unsubscribe_email.delay(self.email) @@ -166,15 +173,20 @@ class SubscribeQuerySet(models.QuerySet): """Fetches active subscriptions.""" return self.exclude(unsubscribe_date__isnull=not switcher) + def subscription_history(self, subscriber_id: int): + return self.filter(old_subscriber_id=subscriber_id) + class Subscribe(ProjectBaseMixin): """Subscribe model.""" - - subscribe_date = models.DateTimeField(_('Last subscribe date'), blank=True, null=True, default=now) + subscribe_date = models.DateTimeField(_('Last subscribe date'), default=now(), blank=True, null=True) unsubscribe_date = models.DateTimeField(_('Last unsubscribe date'), blank=True, null=True, default=None) - subscriber = models.ForeignKey(Subscriber, on_delete=models.CASCADE) - subscription_type = models.ForeignKey(SubscriptionType, on_delete=models.CASCADE) + subscriber = models.ForeignKey(Subscriber, on_delete=models.CASCADE, null=True) + subscription_type = models.ForeignKey(SubscriptionType, on_delete=models.CASCADE, null=True) + + old_subscriber_id = models.PositiveIntegerField(_("Old subscriber id"), null=True) + old_subscription_type_id = models.PositiveIntegerField(_("Old subscription type id"), null=True) objects = SubscribeQuerySet.as_manager() @@ -183,3 +195,12 @@ class Subscribe(ProjectBaseMixin): verbose_name = _('Subscribe') verbose_name_plural = _('Subscribes') + + def save(self, *args, **kwargs): + if self.subscriber is not None: + self.old_subscriber_id = self.subscriber.pk + + if self.subscription_type is not None: + self.old_subscription_type_id = self.subscription_type.pk + + return super().save(*args, **kwargs) diff --git a/apps/notification/serializers/common.py b/apps/notification/serializers/common.py index 869879cb..48caee48 100644 --- a/apps/notification/serializers/common.py +++ b/apps/notification/serializers/common.py @@ -166,3 +166,14 @@ class SubscribeSerializer(serializers.ModelSerializer): 'subscription_types', 'link_to_unsubscribe', ) + + +class UnsubscribeSerializer(serializers.ModelSerializer): + email = serializers.EmailField(read_only=True, required=False, source='send_to') + subscription_types = SubscriptionTypeSerializer(source='active_subscriptions', read_only=True, many=True) + + class Meta: + """Meta class.""" + + model = models.Subscriber + fields = SubscribeSerializer.Meta.fields diff --git a/apps/notification/tasks.py b/apps/notification/tasks.py index 790c9650..3f9f7249 100644 --- a/apps/notification/tasks.py +++ b/apps/notification/tasks.py @@ -3,7 +3,6 @@ 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 diff --git a/apps/notification/views/common.py b/apps/notification/views/common.py index b6584394..bb6c9d6b 100644 --- a/apps/notification/views/common.py +++ b/apps/notification/views/common.py @@ -70,7 +70,7 @@ class UnsubscribeView(generics.UpdateAPIView): queryset = models.Subscriber.objects.all() serializer_class = serializers.SubscribeSerializer - def patch(self, request, *args, **kw): + def put(self, request, *args, **kw): obj = self.get_object() obj.unsubscribe(request.query_params) serializer = self.get_serializer(instance=obj)