From cad6b1c917426cfeb77ac6eacdb520be80cc0717 Mon Sep 17 00:00:00 2001 From: Sokurov Idar Date: Fri, 28 May 2021 00:15:50 +0300 Subject: [PATCH] Fix change permissions when role has changed --- main/extra_func.py | 54 +++++++++++++++++++++++++++++++++++++++++++++- main/views.py | 19 ++-------------- 2 files changed, 55 insertions(+), 18 deletions(-) diff --git a/main/extra_func.py b/main/extra_func.py index e652a7e..27545da 100644 --- a/main/extra_func.py +++ b/main/extra_func.py @@ -6,6 +6,8 @@ from datetime import timedelta, date from typing import Union, Optional from django.contrib.auth import get_user_model +from django.contrib.auth.models import Permission +from django.contrib.contenttypes.models import ContentType from django.core.exceptions import ObjectDoesNotExist from django.core.handlers.wsgi import WSGIRequest from django.http import HttpResponseRedirect, HttpResponsePermanentRedirect @@ -123,6 +125,7 @@ def update_profile(user_profile: UserProfile) -> None: :return: Обновленный, в соответствие с текущими данными в Zendesk, профиль пользователя """ user = zenpy.get_user(user_profile.user.email) + update_permission(user_profile, user) user_profile.name = user.name user_profile.role = user.role user_profile.custom_role_id = user.custom_role_id if user.custom_role_id else 0 @@ -130,6 +133,52 @@ def update_profile(user_profile: UserProfile) -> None: user_profile.save() +def update_permission(user_profile: UserProfile, user: ZenpyUser): + """ + Функция обновляет права доступа пользователя в БД. + + :param user_profile: Профиль пользователя + :param user: Данные пользователя в Zendesk + """ + if user_profile.role != user.role: + user_profile.role = user.role + user_profile.save() + set_permission(user_profile.user) + del_permission(user_profile.user) + + +def set_permission(user: get_user_model()) -> None: + """ + Функция дает разрешение на просмотр страница администратора, если пользователь имеет роль admin. + + :param user: Авторизованный пользователь (получает разрешение, имея роль "admin") + """ + if user.userprofile.role == 'admin': + content_type = ContentType.objects.get_for_model(UserProfile) + permission = Permission.objects.get( + codename='has_control_access', + content_type=content_type, + ) + user.user_permissions.add(permission) + user.save() + + +def del_permission(user: get_user_model()) -> None: + """ + Функция забираеь разрешение на просмотр страница администратора, если пользователь не имеет роль admin. + + :param user: Авторизованный пользователь (теряет разрешение, не имея роль "admin") + """ + if user.userprofile.role == 'agent' and user.has_perm('main.has_control_access'): + content_type = ContentType.objects.get_for_model(UserProfile) + permission = Permission.objects.get( + codename='has_control_access', + content_type=content_type, + ) + user.user_permissions.remove(permission) + user.save() + + def check_user_exist(email: str) -> bool: """ Функция проверяет, существует ли пользователь. @@ -180,6 +229,7 @@ def update_user_in_model(profile: UserProfile, zendesk_user: ZenpyUser) -> None: :param zendesk_user: Данные пользователя в Zendesk :return: Обновленный профиль пользователя """ + update_permission(profile, zendesk_user) profile.name = zendesk_user.name profile.role = zendesk_user.role profile.image = zendesk_user.photo['content_url'] if zendesk_user.photo else None @@ -262,6 +312,7 @@ class DatabaseHandler(logging.Handler): """ Класс записи изменений ролей в базу данных. """ + def __init__(self): logging.Handler.__init__(self) @@ -295,6 +346,7 @@ class CsvFormatter(logging.Formatter): """ Класс преобразования смены ролей пользователей в строковый формат. """ + def __init__(self): logging.Formatter.__init__(self) @@ -346,7 +398,7 @@ def log(user: get_user_model(), admin: get_user_model() = None) -> None: def set_session_params_for_work_page(request: WSGIRequest, count: int = None, is_confirm: bool = True) -> \ - Union[HttpResponsePermanentRedirect, HttpResponseRedirect]: + Union[HttpResponsePermanentRedirect, HttpResponseRedirect]: """ Функция для страницы получения прав, устанавливает данные сессии о успешности запроса и количестве назначенных тикетов. diff --git a/main/views.py b/main/views.py index d79eec5..26b55cb 100644 --- a/main/views.py +++ b/main/views.py @@ -29,7 +29,7 @@ from rest_framework.response import Response from access_controller.settings import DEFAULT_FROM_EMAIL, ZENDESK_ROLES, ZENDESK_MAX_AGENTS, ZENDESK_GROUPS from main.extra_func import check_user_exist, update_profile, get_user_organization, \ make_engineer, make_light_agent, get_users_list, update_users_in_model, count_users, \ - set_session_params_for_work_page, get_tickets_list_for_group + set_session_params_for_work_page, get_tickets_list_for_group, set_permission from main.forms import AdminPageUsers, CustomRegistrationForm, CustomAuthenticationForm, \ StatisticForm, WorkGetTicketsForm from main.serializers import ProfileSerializer, ZendeskUserSerializer @@ -118,7 +118,7 @@ class CustomRegistrationView(RegistrationView): ) try: update_profile(user.userprofile) - self.set_permission(user) + set_permission(user) forms.save(**opts) return user except SMTPException: @@ -131,21 +131,6 @@ class CustomRegistrationView(RegistrationView): self.redirect_url = 'invalid_zendesk_email' return None - @staticmethod - def set_permission(user: get_user_model()) -> None: - """ - Функция дает разрешение на просмотр страница администратора, если пользователь имеет роль admin. - - :param user: Авторизованный пользователь (получает разрешение, имея роль "admin") - """ - if user.userprofile.role == 'admin': - content_type = ContentType.objects.get_for_model(UserProfile) - permission = Permission.objects.get( - codename='has_control_access', - content_type=content_type, - ) - user.user_permissions.add(permission) - def get_success_url(self, user: get_user_model() = None) -> Dict: """ Функция возвращает url-адрес страницы, куда нужно перейти после успешной/не успешной регистрации.