diff --git a/apps/notification/migrations/0004_auto_20191118_1307.py b/apps/notification/migrations/0004_auto_20191118_1307.py new file mode 100644 index 00000000..fe908f5a --- /dev/null +++ b/apps/notification/migrations/0004_auto_20191118_1307.py @@ -0,0 +1,35 @@ +# Generated by Django 2.2.7 on 2019-11-18 13:07 + +from django.db import migrations, models +import django.db.models.deletion +import django.utils.timezone +import utils.models + + +class Migration(migrations.Migration): + + dependencies = [ + ('notification', '0003_auto_20191116_1248'), + ] + + operations = [ + migrations.CreateModel( + name='SubscriptionType', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', models.DateTimeField(default=django.utils.timezone.now, editable=False, verbose_name='Date created')), + ('modified', models.DateTimeField(auto_now=True, verbose_name='Date updated')), + ('index_name', models.CharField(max_length=255, unique=True, verbose_name='Index name')), + ('name', utils.models.TJSONField(blank=True, default=None, help_text='{"en-GB":"some text"}', null=True, verbose_name='name')), + ], + options={ + 'abstract': False, + }, + bases=(models.Model, utils.models.TranslatedFieldsMixin), + ), + migrations.AddField( + model_name='subscriber', + name='subscription_type', + field=models.ForeignKey(default=None, 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 a5cde50b..a7eebbe8 100644 --- a/apps/notification/models.py +++ b/apps/notification/models.py @@ -4,7 +4,14 @@ from django.db import models from django.utils.translation import ugettext_lazy as _ from account.models import User from utils.methods import generate_string_code -from utils.models import ProjectBaseMixin +from utils.models import ProjectBaseMixin, TranslatedFieldsMixin, TJSONField + + +class SubscriptionType(ProjectBaseMixin, TranslatedFieldsMixin): + index_name = models.CharField(max_length=255, verbose_name=_('Index name'), unique=True) + name = TJSONField(blank=True, null=True, default=None, + verbose_name=_('name'), + help_text='{"en-GB":"some text"}') # todo: associate user & subscriber after users registration @@ -12,7 +19,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, *args, **kwargs): + locale=None, subscription_type=None, *args, **kwargs): """Make subscriber and update info.""" # search existing object if not user: @@ -35,10 +42,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.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_type=subscription_type) return obj def associate_user(self, user): @@ -98,6 +107,8 @@ class Subscriber(ProjectBaseMixin): ) old_id = models.PositiveIntegerField(_('old id'), blank=True, null=True, default=None) + subscription_type = models.ForeignKey(SubscriptionType, on_delete=models.CASCADE, null=True, default=None) + objects = SubscriberManager.from_queryset(SubscriberQuerySet)() class Meta: diff --git a/apps/notification/serializers/common.py b/apps/notification/serializers/common.py index f74e4c19..c9d6f59e 100644 --- a/apps/notification/serializers/common.py +++ b/apps/notification/serializers/common.py @@ -5,16 +5,35 @@ from notification import models from utils.methods import get_user_ip +class SubscriptionTypeSerializer(serializers.ModelSerializer): + """Subscription type serializer.""" + + class Meta: + """Meta class.""" + + model = models.SubscriptionType + fields = ( + 'id', + 'index_name', + 'name_translated', + ) + + class SubscribeSerializer(serializers.ModelSerializer): """Subscribe serializer.""" email = serializers.EmailField(required=False, source='send_to') + subscription_type = SubscriptionTypeSerializer(read_only=True) class Meta: """Meta class.""" model = models.Subscriber - fields = ('email', 'state',) + fields = ( + 'email', + 'subscription_type', + 'state', + ) read_only_fields = ('state',) def validate(self, attrs): @@ -38,9 +57,16 @@ class SubscribeSerializer(serializers.ModelSerializer): 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() + return attrs def create(self, validated_data): """Create obj.""" - obj = models.Subscriber.objects.make_subscriber(**validated_data) - return obj + subscriber = models.Subscriber.objects.make_subscriber(**validated_data) + return subscriber diff --git a/apps/notification/urls/common.py b/apps/notification/urls/common.py index 842aa642..0f7571f5 100644 --- a/apps/notification/urls/common.py +++ b/apps/notification/urls/common.py @@ -5,9 +5,10 @@ from notification.views import common app_name = "notification" urlpatterns = [ - path('subscribe/', common.SubscribeView.as_view(), name='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'), path('unsubscribe/', common.UnsubscribeAuthUserView.as_view(), name='unsubscribe-auth'), path('unsubscribe//', common.UnsubscribeView.as_view(), name='unsubscribe'), -] \ No newline at end of file + path('subscription-types/', common.SubscriptionTypesView.as_view(), name='subscription-types'), +] diff --git a/apps/notification/views/common.py b/apps/notification/views/common.py index ccb3cd69..cba9c343 100644 --- a/apps/notification/views/common.py +++ b/apps/notification/views/common.py @@ -30,20 +30,16 @@ class SubscribeInfoView(generics.RetrieveAPIView): serializer_class = serializers.SubscribeSerializer -class SubscribeInfoAuthUserView(generics.RetrieveAPIView): +class SubscribeInfoAuthUserView(generics.ListAPIView): """Subscribe info auth user view.""" permission_classes = (permissions.IsAuthenticated, ) - queryset = models.Subscriber.objects.all() serializer_class = serializers.SubscribeSerializer - def get_object(self): + def get_queryset(self): user = self.request.user - queryset = self.filter_queryset(self.get_queryset()) - filter_kwargs = {'user': user} - obj = get_object_or_404(queryset, **filter_kwargs) - self.check_object_permissions(self.request, obj) - return obj + queryset = self.filter_queryset(models.Subscriber.objects.all()) + return queryset.filter(user=user) class UnsubscribeView(generics.GenericAPIView): @@ -76,3 +72,10 @@ class UnsubscribeAuthUserView(generics.GenericAPIView): serializer = self.get_serializer(instance=obj) return Response(data=serializer.data) + +class SubscriptionTypesView(generics.ListAPIView): + pagination_class = None + permission_classes = (permissions.AllowAny,) + queryset = models.SubscriptionType.objects.all() + serializer_class = serializers.SubscriptionTypeSerializer +