Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- from datetime import timedelta
- from functools import reduce
- import logging
- from typing import Any, List, Union, Optional
- from django.db.models import QuerySet, Q
- from django.http import HttpRequest
- from django.urls import reverse
- from django.utils import timezone
- from django.utils.crypto import get_random_string
- from rest_framework import permissions
- from rest_framework.decorators import permission_classes
- from rest_framework.request import Request
- from crm_notification.models import Notification
- from itrade import settings
- from misc.spliting import split_query
- from misc.to_int import safe_to_int
- from misc.views.generic_api_single_view import GenericApiSingleView
- from misc.views.generic_api_view import GenericApiView
- from misc.views.generic_filters import GenericFilters
- from misc.views.table_style import TableStyle
- from partners.systems import System
- from users.models import (
- Position,
- User,
- )
- log = logging.getLogger(__name__)
- @permission_classes((permissions.AllowAny,))
- class UserPropertyAccessTableView(GenericApiView):
- """Определяет структуру и содержание ответа на запросы к данным таблицы User."""
- table_name = 'UserPropertyAccessTableView'
- # Временное ограничение - вызвано ограничением MSSQL
- RESULT_LIMITATION = 900
- DEFAULT_USERS = 50
- PERMISSIONS = {
- # 'create': 'users.crm_users_can_add_employee',
- 'view': 'users.crm_users_can_view_employee',
- 'edit': 'users.crm_users_can_edit_employee',
- # 'delete': 'users.crm_users_can_delete_employee',
- 'view_all': 'users.crm_users_can_view_and_edit_all',
- 'edit_current_user_personal_information': 'users.crm_users_edit_current_user_personal_information',
- }
- class Filters(GenericFilters):
- FIELDS_FILTERS = [
- # GenericApiView.get_filter(
- # filter_name='link_field', field_name='social_media__link', filer_method=Filters.social_media_link_filter
- # ),
- ]
- def get_queryset(self, context: dict, user: User) -> QuerySet:
- """Возвращает базовый (до фильтрации и пагинации) QuerySet."""
- if not user.has_perm(self.PERMISSIONS.get('view_all')):
- user_list = list(User.objects.get_set_of_subordinates_user(user=user))[:900]
- user_id_list = [x.id for x in user_list]
- user_queryset = User.objects.filter(id__in=user_id_list)
- else:
- user_queryset = User.objects.filter(is_superuser=False)
- return user_queryset.prefetch_related()
- @staticmethod
- def get_field_dict(context: dict, user: User) -> dict:
- """Распаковывает ответ и возвращает словарь со значениями полей"""
- # position_field = UsersTableView.get_unpack_value(context.get('position_field'))
- # position_field = safe_to_int(position_field, -1)
- # position_field = Position.objects.filter(id=position_field).first()
- # data = {
- # 'context_user': user,
- # 'first_name': UsersTableView.get_unpack_value(context.get('name_field')) or '',
- # }
- return {} #data
- def get_action_methods(self) -> dict:
- """Возвращает словарь соотношений названий действий с их методом."""
- return {
- 'edit': self.edit_elements,
- }
- @classmethod
- def get_actions(cls) -> list:
- """Возвращает список со списком действий, применимый к набору данных."""
- actions = [
- cls.get_action(
- name='edit',
- verbose='Сохранить изменения',
- url=reverse('users_list'),
- ),
- ]
- return actions
- @permission_classes((permissions.AllowAny,))
- class UserPropertyAccessElementView(GenericApiSingleView):
- """Определяет структуру и содержание ответа на запросы к данным элемента User."""
- table_name = 'UserPropertyAccess'
- element_verbose = 'Имущество и доступ'
- table_view_model = UserPropertyAccessTableView
- PERMISSIONS = {
- # 'create': 'users.crm_users_can_add_employee',
- 'view': 'users.crm_users_can_view_employee',
- 'edit': 'users.crm_users_can_edit_employee',
- # 'delete': 'users.crm_users_can_delete_employee',
- 'view_all': 'users.crm_users_can_view_and_edit_all',
- 'edit_current_user_personal_information': 'users.crm_users_edit_current_user_personal_information',
- }
- def get_queryset(self, context: dict, user: User) -> QuerySet:
- """Возвращает базовый (до фильтрации и пагинации) QuerySet."""
- return User.objects.all()
- @classmethod
- def has_view_permission(cls, user: User, context: dict, obj: Any = None) -> bool:
- """Проверка пользователя, имеет ли он разрешения на просмотр объекта"""
- if user.has_perm(cls.PERMISSIONS.get('view_all')):
- return True
- result = super().has_view_permission(user=user, obj=obj, context=context)
- if result is False and user == obj:
- return user.has_perm(cls.PERMISSIONS.get('edit_current_user_personal_information'))
- return result
- @classmethod
- def has_edit_permission(cls, user: User, context: dict, obj: Any = None) -> bool:
- """Проверка пользователя, имеет ли он разрешения на изменения объекта"""
- if user.has_perm(cls.PERMISSIONS.get('view_all')):
- return True
- if user == obj:
- return user.has_perm(cls.PERMISSIONS.get('edit_current_user_personal_information'))
- return super().has_edit_permission(user=user, obj=obj, context=context)
- def additional_permission_check(self, obj: Any, request: Union[HttpRequest, Request]) -> bool:
- """Дополнительные проверки на разрешения."""
- user = request.user
- if not user.has_perm(self.PERMISSIONS.get('view_all')):
- set_of_user = User.objects.get_set_of_subordinates_user(user=user)
- if obj not in set_of_user:
- return False
- return True
- def prepare_tabs_args(self, request: Union[HttpRequest, Request], obj: Any, pk: Optional[int] = -1,
- parent_id: Optional[int] = None) -> dict:
- """Подготавливает словарь аргументов для табов."""
- return {
- 'user_id': pk,
- }
- @staticmethod
- def additional_check_for_tab(tab_name: str, user: User, context: dict, obj: Optional[Any] = None) -> bool:
- """
- Дополнительная проверка для таба
- Возвращает логическое значения, разрешать ли выводит таб или нет
- Пока решил не делать проверку каждого таба на права (у которых не делал, одинаковые права как и у этого таба),
- тк метод has_view_permission и сама работа с пермишенами, скорее всего, будут изменятся
- """
- from crm_control.views.activity_history import ActivityHistoryTabForUserElementView
- from crm_control.views.user_additional_information import UserAdditionalInformationElementView
- from crm_control.views.personnel_accounting import PersonnelAccountingElementView
- from crm_control.views.referrals_tab_for_user import ReferralsTabForUserElementView
- from crm_control.views.user_changes import UserChangesTabView
- if tab_name == 'personnel_accounting':
- personnel_accounting_obj = (
- obj.record_in_personnel_accounting.id
- if hasattr(obj, 'record_in_personnel_accounting') and obj.record_in_personnel_accounting else None
- )
- return PersonnelAccountingElementView.has_view_permission(
- user=user, context=context, obj=personnel_accounting_obj
- )
- if tab_name == 'user_additional_information':
- return UserAdditionalInformationElementView.has_view_permission(user=user, context=context, obj=obj)
- if tab_name == 'referrals':
- return ReferralsTabForUserElementView.has_view_permission(user=user, context=context, obj=obj)
- if tab_name == 'activity_history':
- return ActivityHistoryTabForUserElementView.has_view_permission(user=user, context=context, obj=obj)
- if tab_name == 'user_changes':
- return UserChangesTabView.has_view_permission(user=user, context=context, obj=obj)
- return True
- def get_tables(self, context: dict, user: User, obj: Any, pk: int) -> list:
- """Возвращает встроенные таблицы."""
- # group_operator_table_style = TableStyle.get_table_style(
- # hide_options=True,
- # hide_clear_button=True,
- # hide_create_button=True,
- # hide_pagination_info=True,
- # mode=TableStyle.TableStyleMode.SIMPLE,
- # )
- tables = []
- # if obj:
- # if not hasattr(obj, 'leadvertex_auth_info'):
- # AuthorizationInformationLV.objects.create(user=obj)
- # tables = [
- # {
- # 'name': 'UserGroupOperator',
- # 'verbose': 'Группы оператора',
- # 'url': reverse('user_group_operator'),
- # 'prefilters': {
- # 'table_style': group_operator_table_style,
- # 'operator_id_field': str(pk),
- # },
- # },
- # ]
- return tables
Add Comment
Please, Sign In to add comment