Fix change permissions when role has changed
This commit is contained in:
parent
fbc6535975
commit
cad6b1c917
@ -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]:
|
||||||
"""
|
"""
|
||||||
Функция для страницы получения прав, устанавливает данные сессии о успешности запроса и количестве
|
Функция для страницы получения прав, устанавливает данные сессии о успешности запроса и количестве
|
||||||
назначенных тикетов.
|
назначенных тикетов.
|
||||||
|
@ -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-адрес страницы, куда нужно перейти после успешной/не успешной регистрации.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user