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:
commit
557de38505
@ -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]:
|
||||
"""
|
||||
Функция для страницы получения прав, устанавливает данные сессии о успешности запроса и количестве
|
||||
назначенных тикетов.
|
||||
|
@ -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-адрес страницы, куда нужно перейти после успешной/не успешной регистрации.
|
||||
|
Loading…
x
Reference in New Issue
Block a user