Merge branch 'feature/cascade-update-roles' into develop

This commit is contained in:
Kuroshini 2020-01-29 22:49:56 +03:00
commit 2d5be7bfac
3 changed files with 23 additions and 2 deletions

View File

@ -13,6 +13,7 @@ from django.utils.http import urlsafe_base64_encode
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from rest_framework.authtoken.models import Token from rest_framework.authtoken.models import Token
from collections import Counter from collections import Counter
from typing import List
from authorization.models import Application from authorization.models import Application
from establishment.models import Establishment, EstablishmentSubType from establishment.models import Establishment, EstablishmentSubType
@ -435,6 +436,15 @@ class User(AbstractUser):
result.append(item.id) result.append(item.id)
return set(result) return set(result)
def set_roles(self, ids: List(int)):
"""
Set user roles
:param ids: list of role ids
:return: bool
"""
self.roles.set(Role.objects.filter(id__in=ids))
return self
class UserRoleQueryset(models.QuerySet): class UserRoleQueryset(models.QuerySet):
"""QuerySet for model UserRole.""" """QuerySet for model UserRole."""

View File

@ -19,7 +19,7 @@ class _SiteSettingsSerializer(serializers.ModelSerializer):
class BackUserSerializer(UserSerializer): class BackUserSerializer(UserSerializer):
last_country = _SiteSettingsSerializer(read_only=True) last_country = _SiteSettingsSerializer(read_only=True)
roles = RoleBaseSerializer(many=True, read_only=True) roles = RoleBaseSerializer(many=True)
class Meta(UserSerializer.Meta): class Meta(UserSerializer.Meta):
fields = ( fields = (
@ -115,6 +115,7 @@ class BackDetailUserSerializer(BackUserSerializer):
def create(self, validated_data): def create(self, validated_data):
subscriptions_list = [] subscriptions_list = []
if 'subscription_types' in validated_data: if 'subscription_types' in validated_data:
subscriptions_list = validated_data.pop('subscription_types') subscriptions_list = validated_data.pop('subscription_types')
@ -127,11 +128,17 @@ class BackDetailUserSerializer(BackUserSerializer):
def update(self, instance, validated_data): def update(self, instance, validated_data):
subscriptions_list = [] subscriptions_list = []
if 'subscription_types' in validated_data: if 'subscription_types' in validated_data:
subscriptions_list = validated_data.pop('subscription_types') subscriptions_list = validated_data.pop('subscription_types')
if 'roles' in validated_data:
roles_ids = [role['id'] for role in validated_data.pop('roles') if 'id' in role]
instance.set_roles(roles_ids)
instance = super().update(instance, validated_data) instance = super().update(instance, validated_data)
subscriptions_handler(subscriptions_list, instance) subscriptions_handler(subscriptions_list, instance)
return instance return instance

View File

@ -8,6 +8,7 @@ from rest_framework import serializers
from rest_framework import validators as rest_validators from rest_framework import validators as rest_validators
from account import models, tasks from account import models, tasks
from account.models import User, Role
from main.serializers.common import NavigationBarPermissionBaseSerializer from main.serializers.common import NavigationBarPermissionBaseSerializer
from notification.models import Subscribe, Subscriber from notification.models import Subscribe, Subscriber
from utils import exceptions as utils_exceptions from utils import exceptions as utils_exceptions
@ -27,7 +28,7 @@ def subscriptions_handler(subscriptions_list, user):
'user': user, 'user': user,
'email': user.email, 'email': user.email,
'ip_address': user.last_ip, 'ip_address': user.last_ip,
'country_code': user.last_country.country.code if user.last_country else None, 'country_code': user.last_country.country.code if user.last_country and user.last_country.country else None,
'locale': user.locale, 'locale': user.locale,
'update_code': generate_string_code(), 'update_code': generate_string_code(),
} }
@ -42,6 +43,7 @@ def subscriptions_handler(subscriptions_list, user):
class RoleBaseSerializer(serializers.ModelSerializer): class RoleBaseSerializer(serializers.ModelSerializer):
"""Serializer for model Role.""" """Serializer for model Role."""
id = serializers.IntegerField()
role_display = serializers.CharField(source='get_role_display', read_only=True) role_display = serializers.CharField(source='get_role_display', read_only=True)
navigation_bar_permission = NavigationBarPermissionBaseSerializer(read_only=True) navigation_bar_permission = NavigationBarPermissionBaseSerializer(read_only=True)
country_code = serializers.CharField(source='country.code', read_only=True, allow_null=True) country_code = serializers.CharField(source='country.code', read_only=True, allow_null=True)
@ -133,6 +135,7 @@ class UserSerializer(serializers.ModelSerializer):
def update(self, instance, validated_data): def update(self, instance, validated_data):
"""Override update method""" """Override update method"""
subscriptions_list = [] subscriptions_list = []
if 'subscription_types' in validated_data: if 'subscription_types' in validated_data:
subscriptions_list = validated_data.pop('subscription_types') subscriptions_list = validated_data.pop('subscription_types')
@ -164,6 +167,7 @@ class UserSerializer(serializers.ModelSerializer):
emails=[validated_data['email'], ]) emails=[validated_data['email'], ])
subscriptions_handler(subscriptions_list, instance) subscriptions_handler(subscriptions_list, instance)
return instance return instance