Advertisement
Mochinov

Untitled

Apr 22nd, 2022
1,018
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 6.67 KB | None | 0 0
  1. from pickle import TRUE
  2. from typing import Optional
  3.  
  4. from django.db import models
  5. from django.utils import timezone
  6. from django.forms import ModelForm
  7.  
  8.  
  9. from .user import User
  10. from crm.models import Project
  11. from crm.models import get_base_record_for_project
  12. from misc.generic_models.meta_mixin import MetaMixin
  13. from misc.views.clean_form_errors import clean_form_errors
  14. from misc.generic_models.generic_model import GenericModel
  15. from users.models.user_access import UserAccess
  16. from users.models.user_property import Property
  17.  
  18.  
  19. class SubmissionRequestManager(models.Manager):
  20.     """Переопределение менеджера"""
  21.  
  22.     @staticmethod
  23.     def submission_request_create_or_update(
  24.             data: dict, instance: Optional['SubmissionRequest'] = None, user: Optional['User'] = None
  25.     ) -> dict:
  26.         """Выполняет создание или изменение экземпляра ConnectingUserToAccess."""
  27.  
  28.         connecting_user_to_access_form = SubmissionRequest(data=data, instance=instance)
  29.  
  30.         is_valid = connecting_user_to_access_form.is_valid()
  31.  
  32.         if is_valid:
  33.             instance = connecting_user_to_access_form.save()
  34.  
  35.         return {
  36.             'is_ok': is_valid,
  37.             'errors': clean_form_errors(connecting_user_to_access_form.errors),
  38.             'obj': instance
  39.         }
  40.  
  41.     @staticmethod
  42.     def response_to_request(obj: 'SubmissionRequest', user: 'User') -> dict:
  43.         """Выполняет перевод в архив экземпляра SubmissionRequest."""
  44.  
  45.         errors = {}
  46.         is_ok = True
  47.         if not obj:
  48.             errors = {'obj': SubmissionRequest.ErrorHandler.FAIL_TO_FIND_OBJ}
  49.             is_ok = False
  50.  
  51.         # :TODO Поменять на метод ответа
  52.  
  53.         return {'is_ok': is_ok, 'errors': errors, 'obj': obj}
  54.  
  55.     @staticmethod
  56.     def submission_request_delete(obj: 'SubmissionRequest', user: Optional['User'] = None) -> dict:
  57.         if not obj:
  58.             error = SubmissionRequest.ErrorHandler.FAIL_TO_FIND_OBJ
  59.             return {'is_ok': False, 'error': error, 'obj': None}
  60.         else:
  61.             obj.delete()
  62.             return {'is_ok': True, 'error': '', 'obj': obj}
  63.  
  64.  
  65. class SubmissionRequest(GenericModel):
  66.    
  67.     class ErrorHandler:
  68.         """Статусы ошибок"""
  69.  
  70.         FAIL_TO_FIND_OBJ = 'Объект не найден.'
  71.  
  72.     class Status(models.TextChoices):
  73.         """Статус набора данных."""
  74.  
  75.         REQUEST_COMPLETED = 'request_completed', 'Запрос выполнен'
  76.         IN_PROCESS = 'in_process', 'В процессе'
  77.         DENIED = 'denied', 'Отказано'
  78.  
  79.     meta_tags = [MetaMixin.ModelTags.UserData]
  80.  
  81.     _id_meta = [MetaMixin.FieldTags.PKField, MetaMixin.FieldTags.NotForLog]# Мета данные поля id
  82.  
  83.     user = models.ForeignKey(
  84.         User,
  85.         verbose_name='Сотрудник',
  86.         related_name='submission_request_user',
  87.         on_delete=models.CASCADE,
  88.         null=False,
  89.         blank=False,
  90.     )
  91.     _user_meta = [MetaMixin.FieldTags.UserField]
  92.  
  93.     comment_user = models.TextField(verbose_name='Комментарий запрашиваемого запрос', null=True, blank=True)
  94.     comment = models.TextField(verbose_name='Комментарий руководителя', null=True, blank=True)
  95.     status = models.CharField('Статус заявки', max_length=18, choices=Status.choices, default=Status.IN_PROCESS)
  96.  
  97.     supervisor = models.ForeignKey(
  98.         User,
  99.         verbose_name='Ответственный',
  100.         related_name='submission_request_supervisor',
  101.         on_delete=models.CASCADE,
  102.         null=True,
  103.         blank=True,
  104.     )
  105.    
  106.     access = models.ForeignKey(
  107.         UserAccess,
  108.         verbose_name='Назначение доступа сотруднику',
  109.         related_name='submission_request_access',
  110.         on_delete=models.CASCADE,
  111.         null=True,
  112.         blank=True,
  113.     )
  114.  
  115.     property = models.ForeignKey(
  116.         Property,
  117.         verbose_name='Имущество выданное сотруднику',
  118.         related_name='submission_request_property',
  119.         on_delete=models.CASCADE,
  120.         null=True,
  121.         blank=True,
  122.     )
  123.  
  124.     project = models.ForeignKey(
  125.         Project, verbose_name='проект',
  126.         on_delete=models.PROTECT,
  127.         default=get_base_record_for_project,
  128.         blank=True,
  129.     )
  130.     _project_meta = [MetaMixin.FieldTags.ProjectField]
  131.  
  132.     request_period_from = models.DateTimeField('Период заявки от', null=True, blank=True)
  133.     request_period_to = models.DateTimeField('Период заявки до', null=True, blank=True)
  134.     request_processed = models.BooleanField(verbose_name='Заявка обработана и подтверждена', default=False)
  135.    
  136.     objects = SubmissionRequestManager()
  137.  
  138.     def save(self, *args, **kwargs):
  139.         """Переопределение метода сохранение, для обработка заявки после статуса заявке"""
  140.         print('asdasdasdasdasdasdasd')
  141.         if self.request_period_from and self.request_period_to:
  142.             self.request_processed = True
  143.             self.status = SubmissionRequest.Status.REQUEST_COMPLETED
  144.             print(self.request_period_from, self.request_period_to)
  145.  
  146.         super().save(*args, **kwargs)
  147.  
  148.     def get_name_request(self):
  149.         """Получение название ресурса"""
  150.  
  151.         return self.resource_definition().name
  152.  
  153.     def get_comment_resource(self):
  154.         """Получение комментария ресурса"""
  155.  
  156.         return self.resource_definition().comment
  157.  
  158.     def get_resource(self):
  159.         """Возвращает содержимое ресурса"""
  160.         if self.access:
  161.             return self.access.url
  162.  
  163.         if self.property:
  164.             return f'{self.property.declared_value}/{self.property.serial_number}'
  165.  
  166.     def resource_definition(self):
  167.         """Определение ресурса"""
  168.        
  169.         if self.access:
  170.             return self.access
  171.  
  172.         if self.property:
  173.             return self.property
  174.  
  175.         return None
  176.  
  177.     def __str__(self):
  178.         return str(self.user)
  179.  
  180.     __repr__ = __str__
  181.  
  182.     class Meta:
  183.         verbose_name = 'Запрос на подпись (Имущество и доступы)'
  184.         verbose_name_plural = 'Запрос на подпись (Имущество и доступы)'
  185.         ordering = ['-id']
  186.  
  187.  
  188. class SubmissionRequestForm(ModelForm):
  189.  
  190.     class Meta:
  191.         model = SubmissionRequest
  192.         fields = '__all__'
  193.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement