subscription_type list for user

This commit is contained in:
alex 2020-01-15 17:06:09 +03:00
parent 129201d3a9
commit f15ac47102
3 changed files with 78 additions and 8 deletions

View File

@ -341,7 +341,7 @@ class User(AbstractUser):
).values_list('object_id', flat=True)
@property
def subscriptions(self):
def subscription_types(self):
result = []
for subscription in self.subscriber.all():
for item in subscription.active_subscriptions:

View File

@ -3,7 +3,7 @@ from rest_framework import serializers
from account import models
from account.models import User
from account.serializers import RoleBaseSerializer
from account.serializers import RoleBaseSerializer, subscriptions_handler
from main.models import SiteSettings
@ -20,6 +20,14 @@ class _SiteSettingsSerializer(serializers.ModelSerializer):
class BackUserSerializer(serializers.ModelSerializer):
last_country = _SiteSettingsSerializer(read_only=True)
roles = RoleBaseSerializer(many=True, read_only=True)
subscriptions = serializers.ListField(
source='subscription_types',
allow_null=True,
allow_empty=True,
child=serializers.IntegerField(min_value=1),
required=False,
help_text='list of subscription_types id',
)
class Meta:
model = User
@ -58,13 +66,18 @@ class BackUserSerializer(serializers.ModelSerializer):
'locale',
'last_ip',
'last_country',
'subscriptions',
)
def create(self, validated_data):
subscriptions_list = []
if 'subscription_types' in validated_data:
subscriptions_list = validated_data.pop('subscription_types')
user = super().create(validated_data)
user.set_password(validated_data['password'])
user.save()
subscriptions_handler(subscriptions_list, user)
return user
@ -101,15 +114,31 @@ class BackDetailUserSerializer(BackUserSerializer):
'old_password',
'last_login',
'date_joined',
'subscriptions',
'last_ip',
'last_country',
)
def create(self, validated_data):
subscriptions_list = []
if 'subscription_types' in validated_data:
subscriptions_list = validated_data.pop('subscription_types')
user = super().create(validated_data)
user.set_password(validated_data['password'])
user.save()
subscriptions_handler(subscriptions_list, user)
return user
def update(self, instance, validated_data):
subscriptions_list = []
if 'subscription_types' in validated_data:
subscriptions_list = validated_data.pop('subscription_types')
instance = super().update(instance, validated_data)
subscriptions_handler(subscriptions_list, instance)
return instance
class UserRoleSerializer(serializers.ModelSerializer):
class Meta:

View File

@ -9,9 +9,34 @@ from rest_framework import validators as rest_validators
from account import models, tasks
from main.serializers.common import NavigationBarPermissionBaseSerializer
from notification.models import Subscriber
from notification.models import Subscribe, Subscriber
from utils import exceptions as utils_exceptions
from utils import methods as utils_methods
from utils.methods import generate_string_code
def subscriptions_handler(subscriptions_list, user):
"""
create or update subscriptions for user
"""
Subscribe.objects.filter(subscriber__user=user).delete()
subscriber, _ = Subscriber.objects.get_or_create(
email=user.email,
defaults={
'user': user,
'email': user.email,
'ip_address': user.last_ip,
'country_code': user.last_country.country.code if user.last_country else None,
'locale': user.locale,
'update_code': generate_string_code(),
}
)
for subscription in subscriptions_list:
Subscribe.objects.create(
subscriber=subscriber,
subscription_type_id=subscription,
)
class RoleBaseSerializer(serializers.ModelSerializer):
@ -42,6 +67,14 @@ class UserSerializer(serializers.ModelSerializer):
validators=(rest_validators.UniqueValidator(queryset=models.User.objects.all()),),
required=False)
roles = RoleBaseSerializer(many=True, read_only=True)
subscriptions = serializers.ListField(
source='subscription_types',
allow_null=True,
allow_empty=True,
child=serializers.IntegerField(min_value=1),
required=False,
help_text='list of subscription_types id',
)
class Meta:
model = models.User
@ -66,14 +99,16 @@ class UserSerializer(serializers.ModelSerializer):
'cropped_image_url': {'required': False, },
'newsletter': {'required': False, },
}
read_only_fields = (
'subscriptions',
)
def create(self, validated_data):
subscriptions_list = []
if 'subscription_types' in validated_data:
subscriptions_list = validated_data.pop('subscription_types')
user = super(UserSerializer, self).create(validated_data)
validated_data['user'] = user
Subscriber.objects.make_subscriber(**validated_data)
subscriptions_handler(subscriptions_list, user)
return user
def validate_email(self, value):
@ -91,6 +126,10 @@ class UserSerializer(serializers.ModelSerializer):
def update(self, instance, validated_data):
"""Override update method"""
subscriptions_list = []
if 'subscription_types' in validated_data:
subscriptions_list = validated_data.pop('subscription_types')
old_email = instance.email
instance = super().update(instance, validated_data)
if 'email' in validated_data:
@ -109,6 +148,8 @@ class UserSerializer(serializers.ModelSerializer):
user_id=instance.id,
country_code=self.context.get('request').country_code,
emails=[validated_data['email'], ])
subscriptions_handler(subscriptions_list, instance)
return instance