Mochinov

Untitled

Apr 11th, 2022 (edited)
333
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 10.12 KB | None | 0 0
  1. from datetime import timedelta
  2. from functools import reduce
  3. import logging
  4. from typing import Any, List, Union, Optional
  5.  
  6. from django.db.models import QuerySet, Q
  7. from django.http import HttpRequest
  8. from django.urls import reverse
  9. from django.utils import timezone
  10. from django.utils.crypto import get_random_string
  11. from rest_framework import permissions
  12. from rest_framework.decorators import permission_classes
  13. from rest_framework.request import Request
  14.  
  15. from crm_notification.models import Notification
  16. from itrade import settings
  17. from misc.spliting import split_query
  18. from misc.to_int import safe_to_int
  19. from misc.views.generic_api_single_view import GenericApiSingleView
  20. from misc.views.generic_api_view import GenericApiView
  21. from misc.views.generic_filters import GenericFilters
  22. from misc.views.table_style import TableStyle
  23. from partners.systems import System
  24. from users.models import (
  25.     Position,
  26.     User,
  27. )
  28.  
  29. log = logging.getLogger(__name__)
  30.  
  31.  
  32. @permission_classes((permissions.AllowAny,))
  33. class UserPropertyAccessTableView(GenericApiView):
  34.     """Определяет структуру и содержание ответа на запросы к данным таблицы User."""
  35.  
  36.     table_name = 'UserPropertyAccessTableView'
  37.  
  38.     # Временное ограничение - вызвано ограничением MSSQL
  39.     RESULT_LIMITATION = 900
  40.     DEFAULT_USERS = 50
  41.  
  42.     PERMISSIONS = {
  43.         # 'create': 'users.crm_users_can_add_employee',
  44.         'view': 'users.crm_users_can_view_employee',
  45.         'edit': 'users.crm_users_can_edit_employee',
  46.         # 'delete': 'users.crm_users_can_delete_employee',
  47.         'view_all': 'users.crm_users_can_view_and_edit_all',
  48.         'edit_current_user_personal_information': 'users.crm_users_edit_current_user_personal_information',
  49.     }
  50.  
  51.     class Filters(GenericFilters):
  52.  
  53.  
  54.         FIELDS_FILTERS = [
  55.  
  56.         # GenericApiView.get_filter(
  57.         #     filter_name='link_field', field_name='social_media__link', filer_method=Filters.social_media_link_filter
  58.         # ),
  59.  
  60.         ]
  61.  
  62.     def get_queryset(self, context: dict, user: User) -> QuerySet:
  63.         """Возвращает базовый (до фильтрации и пагинации) QuerySet."""
  64.  
  65.         if not user.has_perm(self.PERMISSIONS.get('view_all')):
  66.             user_list = list(User.objects.get_set_of_subordinates_user(user=user))[:900]
  67.             user_id_list = [x.id for x in user_list]
  68.             user_queryset = User.objects.filter(id__in=user_id_list)
  69.         else:
  70.             user_queryset = User.objects.filter(is_superuser=False)
  71.  
  72.         return user_queryset.prefetch_related()
  73.  
  74.     @staticmethod
  75.     def get_field_dict(context: dict, user: User) -> dict:
  76.         """Распаковывает ответ и возвращает словарь со значениями полей"""
  77.  
  78.         # position_field = UsersTableView.get_unpack_value(context.get('position_field'))
  79.         # position_field = safe_to_int(position_field, -1)
  80.         # position_field = Position.objects.filter(id=position_field).first()
  81.  
  82.         # data = {
  83.         #     'context_user': user,
  84.         #     'first_name': UsersTableView.get_unpack_value(context.get('name_field')) or '',
  85.         # }
  86.         return {} #data
  87.  
  88.     def get_action_methods(self) -> dict:
  89.         """Возвращает словарь соотношений названий действий с их методом."""
  90.  
  91.         return {
  92.             'edit': self.edit_elements,
  93.         }
  94.  
  95.     @classmethod
  96.     def get_actions(cls) -> list:
  97.         """Возвращает список со списком действий, применимый к набору данных."""
  98.  
  99.         actions = [
  100.             cls.get_action(
  101.                 name='edit',
  102.                 verbose='Сохранить изменения',
  103.                 url=reverse('users_list'),
  104.             ),
  105.         ]
  106.         return actions
  107.  
  108. @permission_classes((permissions.AllowAny,))
  109. class UserPropertyAccessElementView(GenericApiSingleView):
  110.     """Определяет структуру и содержание ответа на запросы к данным элемента User."""
  111.  
  112.     table_name = 'UserPropertyAccess'
  113.     element_verbose = 'Имущество и доступ'
  114.     table_view_model = UserPropertyAccessTableView
  115.  
  116.     PERMISSIONS = {
  117.         # 'create': 'users.crm_users_can_add_employee',
  118.         'view': 'users.crm_users_can_view_employee',
  119.         'edit': 'users.crm_users_can_edit_employee',
  120.         # 'delete': 'users.crm_users_can_delete_employee',
  121.         'view_all': 'users.crm_users_can_view_and_edit_all',
  122.         'edit_current_user_personal_information': 'users.crm_users_edit_current_user_personal_information',
  123.     }
  124.  
  125.     def get_queryset(self, context: dict, user: User) -> QuerySet:
  126.         """Возвращает базовый (до фильтрации и пагинации) QuerySet."""
  127.  
  128.         return User.objects.all()
  129.  
  130.     @classmethod
  131.     def has_view_permission(cls, user: User, context: dict, obj: Any = None) -> bool:
  132.         """Проверка пользователя, имеет ли он разрешения на просмотр объекта"""
  133.  
  134.         if user.has_perm(cls.PERMISSIONS.get('view_all')):
  135.             return True
  136.  
  137.         result = super().has_view_permission(user=user, obj=obj, context=context)
  138.         if result is False and user == obj:
  139.             return user.has_perm(cls.PERMISSIONS.get('edit_current_user_personal_information'))
  140.  
  141.         return result
  142.  
  143.     @classmethod
  144.     def has_edit_permission(cls, user: User, context: dict, obj: Any = None) -> bool:
  145.         """Проверка пользователя, имеет ли он разрешения на изменения объекта"""
  146.  
  147.         if user.has_perm(cls.PERMISSIONS.get('view_all')):
  148.             return True
  149.  
  150.         if user == obj:
  151.             return user.has_perm(cls.PERMISSIONS.get('edit_current_user_personal_information'))
  152.  
  153.         return super().has_edit_permission(user=user, obj=obj, context=context)
  154.  
  155.     def additional_permission_check(self, obj: Any, request: Union[HttpRequest, Request]) -> bool:
  156.         """Дополнительные проверки на разрешения."""
  157.  
  158.         user = request.user
  159.         if not user.has_perm(self.PERMISSIONS.get('view_all')):
  160.             set_of_user = User.objects.get_set_of_subordinates_user(user=user)
  161.             if obj not in set_of_user:
  162.                 return False
  163.  
  164.         return True
  165.  
  166.     def prepare_tabs_args(self, request: Union[HttpRequest, Request], obj: Any, pk: Optional[int] = -1,
  167.                           parent_id: Optional[int] = None) -> dict:
  168.         """Подготавливает словарь аргументов для табов."""
  169.  
  170.         return {
  171.             'user_id': pk,
  172.         }
  173.  
  174.     @staticmethod
  175.     def additional_check_for_tab(tab_name: str, user: User, context: dict, obj: Optional[Any] = None) -> bool:
  176.         """
  177.        Дополнительная проверка для таба
  178.  
  179.        Возвращает логическое значения, разрешать ли выводит таб или нет
  180.  
  181.        Пока решил не делать проверку каждого таба на права (у которых не делал, одинаковые права как и у этого таба),
  182.        тк метод has_view_permission и сама работа с пермишенами, скорее всего, будут изменятся
  183.        """
  184.  
  185.         from crm_control.views.activity_history import ActivityHistoryTabForUserElementView
  186.         from crm_control.views.user_additional_information import UserAdditionalInformationElementView
  187.         from crm_control.views.personnel_accounting import PersonnelAccountingElementView
  188.         from crm_control.views.referrals_tab_for_user import ReferralsTabForUserElementView
  189.         from crm_control.views.user_changes import UserChangesTabView
  190.  
  191.         if tab_name == 'personnel_accounting':
  192.             personnel_accounting_obj = (
  193.                 obj.record_in_personnel_accounting.id
  194.                 if hasattr(obj, 'record_in_personnel_accounting') and obj.record_in_personnel_accounting else None
  195.             )
  196.             return PersonnelAccountingElementView.has_view_permission(
  197.                 user=user, context=context, obj=personnel_accounting_obj
  198.             )
  199.  
  200.         if tab_name == 'user_additional_information':
  201.             return UserAdditionalInformationElementView.has_view_permission(user=user, context=context, obj=obj)
  202.  
  203.         if tab_name == 'referrals':
  204.             return ReferralsTabForUserElementView.has_view_permission(user=user, context=context, obj=obj)
  205.  
  206.         if tab_name == 'activity_history':
  207.             return ActivityHistoryTabForUserElementView.has_view_permission(user=user, context=context, obj=obj)
  208.  
  209.         if tab_name == 'user_changes':
  210.             return UserChangesTabView.has_view_permission(user=user, context=context, obj=obj)
  211.  
  212.         return True
  213.  
  214.     def get_tables(self, context: dict, user: User, obj: Any, pk: int) -> list:
  215.         """Возвращает встроенные таблицы."""
  216.  
  217.         # group_operator_table_style = TableStyle.get_table_style(
  218.         #     hide_options=True,
  219.         #     hide_clear_button=True,
  220.         #     hide_create_button=True,
  221.         #     hide_pagination_info=True,
  222.         #     mode=TableStyle.TableStyleMode.SIMPLE,
  223.         # )
  224.  
  225.         tables = []
  226.         # if obj:
  227.         #     if not hasattr(obj, 'leadvertex_auth_info'):
  228.         #         AuthorizationInformationLV.objects.create(user=obj)
  229.  
  230.         #     tables = [
  231.         #         {
  232.         #             'name': 'UserGroupOperator',
  233.         #             'verbose': 'Группы оператора',
  234.         #             'url': reverse('user_group_operator'),
  235.         #             'prefilters': {
  236.         #                 'table_style': group_operator_table_style,
  237.         #                 'operator_id_field': str(pk),
  238.         #             },
  239.         #         },
  240.         #     ]
  241.  
  242.         return tables
  243.  
Add Comment
Please, Sign In to add comment