Fix change permissions when role has changed

This commit is contained in:
Sokurov Idar 2021-05-28 00:15:50 +03:00
parent fbc6535975
commit cad6b1c917
2 changed files with 55 additions and 18 deletions

View File

@ -6,6 +6,8 @@ from datetime import timedelta, date
from typing import Union, Optional from typing import Union, Optional
from django.contrib.auth import get_user_model 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.exceptions import ObjectDoesNotExist
from django.core.handlers.wsgi import WSGIRequest from django.core.handlers.wsgi import WSGIRequest
from django.http import HttpResponseRedirect, HttpResponsePermanentRedirect from django.http import HttpResponseRedirect, HttpResponsePermanentRedirect
@ -123,6 +125,7 @@ def update_profile(user_profile: UserProfile) -> None:
:return: Обновленный, в соответствие с текущими данными в Zendesk, профиль пользователя :return: Обновленный, в соответствие с текущими данными в Zendesk, профиль пользователя
""" """
user = zenpy.get_user(user_profile.user.email) user = zenpy.get_user(user_profile.user.email)
update_permission(user_profile, user)
user_profile.name = user.name user_profile.name = user.name
user_profile.role = user.role user_profile.role = user.role
user_profile.custom_role_id = user.custom_role_id if user.custom_role_id else 0 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() 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: 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 :param zendesk_user: Данные пользователя в Zendesk
:return: Обновленный профиль пользователя :return: Обновленный профиль пользователя
""" """
update_permission(profile, zendesk_user)
profile.name = zendesk_user.name profile.name = zendesk_user.name
profile.role = zendesk_user.role profile.role = zendesk_user.role
profile.image = zendesk_user.photo['content_url'] if zendesk_user.photo else None profile.image = zendesk_user.photo['content_url'] if zendesk_user.photo else None
@ -262,6 +312,7 @@ class DatabaseHandler(logging.Handler):
""" """
Класс записи изменений ролей в базу данных. Класс записи изменений ролей в базу данных.
""" """
def __init__(self): def __init__(self):
logging.Handler.__init__(self) logging.Handler.__init__(self)
@ -295,6 +346,7 @@ class CsvFormatter(logging.Formatter):
""" """
Класс преобразования смены ролей пользователей в строковый формат. Класс преобразования смены ролей пользователей в строковый формат.
""" """
def __init__(self): def __init__(self):
logging.Formatter.__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) -> \ def set_session_params_for_work_page(request: WSGIRequest, count: int = None, is_confirm: bool = True) -> \
Union[HttpResponsePermanentRedirect, HttpResponseRedirect]: Union[HttpResponsePermanentRedirect, HttpResponseRedirect]:
""" """
Функция для страницы получения прав, устанавливает данные сессии о успешности запроса и количестве Функция для страницы получения прав, устанавливает данные сессии о успешности запроса и количестве
назначенных тикетов. назначенных тикетов.

View File

@ -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 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, \ 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, \ 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, \ from main.forms import AdminPageUsers, CustomRegistrationForm, CustomAuthenticationForm, \
StatisticForm, WorkGetTicketsForm StatisticForm, WorkGetTicketsForm
from main.serializers import ProfileSerializer, ZendeskUserSerializer from main.serializers import ProfileSerializer, ZendeskUserSerializer
@ -118,7 +118,7 @@ class CustomRegistrationView(RegistrationView):
) )
try: try:
update_profile(user.userprofile) update_profile(user.userprofile)
self.set_permission(user) set_permission(user)
forms.save(**opts) forms.save(**opts)
return user return user
except SMTPException: except SMTPException:
@ -131,21 +131,6 @@ class CustomRegistrationView(RegistrationView):
self.redirect_url = 'invalid_zendesk_email' self.redirect_url = 'invalid_zendesk_email'
return None 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: def get_success_url(self, user: get_user_model() = None) -> Dict:
""" """
Функция возвращает url-адрес страницы, куда нужно перейти после успешной/не успешной регистрации. Функция возвращает url-адрес страницы, куда нужно перейти после успешной/не успешной регистрации.