import uuid from django.db import models from .managers import CallRequestManager __all__ = [ 'CallRequest', 'RequestLog' ] class CallRequest(models.Model): class Status(models.TextChoices): PENDING = 'PENDING', 'Обзвон еще не состоялся' APPROVED = 'APPROVED', 'Прием подтвержден' CANCELED = 'CANCELED', 'Прием отменен' WITHOUT_ANSWER = 'WITHOUT_ANSWER', 'Не дозвонились' OTHER = 'OTHER', 'Другая ошибка' STATUS_COLOR = { Status.PENDING: '#2D72D2', Status.APPROVED: '#238551', Status.CANCELED: '#CD4246', Status.WITHOUT_ANSWER: '#866103', } class RequestStatus(models.TextChoices): NOT_SENT = 'PENDING', 'Не отправлен' SENT = 'APPROVED', 'Отправлен' ERROR = 'ERROR', 'Ошибка' SERVICE_UNAVAILABLE = 'SERVICE_UNAVAILABLE', 'Сервис недоступен' REQUEST_STATUS_COLOR = { RequestStatus.NOT_SENT: '#2D72D2', RequestStatus.SENT: '#238551', RequestStatus.ERROR: '#CD4246', RequestStatus.SERVICE_UNAVAILABLE: '#7961DB', } 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(null=True, verbose_name='ID записи на прием') 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=100, null=True, verbose_name='Специальность врача') service_name = models.CharField(max_length=100, null=True, blank=True, verbose_name='Услуга') address = models.CharField(max_length=100, 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 = 'Запросы на звонки' unique_together = ( ('date', 'patient_id'), ) 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.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()