From 6a6d623ef3da39265cb1a1380fbcf21050766bf6 Mon Sep 17 00:00:00 2001 From: "a.gorbunov" Date: Wed, 29 Jan 2020 09:03:45 +0000 Subject: [PATCH 1/3] update roles list --- apps/account/serializers/back.py | 10 ++++++++-- apps/account/serializers/common.py | 24 +++++++++++++++++++++++- 2 files changed, 31 insertions(+), 3 deletions(-) diff --git a/apps/account/serializers/back.py b/apps/account/serializers/back.py index 2baaf656..4fba1c6f 100644 --- a/apps/account/serializers/back.py +++ b/apps/account/serializers/back.py @@ -2,7 +2,7 @@ from rest_framework import serializers from account import models -from account.serializers import RoleBaseSerializer, UserSerializer, subscriptions_handler +from account.serializers import RoleBaseSerializer, UserSerializer, subscriptions_handler, roles_handler from main.models import SiteSettings @@ -19,7 +19,7 @@ class _SiteSettingsSerializer(serializers.ModelSerializer): class BackUserSerializer(UserSerializer): last_country = _SiteSettingsSerializer(read_only=True) - roles = RoleBaseSerializer(many=True, read_only=True) + roles = RoleBaseSerializer(many=True) class Meta(UserSerializer.Meta): fields = ( @@ -115,6 +115,7 @@ class BackDetailUserSerializer(BackUserSerializer): def create(self, validated_data): subscriptions_list = [] + if 'subscription_types' in validated_data: subscriptions_list = validated_data.pop('subscription_types') @@ -127,11 +128,16 @@ class BackDetailUserSerializer(BackUserSerializer): def update(self, instance, validated_data): subscriptions_list = [] + if 'subscription_types' in validated_data: subscriptions_list = validated_data.pop('subscription_types') + if 'roles' in validated_data: + instance = roles_handler(validated_data.pop('roles'), instance) + instance = super().update(instance, validated_data) subscriptions_handler(subscriptions_list, instance) + return instance diff --git a/apps/account/serializers/common.py b/apps/account/serializers/common.py index 197c3a84..790cbfdf 100644 --- a/apps/account/serializers/common.py +++ b/apps/account/serializers/common.py @@ -8,6 +8,7 @@ from rest_framework import serializers from rest_framework import validators as rest_validators from account import models, tasks +from account.models import User, Role from main.serializers.common import NavigationBarPermissionBaseSerializer from notification.models import Subscribe, Subscriber from utils import exceptions as utils_exceptions @@ -16,6 +17,24 @@ from utils.methods import generate_string_code from phonenumber_field.serializerfields import PhoneNumberField +def roles_handler(roles_list: set, user: User) -> User: + """ + Sync roles for user + :param roles_list: list of user roles + :param user: user + :return: bool + """ + if not roles_list: + user.roles.clear() + return user + + ids = list(map(lambda role: role["id"] if "id" in role else None, roles_list)) + roles = Role.objects \ + .filter(id__in=ids) + user.roles.set(roles) + return user + + def subscriptions_handler(subscriptions_list, user): """ create or update subscriptions for user @@ -27,7 +46,7 @@ def subscriptions_handler(subscriptions_list, user): 'user': user, 'email': user.email, '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, 'update_code': generate_string_code(), } @@ -42,6 +61,7 @@ def subscriptions_handler(subscriptions_list, user): class RoleBaseSerializer(serializers.ModelSerializer): """Serializer for model Role.""" + id = serializers.IntegerField() role_display = serializers.CharField(source='get_role_display', read_only=True) navigation_bar_permission = NavigationBarPermissionBaseSerializer(read_only=True) country_code = serializers.CharField(source='country.code', read_only=True, allow_null=True) @@ -133,6 +153,7 @@ 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') @@ -164,6 +185,7 @@ class UserSerializer(serializers.ModelSerializer): emails=[validated_data['email'], ]) subscriptions_handler(subscriptions_list, instance) + return instance From f3ca4a8de9eb192be039bc9493fa0658351aa2d9 Mon Sep 17 00:00:00 2001 From: "a.gorbunov" Date: Wed, 29 Jan 2020 18:20:21 +0000 Subject: [PATCH 2/3] place method to user class --- apps/account/models.py | 9 +++++++++ apps/account/serializers/back.py | 8 ++++++-- apps/account/serializers/common.py | 18 ------------------ 3 files changed, 15 insertions(+), 20 deletions(-) diff --git a/apps/account/models.py b/apps/account/models.py index 08944f0c..77f4d951 100644 --- a/apps/account/models.py +++ b/apps/account/models.py @@ -435,6 +435,15 @@ class User(AbstractUser): result.append(item.id) return set(result) + def set_roles(self, ids: set): + """ + 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): """QuerySet for model UserRole.""" diff --git a/apps/account/serializers/back.py b/apps/account/serializers/back.py index 4fba1c6f..af1029b5 100644 --- a/apps/account/serializers/back.py +++ b/apps/account/serializers/back.py @@ -2,7 +2,7 @@ from rest_framework import serializers from account import models -from account.serializers import RoleBaseSerializer, UserSerializer, subscriptions_handler, roles_handler +from account.serializers import RoleBaseSerializer, UserSerializer, subscriptions_handler from main.models import SiteSettings @@ -133,7 +133,11 @@ class BackDetailUserSerializer(BackUserSerializer): subscriptions_list = validated_data.pop('subscription_types') if 'roles' in validated_data: - instance = roles_handler(validated_data.pop('roles'), instance) + roles_ids = filter( + lambda filter_role: False if not filter_role else True, + map(lambda role: role["id"] if "id" in role else None, validated_data.pop("roles")) + ) + instance.set_roles(roles_ids) instance = super().update(instance, validated_data) subscriptions_handler(subscriptions_list, instance) diff --git a/apps/account/serializers/common.py b/apps/account/serializers/common.py index 790cbfdf..7ae6cb70 100644 --- a/apps/account/serializers/common.py +++ b/apps/account/serializers/common.py @@ -17,24 +17,6 @@ from utils.methods import generate_string_code from phonenumber_field.serializerfields import PhoneNumberField -def roles_handler(roles_list: set, user: User) -> User: - """ - Sync roles for user - :param roles_list: list of user roles - :param user: user - :return: bool - """ - if not roles_list: - user.roles.clear() - return user - - ids = list(map(lambda role: role["id"] if "id" in role else None, roles_list)) - roles = Role.objects \ - .filter(id__in=ids) - user.roles.set(roles) - return user - - def subscriptions_handler(subscriptions_list, user): """ create or update subscriptions for user From 62c25ac737cc5a1aa90ff35d828dd9aef9851730 Mon Sep 17 00:00:00 2001 From: Kuroshini Date: Wed, 29 Jan 2020 22:49:36 +0300 Subject: [PATCH 3/3] simplify code --- apps/account/models.py | 3 ++- apps/account/serializers/back.py | 5 +---- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/apps/account/models.py b/apps/account/models.py index 77f4d951..e67fef49 100644 --- a/apps/account/models.py +++ b/apps/account/models.py @@ -13,6 +13,7 @@ from django.utils.http import urlsafe_base64_encode from django.utils.translation import ugettext_lazy as _ from rest_framework.authtoken.models import Token from collections import Counter +from typing import List from authorization.models import Application from establishment.models import Establishment, EstablishmentSubType @@ -435,7 +436,7 @@ class User(AbstractUser): result.append(item.id) return set(result) - def set_roles(self, ids: set): + def set_roles(self, ids: List(int)): """ Set user roles :param ids: list of role ids diff --git a/apps/account/serializers/back.py b/apps/account/serializers/back.py index af1029b5..93e33fa1 100644 --- a/apps/account/serializers/back.py +++ b/apps/account/serializers/back.py @@ -133,10 +133,7 @@ class BackDetailUserSerializer(BackUserSerializer): subscriptions_list = validated_data.pop('subscription_types') if 'roles' in validated_data: - roles_ids = filter( - lambda filter_role: False if not filter_role else True, - map(lambda role: role["id"] if "id" in role else None, validated_data.pop("roles")) - ) + 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)