Merge branch 'feature/subscription-types' into 'develop'
Feature/subscription types See merge request gm/gm-backend!128
This commit is contained in:
commit
dd11a4aef8
35
apps/notification/migrations/0004_auto_20191118_1307.py
Normal file
35
apps/notification/migrations/0004_auto_20191118_1307.py
Normal 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'),
|
||||||
|
),
|
||||||
|
]
|
||||||
|
|
@ -4,7 +4,14 @@ from django.db import models
|
||||||
from django.utils.translation import ugettext_lazy as _
|
from django.utils.translation import ugettext_lazy as _
|
||||||
from account.models import User
|
from account.models import User
|
||||||
from utils.methods import generate_string_code
|
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
|
# todo: associate user & subscriber after users registration
|
||||||
|
|
@ -12,7 +19,7 @@ class SubscriberManager(models.Manager):
|
||||||
"""Extended manager for Subscriber model."""
|
"""Extended manager for Subscriber model."""
|
||||||
|
|
||||||
def make_subscriber(self, email=None, user=None, ip_address=None, country_code=None,
|
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."""
|
"""Make subscriber and update info."""
|
||||||
# search existing object
|
# search existing object
|
||||||
if not user:
|
if not user:
|
||||||
|
|
@ -35,10 +42,12 @@ class SubscriberManager(models.Manager):
|
||||||
obj.locale = locale
|
obj.locale = locale
|
||||||
obj.state = self.model.USABLE
|
obj.state = self.model.USABLE
|
||||||
obj.update_code = generate_string_code()
|
obj.update_code = generate_string_code()
|
||||||
|
obj.subscription_type = subscription_type
|
||||||
obj.save()
|
obj.save()
|
||||||
else:
|
else:
|
||||||
obj = self.model.objects.create(user=user, email=email, ip_address=ip_address,
|
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
|
return obj
|
||||||
|
|
||||||
def associate_user(self, user):
|
def associate_user(self, user):
|
||||||
|
|
@ -98,6 +107,8 @@ class Subscriber(ProjectBaseMixin):
|
||||||
)
|
)
|
||||||
old_id = models.PositiveIntegerField(_('old id'), blank=True, null=True, default=None)
|
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)()
|
objects = SubscriberManager.from_queryset(SubscriberQuerySet)()
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
|
|
|
||||||
|
|
@ -5,16 +5,35 @@ from notification import models
|
||||||
from utils.methods import get_user_ip
|
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):
|
class SubscribeSerializer(serializers.ModelSerializer):
|
||||||
"""Subscribe serializer."""
|
"""Subscribe serializer."""
|
||||||
|
|
||||||
email = serializers.EmailField(required=False, source='send_to')
|
email = serializers.EmailField(required=False, source='send_to')
|
||||||
|
subscription_type = SubscriptionTypeSerializer(read_only=True)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
"""Meta class."""
|
"""Meta class."""
|
||||||
|
|
||||||
model = models.Subscriber
|
model = models.Subscriber
|
||||||
fields = ('email', 'state',)
|
fields = (
|
||||||
|
'email',
|
||||||
|
'subscription_type',
|
||||||
|
'state',
|
||||||
|
)
|
||||||
read_only_fields = ('state',)
|
read_only_fields = ('state',)
|
||||||
|
|
||||||
def validate(self, attrs):
|
def validate(self, attrs):
|
||||||
|
|
@ -38,9 +57,16 @@ class SubscribeSerializer(serializers.ModelSerializer):
|
||||||
attrs['ip_address'] = get_user_ip(request)
|
attrs['ip_address'] = get_user_ip(request)
|
||||||
if user.is_authenticated:
|
if user.is_authenticated:
|
||||||
attrs['user'] = user
|
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
|
return attrs
|
||||||
|
|
||||||
def create(self, validated_data):
|
def create(self, validated_data):
|
||||||
"""Create obj."""
|
"""Create obj."""
|
||||||
obj = models.Subscriber.objects.make_subscriber(**validated_data)
|
subscriber = models.Subscriber.objects.make_subscriber(**validated_data)
|
||||||
return obj
|
return subscriber
|
||||||
|
|
|
||||||
|
|
@ -5,9 +5,10 @@ from notification.views import common
|
||||||
app_name = "notification"
|
app_name = "notification"
|
||||||
|
|
||||||
urlpatterns = [
|
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/', common.SubscribeInfoAuthUserView.as_view(), name='check-code-auth'),
|
||||||
path('subscribe-info/<code>/', common.SubscribeInfoView.as_view(), name='check-code'),
|
path('subscribe-info/<code>/', common.SubscribeInfoView.as_view(), name='check-code'),
|
||||||
path('unsubscribe/', common.UnsubscribeAuthUserView.as_view(), name='unsubscribe-auth'),
|
path('unsubscribe/', common.UnsubscribeAuthUserView.as_view(), name='unsubscribe-auth'),
|
||||||
path('unsubscribe/<code>/', common.UnsubscribeView.as_view(), name='unsubscribe'),
|
path('unsubscribe/<code>/', common.UnsubscribeView.as_view(), name='unsubscribe'),
|
||||||
]
|
path('subscription-types/', common.SubscriptionTypesView.as_view(), name='subscription-types'),
|
||||||
|
]
|
||||||
|
|
|
||||||
|
|
@ -30,20 +30,16 @@ class SubscribeInfoView(generics.RetrieveAPIView):
|
||||||
serializer_class = serializers.SubscribeSerializer
|
serializer_class = serializers.SubscribeSerializer
|
||||||
|
|
||||||
|
|
||||||
class SubscribeInfoAuthUserView(generics.RetrieveAPIView):
|
class SubscribeInfoAuthUserView(generics.ListAPIView):
|
||||||
"""Subscribe info auth user view."""
|
"""Subscribe info auth user view."""
|
||||||
|
|
||||||
permission_classes = (permissions.IsAuthenticated, )
|
permission_classes = (permissions.IsAuthenticated, )
|
||||||
queryset = models.Subscriber.objects.all()
|
|
||||||
serializer_class = serializers.SubscribeSerializer
|
serializer_class = serializers.SubscribeSerializer
|
||||||
|
|
||||||
def get_object(self):
|
def get_queryset(self):
|
||||||
user = self.request.user
|
user = self.request.user
|
||||||
queryset = self.filter_queryset(self.get_queryset())
|
queryset = self.filter_queryset(models.Subscriber.objects.all())
|
||||||
filter_kwargs = {'user': user}
|
return queryset.filter(user=user)
|
||||||
obj = get_object_or_404(queryset, **filter_kwargs)
|
|
||||||
self.check_object_permissions(self.request, obj)
|
|
||||||
return obj
|
|
||||||
|
|
||||||
|
|
||||||
class UnsubscribeView(generics.GenericAPIView):
|
class UnsubscribeView(generics.GenericAPIView):
|
||||||
|
|
@ -76,3 +72,10 @@ class UnsubscribeAuthUserView(generics.GenericAPIView):
|
||||||
serializer = self.get_serializer(instance=obj)
|
serializer = self.get_serializer(instance=obj)
|
||||||
return Response(data=serializer.data)
|
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
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user