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) ).values_list('object_id', flat=True)
@property @property
def subscriptions(self): def subscription_types(self):
result = [] result = []
for subscription in self.subscriber.all(): for subscription in self.subscriber.all():
for item in subscription.active_subscriptions: for item in subscription.active_subscriptions:

View File

@ -3,7 +3,7 @@ from rest_framework import serializers
from account import models from account import models
from account.models import User from account.models import User
from account.serializers import RoleBaseSerializer from account.serializers import RoleBaseSerializer, subscriptions_handler
from main.models import SiteSettings from main.models import SiteSettings
@ -20,6 +20,14 @@ class _SiteSettingsSerializer(serializers.ModelSerializer):
class BackUserSerializer(serializers.ModelSerializer): class BackUserSerializer(serializers.ModelSerializer):
last_country = _SiteSettingsSerializer(read_only=True) last_country = _SiteSettingsSerializer(read_only=True)
roles = RoleBaseSerializer(many=True, 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: class Meta:
model = User model = User
@ -58,13 +66,18 @@ class BackUserSerializer(serializers.ModelSerializer):
'locale', 'locale',
'last_ip', 'last_ip',
'last_country', 'last_country',
'subscriptions',
) )
def create(self, validated_data): 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 = super().create(validated_data)
user.set_password(validated_data['password']) user.set_password(validated_data['password'])
user.save() user.save()
subscriptions_handler(subscriptions_list, user)
return user return user
@ -101,15 +114,31 @@ class BackDetailUserSerializer(BackUserSerializer):
'old_password', 'old_password',
'last_login', 'last_login',
'date_joined', 'date_joined',
'subscriptions', 'last_ip',
'last_country',
) )
def create(self, validated_data): 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 = super().create(validated_data)
user.set_password(validated_data['password']) user.set_password(validated_data['password'])
user.save() user.save()
subscriptions_handler(subscriptions_list, user)
return 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 UserRoleSerializer(serializers.ModelSerializer):
class Meta: class Meta:

View File

@ -9,9 +9,34 @@ from rest_framework import validators as rest_validators
from account import models, tasks from account import models, tasks
from main.serializers.common import NavigationBarPermissionBaseSerializer 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 exceptions as utils_exceptions
from utils import methods as utils_methods 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): class RoleBaseSerializer(serializers.ModelSerializer):
@ -42,6 +67,14 @@ class UserSerializer(serializers.ModelSerializer):
validators=(rest_validators.UniqueValidator(queryset=models.User.objects.all()),), validators=(rest_validators.UniqueValidator(queryset=models.User.objects.all()),),
required=False) required=False)
roles = RoleBaseSerializer(many=True, 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: class Meta:
model = models.User model = models.User
@ -66,14 +99,16 @@ class UserSerializer(serializers.ModelSerializer):
'cropped_image_url': {'required': False, }, 'cropped_image_url': {'required': False, },
'newsletter': {'required': False, }, 'newsletter': {'required': False, },
} }
read_only_fields = (
'subscriptions',
)
def create(self, validated_data): 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) user = super(UserSerializer, self).create(validated_data)
validated_data['user'] = user validated_data['user'] = user
Subscriber.objects.make_subscriber(**validated_data) Subscriber.objects.make_subscriber(**validated_data)
subscriptions_handler(subscriptions_list, user)
return user return user
def validate_email(self, value): def validate_email(self, value):
@ -91,6 +126,10 @@ class UserSerializer(serializers.ModelSerializer):
def update(self, instance, validated_data): def update(self, instance, validated_data):
"""Override update method""" """Override update method"""
subscriptions_list = []
if 'subscription_types' in validated_data:
subscriptions_list = validated_data.pop('subscription_types')
old_email = instance.email old_email = instance.email
instance = super().update(instance, validated_data) instance = super().update(instance, validated_data)
if 'email' in validated_data: if 'email' in validated_data:
@ -109,6 +148,8 @@ class UserSerializer(serializers.ModelSerializer):
user_id=instance.id, user_id=instance.id,
country_code=self.context.get('request').country_code, country_code=self.context.get('request').country_code,
emails=[validated_data['email'], ]) emails=[validated_data['email'], ])
subscriptions_handler(subscriptions_list, instance)
return instance return instance