Merge branch 'hotfix/control_permission' into 'develop'

Fix change permissions when role has changed

See merge request 2020-2021/online/s101/group-02/access_controller!91
This commit is contained in:
Кравченко Артем 2021-05-28 21:05:44 +00:00
commit 557de38505
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 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]:
"""
Функция для страницы получения прав, устанавливает данные сессии о успешности запроса и количестве
назначенных тикетов.

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 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-адрес страницы, куда нужно перейти после успешной/не успешной регистрации.