medicine-mts/appa/models.py

177 lines
7.5 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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', 'Не дозвонились'
TRANSFER = 'TRANSFER', 'Просьба перенести запись'
OTHER = 'OTHER', 'Другая ошибка'
STATUS_COLOR = {
Status.PENDING: '#2D72D2',
Status.APPROVED: '#238551',
Status.CANCELED: '#CD4246',
Status.CALLBACK: '#935610',
Status.WITHOUT_ANSWER: '#866103',
Status.TRANSFER: '#B83211',
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):
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='Дата запроса')
class Meta:
verbose_name = 'Запрос'
verbose_name_plural = 'История запросов'
ordering = ('-created',)
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()