import uuid from django.db import models from .managers import CallRequestManager __all__ = [ 'CallMedicalService', 'CallMedicalSpeciality', 'CallLPU', 'CallRequest', 'RequestLog' ] class CallMedicalService(models.Model): medical_service = models.ForeignKey('medicine.MedicalService', db_constraint=False, on_delete=models.CASCADE, verbose_name='Услуга (МИС)') name = models.CharField(max_length=100, verbose_name='Произношение роботом') class Meta: verbose_name = 'Услуга' verbose_name_plural = 'Услуги' def __str__(self): return f'{self.medical_service.name} ← {self.name}' class CallMedicalSpeciality(models.Model): speciality = models.ForeignKey('medicine.MedicalSpeciality', db_constraint=False, on_delete=models.CASCADE, verbose_name='Специальность (МИС)') name = models.CharField(max_length=100, verbose_name='Произношение роботом') class Meta: verbose_name = 'Специальность' verbose_name_plural = 'Специальности' def __str__(self): return f'{self.name}' class CallLPU(models.Model): lpu = models.ForeignKey('medicine.LPU', db_constraint=False, on_delete=models.CASCADE, verbose_name='ЛПУ') name = models.CharField(max_length=100, verbose_name='Произношение роботом') address = models.TextField(max_length=200, null=True, blank=True, verbose_name='Адрес для произношения роботом') class Meta: verbose_name = 'Филиал' verbose_name_plural = 'Филиалы' def __str__(self): return self.lpu.full_name class CallRequest(models.Model): class Status(models.TextChoices): PENDING = 'PENDING', 'Обзвон еще не состоялся' APPROVED = 'APPROVED', 'Прием подтвержден' CANCELED = 'CANCELED', 'Прием отменен' CALLBACK = 'CALLBACK', 'Перезвонить' WITHOUT_ANSWER = 'WITHOUT_ANSWER', 'Не дозвонились' OTHER = 'OTHER', 'Другая ошибка' STATUS_COLOR = { Status.PENDING: '#2D72D2', Status.APPROVED: '#238551', Status.CANCELED: '#CD4246', Status.CALLBACK: '#935610', Status.WITHOUT_ANSWER: '#866103', Status.OTHER: '#5A701A' } class RequestStatus(models.TextChoices): NOT_SENT = 'PENDING', 'Не отправлен' SENT = 'APPROVED', 'Отправлен' ERROR = 'ERROR', 'Ошибка' SERVICE_UNAVAILABLE = 'SERVICE_UNAVAILABLE', 'Сервис недоступен' COMPLETED = 'COMPLETED', 'Завершен' REQUEST_STATUS_COLOR = { RequestStatus.NOT_SENT: '#2D72D2', RequestStatus.SENT: '#238551', RequestStatus.ERROR: '#CD4246', RequestStatus.SERVICE_UNAVAILABLE: '#7961DB', RequestStatus.COMPLETED: '#147EB3', } uid = models.UUIDField(unique=True, default=uuid.uuid4, editable=False) status = models.CharField(max_length=20, choices=Status.choices, default=Status.PENDING, verbose_name='Статус приема') request_status = models.CharField(max_length=20, choices=RequestStatus.choices, default=RequestStatus.NOT_SENT, verbose_name='Статус запроса') date = models.DateField(verbose_name='Дата') booking_id = models.PositiveIntegerField(unique=True, null=True, verbose_name='ID записи на прием') booking_date = models.DateTimeField(null=True, verbose_name='Дата и время записи на прием') patient_id = models.IntegerField(verbose_name='ID пациента') patient_first_name = models.CharField(max_length=200, verbose_name='Имя') patient_last_name = models.CharField(max_length=200, verbose_name='Фамилия') patient_middle_name = models.CharField(max_length=200, null=True, blank=True, verbose_name='Отчество') patient_phone = models.CharField(max_length=100, verbose_name='Номер телефона') doctor_name = models.CharField(max_length=100, null=True, verbose_name='Врач') doctor_speciality = models.CharField(max_length=200, null=True, verbose_name='Специальность врача') service_name = models.CharField(max_length=200, null=True, blank=True, verbose_name='Услуга') organization = models.CharField(max_length=200, null=True, blank=True, verbose_name='Организация') address = models.CharField(max_length=200, null=True, blank=True, verbose_name='Адрес') data = models.JSONField(default=dict, blank=True, verbose_name='Данные') is_active = models.BooleanField(default=True, verbose_name='Активность') call_id = models.CharField(max_length=100, null=True, editable=False, verbose_name='ID') call_data = models.JSONField(default=dict, blank=True, editable=False) call_text_log = models.TextField(null=True, blank=True, editable=False, verbose_name='Лог') call_result = models.CharField(max_length=100, null=True, editable=False, blank=True, verbose_name='Результат') request_time = models.DateTimeField(null=True, editable=False) response_status_code = models.IntegerField(null=True, editable=False) response_message = models.TextField(null=True, editable=False) class Meta: verbose_name = 'Запрос на звонок' verbose_name_plural = 'Запросы на звонки' objects = CallRequestManager() def __str__(self): return f"{self.date.strftime('%d.%m.%Y')} / {self.patient_last_name}" def get_status_color(self): return self.STATUS_COLOR.get(self.status) def get_request_status_color(self): return self.REQUEST_STATUS_COLOR.get(self.request_status) def reset_request(self): self.call_id = None self.call_data = dict() self.request_status = CallRequest.RequestStatus.NOT_SENT self.status = CallRequest.Status.PENDING self.request_time = None self.response_status_code = None self.response_message = None self.save(update_fields=( 'request_status', 'request_time', 'response_status_code', 'response_message', )) class RequestLog(models.Model): class Meta: verbose_name = 'Запрос' verbose_name_plural = 'История запросов' ordering = ('-created',) request_url = models.CharField(max_length=500, verbose_name='Адрес запроса') request_body = models.TextField(null=True, blank=True, verbose_name='Запрос') request_method = models.CharField(max_length=100, null=True, verbose_name='Тип запроса') response_body = models.TextField(null=True, blank=True, verbose_name='Ответ') response_http_code = models.CharField(max_length=4, null=True, verbose_name='HTTP статус ответа') created = models.DateTimeField(auto_now_add=True, editable=False, db_index=True, verbose_name='Дата запроса') def __str__(self): return self.request_url def response_hook(self, r, *args, **kwargs): self.response_http_code = r.status_code self.response_body = r.text self.save()