diff --git a/apps/account/models.py b/apps/account/models.py index e82d5189..c4d65d77 100644 --- a/apps/account/models.py +++ b/apps/account/models.py @@ -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: diff --git a/apps/account/serializers/back.py b/apps/account/serializers/back.py index 97e6e12f..deac6f6c 100644 --- a/apps/account/serializers/back.py +++ b/apps/account/serializers/back.py @@ -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: diff --git a/apps/account/serializers/common.py b/apps/account/serializers/common.py index 7929ad77..02d75950 100644 --- a/apps/account/serializers/common.py +++ b/apps/account/serializers/common.py @@ -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