Feature/subscription types

This commit is contained in:
Semyon Yekhmenin 2019-12-23 13:50:09 +00:00 committed by d.kuzmenko
parent cb8f0fe2d9
commit 3ff7246bea
5 changed files with 92 additions and 16 deletions

View File

@ -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'),
),
]

View File

@ -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:

View File

@ -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

View File

@ -5,9 +5,10 @@ from notification.views import common
app_name = "notification"
urlpatterns = [
path('subscribe/', common.SubscribeView.as_view(), name='subscribe'),
path('subscribe/<int:subscription_type_pk>', common.SubscribeView.as_view(), name='subscribe'),
path('subscribe-info/', common.SubscribeInfoAuthUserView.as_view(), name='check-code-auth'),
path('subscribe-info/<code>/', common.SubscribeInfoView.as_view(), name='check-code'),
path('unsubscribe/', common.UnsubscribeAuthUserView.as_view(), name='unsubscribe-auth'),
path('unsubscribe/<code>/', common.UnsubscribeView.as_view(), name='unsubscribe'),
]
path('subscription-types/', common.SubscriptionTypesView.as_view(), name='subscription-types'),
]

View File

@ -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