Advertisement
Mochinov

Untitled

May 18th, 2022
498
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.urls import reverse
  7. from django.http import HttpRequest
  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_single_view import GenericApiSingleView
  14. from misc.views.generic_serializer import GenericSerializer
  15. from misc.views.generic_api_view import GenericApiView
  16. from misc.views.generic_filters import GenericFilters
  17. from users.models import (
  18.     User,
  19.     UserProperty,
  20.     Property,
  21. )
  22.  
  23.  
  24. log = logging.getLogger(__name__)
  25.  
  26.  
  27. @permission_classes((permissions.AllowAny,))
  28. class UserPropertyTableView(GenericApiView):
  29.     """Определяет структуру и содержание ответа на запросы к данным таблицы UserProperty."""
  30.  
  31.     table_name = 'UserProperty'
  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='quantity_field',
  49.             field_name='quantity',
  50.             filer_method=Filters.generic_str_contains_filter,
  51.         ),
  52.         GenericApiView.get_filter(
  53.             filter_name='return_date_field',
  54.             field_name='return_date',
  55.             filer_method=Filters.generic_str_contains_filter,
  56.         ),
  57.         GenericApiView.get_filter(
  58.             filter_name='user_property_field',
  59.             field_name='user_property',
  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_property_can_add_request',
  71.     #     'view': 'users.crm_users_property_can_view_request',
  72.     #     'edit': 'users.crm_users_property_can_respond_request',
  73.     #     'delete': 'users.crm_users_property_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_property_can_delete_request',
  81.         'view_all': 'users.crm_users_can_view_and_edit_all',
  82.     }
  83.  
  84.     def get_queryset(self, context: dict, user: 'User') -> QuerySet:
  85.         """Возвращает базовый (до фильтрации и пагинации) QuerySet для таблицы."""
  86.  
  87.         user_id = context.get('user_id_field', -1)
  88.         return UserProperty.objects.filter(user__id=user_id)
  89.  
  90.     def get_filtered_table_fields(self, table_fields: list, request: Union[HttpRequest, Request]) -> list:
  91.         """Метод определяющий логику отсеивания полей таблицы."""
  92.  
  93.         excluded_fields = []
  94.  
  95.         if not request.user.has_perm(self.PERMISSIONS.get('view_all')):
  96.             excluded_fields += ['delete_btn_field', ]
  97.  
  98.         return GenericSerializer.get_fields_without_excluded(
  99.             serializer_fields=table_fields, excluded_fields=excluded_fields
  100.         )
  101.  
  102.     @classmethod
  103.     def get_actions(cls) -> list:
  104.         """Возвращает список со списком действий, применимый к набору данных. """
  105.  
  106.         actions = [
  107.             cls.get_action(
  108.                 name='edit',
  109.                 verbose='Сохранить изменения',
  110.                 url=reverse('user_property_list'),
  111.             ),
  112.         ]
  113.         return actions
  114.  
  115.     @staticmethod
  116.     def get_field_dict(context: dict, user: User) -> dict:
  117.         """Распаковывает ответ и возвращает словарь со значениями полей"""
  118.  
  119.  
  120.         user_id_field = UserPropertyTableView.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_property_id_field = UserPropertyTableView.get_unpack_value(context.get('user_property_field'))
  125.         user_property_id_field = safe_to_int(user_property_id_field, -1)
  126.  
  127.         user_property = Property.objects.filter(id=user_property_id_field).first()
  128.  
  129.         data = {
  130.             'user': user_field,
  131.             'user_property': user_property,
  132.             'transfer_date': UserPropertyTableView.get_unpack_value(context.get('transfer_date_field')),
  133.             'quantity_field': UserPropertyTableView.get_unpack_value(context.get('quantity_field')),
  134.             'return_date': UserPropertyTableView.get_unpack_value(context.get('return_date_field')),
  135.         }
  136.  
  137.         return data
  138.  
  139.     def get_action_methods(self) -> dict:
  140.         """Возвращает словарь соотношений названий действий с их методом."""
  141.  
  142.         return {
  143.             'edit': self.edit_elements,
  144.         }
  145.  
  146.     def get_empty_item_prefilled_fields(self, context: dict) -> dict:
  147.         """Возвращает список предзаполненных полей для пустого элемента."""
  148.  
  149.         user_field = context.get('user_id_field')
  150.         prefilled_fields = {'user_field': user_field}
  151.  
  152.         return prefilled_fields
  153.  
  154.  
  155. @permission_classes((permissions.AllowAny,))
  156. class UserPropertyElementView(GenericApiSingleView):
  157.     """
  158.    Определяет структуру и содержание ответа на запросы к данным элемента UserProperty.
  159.  
  160.    В данный момент используется только для работы с методом DELETE
  161.    """
  162.  
  163.     table_name = 'UserProperty'
  164.     element_verbose = 'Имущество у сотрудника'
  165.     table_view_model = UserPropertyTableView
  166.  
  167.     PERMISSIONS = {
  168.         # 'create': 'users.crm_users_can_edit_employee',
  169.         'view': 'users.crm_users_can_view_employee',
  170.         # 'edit': 'users.crm_users_can_edit_employee',
  171.         'delete': 'users.crm_users_can_edit_employee',
  172.         'view_all': 'users.crm_users_can_view_and_edit_all',
  173.         'edit_current_user_personal_information': 'users.crm_users_edit_current_user_personal_information',
  174.     }
  175.  
Advertisement
RAW Paste Data Copied
Advertisement