Advertisement
Mochinov

Untitled

May 18th, 2022
578
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. import logging
  2. from functools import reduce
  3. from typing import Any, List, Union
  4.  
  5. from django.db.models import QuerySet
  6. from django.http import HttpRequest
  7. from django.urls import reverse
  8. from rest_framework.request import Request
  9. from rest_framework import permissions
  10. from rest_framework.decorators import permission_classes
  11.  
  12. from misc.to_int import safe_to_int
  13. from misc.views.generic_api_view import GenericApiView
  14. from misc.views.generic_serializer import GenericSerializer
  15. from misc.views.generic_api_single_view import GenericApiSingleView
  16. from misc.views.generic_filters import GenericFilters
  17. from users.models import (
  18.     User,
  19.     UserAccess,
  20.     ConnectingUserToAccess,
  21. )
  22.  
  23.  
  24. log = logging.getLogger(__name__)
  25.  
  26.  
  27. @permission_classes((permissions.AllowAny,))
  28. class ConnectingUserToAccessTableView(GenericApiView):
  29.     """Определяет структуру и содержание ответа на запросы к данным таблицы ConnectingUserToAccess."""
  30.  
  31.     table_name = 'ConnectingUserToAccess'
  32.  
  33.     class Filters(GenericFilters):
  34.         pass
  35.    
  36.     FIELDS_FILTERS = [
  37.         GenericApiView.get_filter(
  38.             filter_name='id_field',
  39.             field_name='id',
  40.             filer_method=Filters.generic_int_equal_filter,
  41.         ),
  42.         GenericApiView.get_filter(
  43.             filter_name='transfer_date_field',
  44.             field_name='transfer_date',
  45.             filer_method=Filters.generic_str_contains_filter,
  46.         ),
  47.         GenericApiView.get_filter(
  48.             filter_name='return_date_field',
  49.             field_name='return_date',
  50.             filer_method=Filters.generic_str_contains_filter,
  51.         ),
  52.         GenericApiView.get_filter(
  53.             filter_name='comment_field',
  54.             field_name='comment',
  55.             filer_method=Filters.generic_str_contains_filter,
  56.         ),
  57.         GenericApiView.get_filter(
  58.             filter_name='user_access_field',
  59.             field_name='user_access',
  60.             filer_method=Filters.generic_str_contains_filter,
  61.         ),
  62.         GenericApiView.get_filter(
  63.             filter_name='user_field',
  64.             field_name='user',
  65.             filer_method=Filters.generic_str_contains_filter,
  66.         ),
  67.     ]
  68.  
  69.     # PERMISSIONS = {
  70.     #     'create': 'users.crm_users_access_can_add_request',
  71.     #     'view': 'users.crm_users_access_can_view_request',
  72.     #     'edit': 'users.crm_users_access_can_respond_request',
  73.     #     'delete': 'users.crm_users_access_can_delete_request',
  74.     #     'view_all': 'users.crm_users_can_view_and_edit_all',
  75.     # }
  76.     PERMISSIONS = {
  77.         'create': 'users.crm_users_can_edit_employee',
  78.         'view': 'users.crm_users_can_view_employee',
  79.         'edit': 'users.crm_users_can_edit_employee',
  80.         'delete': 'users.crm_users_access_can_delete_request',
  81.         'view_all': 'users.crm_users_can_view_and_edit_all',
  82.     }
  83.  
  84.     def get_queryset(self, context: dict, user: 'UserAccess') -> QuerySet:
  85.         """Возвращает базовый (до фильтрации и пагинации) QuerySet для таблицы."""
  86.  
  87.         user_id = context.get('user_id_field', -1)
  88.        
  89.         return ConnectingUserToAccess.objects.filter(user__id=user_id)
  90.  
  91.     def get_filtered_table_fields(self, table_fields: list, request: Union[HttpRequest, Request]) -> list:
  92.         """Метод определяющий логику отсеивания полей таблицы."""
  93.  
  94.         excluded_fields = []
  95.  
  96.         if not request.user.has_perm(self.PERMISSIONS.get('view_all')):
  97.             excluded_fields += ['delete_btn_field', ]
  98.  
  99.         return GenericSerializer.get_fields_without_excluded(
  100.             serializer_fields=table_fields, excluded_fields=excluded_fields
  101.         )
  102.  
  103.     @classmethod
  104.     def get_actions(cls) -> list:
  105.         """Возвращает список со списком действий, применимый к набору данных. """
  106.  
  107.         actions = [
  108.             cls.get_action(
  109.                 name='edit',
  110.                 verbose='Сохранить изменения',
  111.                 url=reverse('user_access_list'),
  112.             ),
  113.         ]
  114.         return actions
  115.  
  116.     @staticmethod
  117.     def get_field_dict(context: dict, user: User) -> dict:
  118.         """Распаковывает ответ и возвращает словарь со значениями полей"""
  119.  
  120.         user_id_field = ConnectingUserToAccessTableView.get_unpack_value(context.get('user_field'))
  121.         user_id_field = safe_to_int(user_id_field, -1)
  122.         user_field = User.objects.filter(id=user_id_field).first()
  123.  
  124.         user_access_id_field = ConnectingUserToAccessTableView.get_unpack_value(context.get('user_access_field'))
  125.         user_access_id_field = safe_to_int(user_access_id_field, -1)
  126.         user_access_field = UserAccess.objects.filter(id=user_access_id_field).first()
  127.  
  128.         data = {
  129.             'user': user_field,
  130.             'user_access': user_access_field,
  131.             'transfer_date': ConnectingUserToAccessTableView.get_unpack_value(context.get('transfer_date_field')),
  132.             'return_date': ConnectingUserToAccessTableView.get_unpack_value(context.get('return_date_field')),
  133.             'comment': ConnectingUserToAccessTableView.get_unpack_value(context.get('comment_field')),
  134.         }
  135.         return data
  136.    
  137.     def get_action_methods(self) -> dict:
  138.         """Возвращает словарь соотношений названий действий с их методом."""
  139.  
  140.         return {
  141.             'edit': self.edit_elements,
  142.         }
  143.  
  144.     def get_empty_item_prefilled_fields(self, context: dict) -> dict:
  145.         """Возвращает список предзаполненных полей для пустого элемента."""
  146.  
  147.         user_field = context.get('user_id_field')
  148.         prefilled_fields = {'user_field': user_field}
  149.  
  150.         return prefilled_fields
  151.  
  152.  
  153. @permission_classes((permissions.AllowAny,))
  154. class ConnectingUserToAccessElementView(GenericApiSingleView):
  155.     """
  156.    Определяет структуру и содержание ответа на запросы к данным элемента ConnectingUserToAccess.
  157.  
  158.    В данный момент используется только для работы с методом DELETE
  159.    """
  160.  
  161.     table_name = 'ConnectingUserToAccess'
  162.     element_verbose = 'Доступы у сотрудника'
  163.     table_view_model = ConnectingUserToAccessTableView
  164.  
  165.     PERMISSIONS = {
  166.         # 'create': 'users.crm_users_can_edit_employee',
  167.         'view': 'users.crm_users_can_view_employee',
  168.         # 'edit': 'users.crm_users_can_edit_employee',
  169.         'delete': 'users.crm_users_can_edit_employee',
  170.         'view_all': 'users.crm_users_can_view_and_edit_all',
  171.         'edit_current_user_personal_information': 'users.crm_users_edit_current_user_personal_information',
  172.     }
  173.  
Advertisement
RAW Paste Data Copied
Advertisement