Advertisement
Mochinov

Untitled

Apr 2nd, 2021
326
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 70.48 KB | None | 0 0
  1. # -*- coding=utf-8 -*-
  2. from django.db import models
  3. from django.core.validators import RegexValidator
  4. from django.contrib.auth.models import User
  5. from django.conf import settings
  6. from django.db.models.signals import post_save
  7. from datetime import timedelta, datetime, time
  8. from django.urls import reverse
  9. from .date import *
  10. from django.db.models.signals import post_save
  11. from django.dispatch import receiver
  12. from django.core.exceptions import ValidationError
  13. from django.forms.models import model_to_dict
  14. import pandas as pd
  15. import json
  16.  
  17. class RegionOfDepartment(models.Model):
  18. region_name = models.CharField('Название региона', max_length=255, blank=False, db_index=True)
  19.  
  20. def __str__(self):
  21. return str(self.region_name)
  22.  
  23. class Meta:
  24. verbose_name = 'Регион проживания'
  25. verbose_name_plural = 'Регионы проживания'
  26. db_table = 'region_of_department'
  27.  
  28. class HumanResourcesDepartment(models.Model):
  29. fio = models.CharField('Ф.И.О', max_length=255, blank=False, db_index=True)
  30. region_of_residence = models.ForeignKey(RegionOfDepartment, verbose_name='Регион проживания', on_delete=models.CASCADE, blank=False, db_index=True)
  31. phone_regex = RegexValidator(regex=r'^\+?1?\d{9,15}$')
  32. phone = models.CharField('Контактный номер телефона', validators=[phone_regex], max_length=17, blank=False,db_index=True)
  33. education = models.CharField('Образование', max_length=450, blank=False)
  34. specialty = models.CharField('Cпециальность', max_length=450, blank=False)
  35. practical_experience = models.CharField('Практический опыт', max_length=450, blank=False)
  36. desired_place_of_work = models.CharField('Желаемое место работы', max_length=450)
  37. desired_salary = models.CharField('Желаемая заработная плата', max_length=450)
  38. note = models.TextField('Примечание')
  39. recording_time = models.DateTimeField('Время записи', blank=False, null=True)
  40. operator = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name='Оператор', null=True, blank=False)
  41.  
  42. def __str__(self):
  43. return str(self.fio)
  44.  
  45. class Meta:
  46. verbose_name = 'Отдел кадров'
  47. verbose_name_plural = 'Отдел кадров'
  48. db_table = 'human_resources_department'
  49. ordering = ['recording_time']
  50.  
  51.  
  52.  
  53.  
  54.  
  55.  
  56.  
  57. class Complaints(models.Model):
  58. fio = models.CharField('Ф.И.О', max_length=255, blank=False, db_index=True)
  59. phone_regex = RegexValidator(regex=r'^\+?1?\d{9,15}$')
  60. phone = models.CharField('Контактный номер телефона', validators=[phone_regex], max_length=17, blank=True,db_index=True)
  61. text = models.TextField('Сообщение', max_length=1000, blank=False)
  62. institution = models.CharField('Учреждение', max_length=500, null=True, blank=False)
  63. operator = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name='Оператор', null=True, blank=True)
  64. recording_time = models.DateTimeField('Время записи', blank=False, null=True)
  65. polyclinic = models.ForeignKey('Polyclinic', null=True, blank=True,verbose_name="Учреждение", on_delete=models.CASCADE, default=None)
  66. сomplaint_forwarded = models.BooleanField("Жалоба передана", default=False)
  67.  
  68.  
  69. def __str__(self):
  70. return 'Жалоба от: ' + str(self.fio)
  71.  
  72. class Meta:
  73. verbose_name = 'Жалобы'
  74. verbose_name_plural = 'Жалобы'
  75. db_table = 'complaints'
  76. ordering = ['recording_time']
  77.  
  78. class Notice(models.Model):
  79. topic = models.CharField('Тема', max_length=150, blank=False)
  80. text = models.CharField('Сообщение', max_length=1000, blank=False)
  81. polyclinic = models.ForeignKey('Polyclinic', null=True, blank=True,verbose_name="Мед. учреждение", on_delete=models.CASCADE, default=None)
  82. operator = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name='Оператор', null=True, blank=True)
  83. recording_time = models.DateTimeField('Время записи', blank=False, null=True)
  84. active = models.BooleanField('Снята с доски', blank=False, default=False)
  85. def __str__(self):
  86. return 'Заметка : ' + str(self.polyclinic)
  87. class Meta:
  88. verbose_name = 'Заметки'
  89. verbose_name_plural = 'Заметка'
  90. db_table = 'notice'
  91. ordering = ['recording_time']
  92.  
  93. class DiseaseCode(models.Model):
  94. code = models.FloatField('Код Заболевания',blank=False)
  95. name_disease = models.CharField('Название заболевания', max_length=150, blank=False)
  96.  
  97. def __str__(self):
  98. return str(self.code) +')' + ' ' + str(self.name_disease)
  99.  
  100. class Meta:
  101. verbose_name = 'Коды заболеваний'
  102. verbose_name_plural = 'Код заболевания'
  103. db_table = 'disease_code'
  104. ordering = ['code']
  105.  
  106.  
  107. class Town(models.Model):
  108. """Модель города"""
  109. name = models.CharField('Название Города', blank=False, max_length=25)
  110. time_shifting = models.IntegerField('Временной сдвиг', blank=False)
  111.  
  112. def __str__(self):
  113. return self.name
  114.  
  115. class Meta:
  116. verbose_name = 'Город'
  117. verbose_name_plural = 'Города'
  118. db_table = 'town'
  119.  
  120.  
  121. class WorkInfo(models.Model):
  122. """Дополнительная информация для поликлиники"""
  123. text = models.TextField("Уведомление", null=True, blank=False)
  124. polyclinic = models.ForeignKey('Polyclinic', null=True, blank=True,verbose_name="Мед. учреждение", on_delete=models.CASCADE, default=None)
  125. archive = models.BooleanField('Архивировать уведомление', blank=True, default=False)
  126. recording_time = models.DateTimeField('Время записи', blank=False, null=True)
  127.  
  128. class Meta:
  129. verbose_name = 'Уведомления поликлиник'
  130. verbose_name_plural = "Уведомление поликлиники"
  131. db_table = 'workinfo'
  132. ordering = ['-recording_time']
  133.  
  134. def save(self, *args, **kwargs):
  135. if self.polyclinic.town:
  136. self.recording_time = get_time_to_city(self.polyclinic.town.time_shifting)
  137. super(WorkInfo, self).save(*args, **kwargs)
  138.  
  139. def __str__(self):
  140. return 'Уведомление: ' + str(self.polyclinic.name)
  141.  
  142.  
  143. def get_absolute_url(self):
  144. return reverse('detail_views', args=[self.polyclinic.id])
  145.  
  146. class Week(models.Model):
  147. """Дни недели"""
  148. day_of_week = models.CharField(
  149. 'День недели', max_length=13, null=True, blank=False)
  150.  
  151. class Meta:
  152. verbose_name = 'Дни недели'
  153. verbose_name_plural = "День недели"
  154. db_table = 'week'
  155.  
  156. def __str__(self):
  157. if self.day_of_week == None:
  158. return ''
  159. else:
  160. return str(self.day_of_week)
  161.  
  162.  
  163. class ReceivingCalls(models.Model):
  164. """График приёмов вызова"""
  165. days_of_the_week = models.ForeignKey(Week, verbose_name='График Приёмов вызова', on_delete=models.CASCADE, null=True)
  166. polyclinic = models.ForeignKey('Polyclinic', null=True, blank=True, verbose_name="Мед. учреждение", on_delete=models.CASCADE, default=None)
  167. start_work = models.TimeField('Начала работы', blank=True, null=True)
  168. end_work = models.TimeField('Конец рабочего дня', blank=True, null=True)
  169.  
  170. class Meta:
  171. verbose_name = 'Прием вызовов'
  172. verbose_name_plural = "Прием вызова"
  173. db_table = 'receivingcalls'
  174.  
  175. def __str__(self):
  176. if self.days_of_the_week == None:
  177. return ''
  178. else:
  179. return str(self.days_of_the_week) + ' - ' + str(self.polyclinic.name)
  180.  
  181.  
  182. class WorkSchedule(models.Model):
  183. """Режим работы"""
  184. days_of_the_week = models.ForeignKey(
  185. Week, verbose_name='График работ', on_delete=models.CASCADE, null=True)
  186. polyclinic = models.ForeignKey('Polyclinic', null=True, blank=False,
  187. verbose_name="Мед. учреждение", on_delete=models.CASCADE, default=None)
  188. start_work = models.TimeField('Начала работы', blank=True, null=True)
  189. end_work = models.TimeField('Конец рабочего дня', blank=True, null=True)
  190.  
  191. class Meta:
  192. verbose_name = 'График работ'
  193. verbose_name_plural = "График работ"
  194. db_table = 'workschedule'
  195.  
  196. def __str__(self):
  197. if self.days_of_the_week == None:
  198. return ''
  199. else:
  200. return str(self.days_of_the_week) + ' - ' + str(self.polyclinic.name)
  201.  
  202. class ServedGroups(models.Model):
  203. type_groups = models.CharField('Тип группы', max_length=255, blank=False, db_index=True, null=True)
  204.  
  205. def __str__(self):
  206. return str(self.type_groups)
  207.  
  208. class Meta:
  209. verbose_name = 'Обслуживаемые группы'
  210. verbose_name_plural = "Обслуживаемые группы"
  211. db_table = 'servedgroups'
  212. ordering = ['id']
  213.  
  214. class DoctorManager(models.Manager):
  215. def get_by_natural_key(self, polyclinic):
  216. return self.get(polyclinic=polyclinic)
  217.  
  218.  
  219. class Category(models.Model):
  220. name = models.CharField('Категория', max_length = 150, blank=True)
  221. polyclinic = models.ForeignKey('Polyclinic', on_delete=models.SET_NULL, null=True)
  222. def __str__(self):
  223. return str(self.name)
  224.  
  225. class Meta:
  226. verbose_name = 'Категория'
  227. verbose_name_plural = "Категории"
  228.  
  229. class Specialization(models.Model):
  230. name = models.CharField('Название специализации', max_length=128, blank=False)
  231.  
  232. def __str__(self):
  233. return str(self.name)
  234.  
  235. class Meta:
  236. verbose_name = 'Cпециализации'
  237. verbose_name_plural = 'Cпециализации'
  238. db_table = 'Specialization'
  239.  
  240. class Doctor(models.Model):
  241. TYPE_CALL = [
  242. ('Общие практики (Терапевт/Педеатор)','Общие практики (Терапевт/Педеатор)'),
  243. ('COVID', 'COVID'),
  244. ('Хроники', 'Хроники'),
  245. ]
  246. user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, verbose_name='Пользователь',default=None)
  247. fio = models.CharField('Ф.И.О', max_length=255, blank=False, db_index=True, null=True)
  248. polyclinic = models.ForeignKey('Polyclinic', on_delete=models.SET_NULL, blank=True, null=True)
  249. zone = models.ManyToManyField('Zone', blank=False)
  250. position = models.CharField('Должность', max_length = 150, blank=True)
  251. specialty = models.ForeignKey('Specialization',on_delete=models.SET_NULL, null=True, blank=True)
  252. town = models.ForeignKey(Town, verbose_name="Город",null=True, blank=False, on_delete=models.SET_NULL)
  253. phone_regex = RegexValidator(regex=r'^\+?1?\d{9,15}$')
  254. category = models.ForeignKey('Category',on_delete=models.SET_NULL, null=True, blank=True)
  255. phone = models.CharField('Контактный номер телефона', validators=[phone_regex], max_length=17, blank=True,db_index=True)
  256. type_call = models.ManyToManyField(ServedGroups, blank=True)
  257. read_only_license = models.BooleanField('Только для чтения', default=False, null=True)
  258. login = models.CharField('Логин', max_length=15, blank=False, db_index=True, null=True)
  259. password = models.CharField('Пароль', max_length=20, blank=False, db_index=True, null=True)
  260. objects = DoctorManager()
  261. onn_or_off_web_phone = models.BooleanField('Включить веб телефон', default=True)
  262.  
  263. class Meta:
  264. unique_together = ['polyclinic']
  265.  
  266. def natural_key(self):
  267. return (self.polyclinic)
  268.  
  269. def clear_the_doctor_zone(self, id, id_zone):
  270.  
  271. del_zone = Doctor.objects.get(id = id)
  272. del_zone.zone.remove(id_zone)
  273.  
  274. def save(self,chenge_zone = False, zone_id = None, *args, **kwargs):
  275.  
  276. if chenge_zone:
  277. self.zone.clear()
  278. if zone_id:
  279. zones = [int(x) for x in zone_id]
  280. else:
  281. zones = [int(x.id) for x in self.zone.all()]
  282. for zone in zones:
  283. self.zone.add(Zone.objects.get(id = zone))
  284. super(Doctor, self).save(*args, **kwargs)
  285.  
  286.  
  287. def __str__(self):
  288. return str(self.fio)
  289.  
  290. class Meta:
  291. verbose_name = 'Доктор'
  292. verbose_name_plural = "Доктора"
  293. db_table = "doctors"
  294.  
  295. class Zone(models.Model):
  296. """Участок"""
  297. number = models.CharField('Название участка',max_length=100, blank=False, null=True)
  298. polyclinic = models.ForeignKey('Polyclinic', on_delete=models.SET_NULL, blank=True, null=True)
  299. subdivision = models.ForeignKey('Subdivision_Polyclinic', on_delete=models.SET_NULL, blank=True, null=True)
  300. def __str__(self):
  301. return str(self.id) + ':'+str(self.name_zone) + ' Мед. Учреждение: ' + str(self.polyclinic)
  302. def __str__(self):
  303. if self.number == None:
  304. return ' '
  305. else:
  306. return str(self.number)
  307.  
  308. class Meta:
  309. verbose_name = 'Номер участков'
  310. verbose_name_plural = "Номер участка"
  311. db_table = "zone_location"
  312.  
  313.  
  314. class Location(models.Model):
  315. """Адреса мед. учреждений"""
  316. polyclinic = models.ForeignKey('Polyclinic', on_delete=models.SET_NULL, blank=True, null=True)
  317. subdivision_polyclinics = models.ForeignKey('Subdivision_Polyclinic', on_delete=models.SET_NULL, blank=True, null=True)
  318. zone = models.ForeignKey(Zone, on_delete=models.SET_NULL, blank=True, null=True)
  319. # doctor = models.ForeignKey(Doctor, on_delete=models.SET_NULL, blank=True, null=True)
  320. building = models.CharField('Дом №', max_length=100, blank=True, null=True, default='')
  321. street = models.CharField(max_length=100, null=True, blank=True, verbose_name='Улица',)
  322. chek_building = models.BooleanField('Указаны ли дома:', null=True, default=True)
  323. document_address = models.FileField("Список адресов:", upload_to='uploads/document/', blank=True, null=True)
  324.  
  325. def __str__(self):
  326. if self.street == None:
  327. return ' '
  328. else:
  329. return str(self.street) + ' , ' + str(self.building) + str(', ' + self.polyclinic.town.name) if self.polyclinic else ''
  330.  
  331. class Meta:
  332. verbose_name = 'Дислокация участков'
  333. verbose_name_plural = "Дислокация участка"
  334. db_table = "location"
  335.  
  336.  
  337. class Subdivision_Polyclinic(models.Model):
  338. """Подразделение"""
  339. CHOICES_OPTION = (
  340. ('Взрослая поликлиника', 'Взрослая поликлиника'),
  341. ('Детская поликлиника', 'Детская поликлиника'),
  342. )
  343. name_sub = models.CharField(
  344. 'Название подразделения', max_length=100, blank=False, null=True, default='')
  345. email_sub = models.EmailField(
  346. 'Электронный адресс почты', null=True, blank=True)
  347. contact_sub = models.TextField(
  348. 'Контактные данные мед. подразделения', max_length=1000, null=True, blank=True)
  349. polyclinic = models.ForeignKey('Polyclinic', null=True, blank=True,verbose_name="Мед. Учреждение", on_delete=models.CASCADE, default=None)
  350.  
  351. branch = models.CharField(
  352. 'Отделение', choices=CHOICES_OPTION, max_length=20, null=True, blank=True)
  353. redirect = models.CharField(
  354. 'Редирект на МИС', max_length=130, blank=True, unique=False)
  355.  
  356. def to_json(self):
  357. return model_to_dict(self)
  358.  
  359. def __str__(self):
  360. if self.name_sub==None:
  361. return "ERROR-CUSTOMER NAME IS NULL"
  362. return self.name_sub
  363.  
  364. class Meta:
  365. verbose_name = 'Мед. подразделение'
  366. verbose_name_plural = "Мед. подразделения"
  367. db_table = "subdivision_polyclinics"
  368.  
  369. def get_absolute_url(self):
  370. return reverse('detail_views', args=[self.polyclinic.id])
  371.  
  372.  
  373. class Polyclinic(models.Model):
  374. """Поликлиника"""
  375. name = models.CharField('Название леч. учреждения',max_length=100, blank=False, null=True)
  376. email = models.EmailField('Элект,адресс почты', null=True, blank=True)
  377. contact = models.TextField('Контактные данные мед. учреждения', max_length=1000, null=True, default='', blank=True)
  378. town = models.ForeignKey(Town, verbose_name="Город",null=True, blank=False, on_delete=models.SET_NULL)
  379. redirect = models.CharField('Редирект на МИС', max_length=130, blank=True, unique=False)
  380. chek_redirect = models.BooleanField(
  381. 'Проверка редиректа', null=True, blank=True, default=False)
  382. direct_recording = models.BooleanField('Запись на прямую' , default=False)
  383.  
  384.  
  385. lat = models.FloatField('Широта', blank=True, null=True)
  386. lon = models.FloatField('Долгота', blank=True, null=True)
  387.  
  388. def to_json(self):
  389. return model_to_dict(self)
  390.  
  391. def get_type_redirect(self):
  392. if self.chek_redirect:
  393. return 'Редирект на мис'
  394. else:
  395. return 'Редирект на нашу бд'
  396.  
  397. def get_absolute_url(self):
  398. return reverse('detail_views', args=[self.id])
  399.  
  400. def __str__(self):
  401. return self.name
  402.  
  403. class Meta:
  404. verbose_name = 'Мед. учреждение'
  405. verbose_name_plural = "Мед. учреждения"
  406. db_table = "polyclinic"
  407.  
  408.  
  409. class Renouncement(models.Model):
  410. reason_for_renouncement = models.TextField('Причина отказа')
  411. operator = models.ForeignKey(User, on_delete=models.SET_NULL, verbose_name='Оператор', null=True, blank=True)
  412. recording_time = models.DateTimeField('Время записи', blank=False, null=True)
  413.  
  414. class Meta:
  415. verbose_name = 'Отмена вызова'
  416. verbose_name_plural = "Отмена вызова"
  417. db_table = "renouncement"
  418.  
  419. def __str__(self):
  420. return str(self.operator) + ' : ' + str(self.reason_for_renouncement) + '...'
  421.  
  422. class Patient_registration(models.Model):
  423. """Заявка пациента"""
  424. CHOICES_OPTION = (
  425. ('Есть', 'Есть'),
  426. ('Нет', 'Нет'),
  427. )
  428. TYPE_CALL = [
  429. ('Терапевт','Терапевт'),
  430. ('COVID', 'COVID'),
  431. ('Хроники', 'Хроники'),
  432. ('АИЦ', 'АИЦ'),
  433. ]
  434. name = models.CharField('Имя', max_length=255, blank=False, db_index=True)
  435. surname = models.CharField('Фамилия', max_length=255, blank=False,null=True, db_index=True)
  436. patronymic = models.CharField('Отчество', max_length=255, blank=False,null=True, db_index=True)
  437. date_of_birth = models.DateField('Дата рождения пациента', blank=False)
  438. address = models.CharField('Адресс проживания', max_length=255, blank=True, db_index=True)
  439. entrance = models.PositiveIntegerField('Подъезд №', blank=False)
  440. intercom_code = models.PositiveIntegerField('Код домофона', blank=False)
  441. flat = models.CharField('Квартира №', blank=False,null=True, max_length=10)
  442. floor = models.PositiveIntegerField('Этаж дома ', blank=False)
  443.  
  444. phone_regex = RegexValidator(regex=r'^\+?1?\d{9,15}$')
  445. phone = models.CharField('Контактный номер телефона', validators=[phone_regex], max_length=17, blank=True,db_index=True)
  446.  
  447. SNILS_regex = RegexValidator(regex=r'^\d{3}-\d{3}-\d{3}-\d{2}$')
  448. SNILS = models.CharField('СНИЛС', validators=[SNILS_regex], error_messages={'invalid': 'Не верный формат '}, max_length=15, blank=True)
  449.  
  450. c_m_i_regex = RegexValidator(regex=r'^(\d){1,16}$')
  451. C_M_O_policy = models.CharField('Полис ОМС', validators=[c_m_i_regex], error_messages={'invalid': 'Должно быть 16 цифр !'}, max_length=16, blank=True)
  452.  
  453. reason_for_calling = models.TextField('Причина вызова, (в том числе Актив)')
  454. polyclinic = models.ForeignKey(Polyclinic, on_delete=models.SET_NULL, blank=True, null=True)
  455. recording_time = models.DateTimeField('Время записи', blank=False, null=True)
  456. сall_transferred = models.BooleanField("Вызов передан", default=False)
  457.  
  458. temperature = models.FloatField('Температура', null=True, blank=True)
  459. cough = models.CharField('Кашель', max_length=15, choices=CHOICES_OPTION, null=True, blank=True)
  460. smell = models.CharField('Обоняние', max_length=15,choices=CHOICES_OPTION, null=True, blank=True)
  461. operator = models.ForeignKey(User, on_delete=models.SET_NULL, verbose_name='Оператор', null=True, blank=True)
  462.  
  463. address_fk = models.ForeignKey(Location, verbose_name="Адрес",on_delete=models.SET_NULL, blank=True, null=True, db_index=True)
  464. disease_codes = models.ManyToManyField(DiseaseCode,default=True,verbose_name='Коды заболеваний',blank=True)
  465.  
  466. close_call = models.BooleanField("Вызов завершён", default=False)
  467. time_close_call = models.DateTimeField('Время завершёного вызова ', blank=True, null=True)
  468.  
  469.  
  470. @property
  471. def fio(self):
  472. return str(self.surname) + ' ' + str(self.name) + ' ' + str(self.patronymic)
  473.  
  474. type_call = models.ForeignKey(
  475. ServedGroups,
  476. verbose_name='Тип вызова',
  477. on_delete=models.SET_NULL,
  478. null=True,
  479. blank=True
  480. )
  481. call_cancellation = models.ForeignKey(
  482. Renouncement,
  483. on_delete=models.SET_NULL,
  484. verbose_name='Отмена вызова',
  485. null=True,
  486. blank=True
  487. )
  488. doctor = models.ForeignKey(
  489. Doctor,
  490. on_delete=models.SET_NULL,
  491. blank=True,
  492. null=True
  493. )
  494. call_cancellation_state = models.BooleanField("Отмена заявки", default=False)
  495. class Meta:
  496. verbose_name = 'Регистрация нового пациента'
  497. verbose_name_plural = "Регистрация новых пациентов"
  498. db_table = "patient_registration"
  499.  
  500.  
  501.  
  502. class WaitingList(models.Model):
  503. fio = models.CharField('Ф.И.О',unique_for_date='recording_time', max_length=255, blank=False, db_index=True)
  504. date_of_birth = models.DateField('Дата рождения пациента', blank=False)
  505. address = models.CharField('Адресс проживания', max_length=255, blank=True, db_index=True)
  506. phone_regex = RegexValidator(regex=r'^\+?1?\d{9,15}$')
  507. phone = models.CharField('Контактный номер телефона', validators=[phone_regex], max_length=17, blank=True,db_index=True)
  508.  
  509. SNILS_regex = RegexValidator(regex=r'^\d{3}-\d{3}-\d{3}-\d{2}$')
  510. SNILS = models.CharField('СНИЛС', validators=[SNILS_regex], error_messages={'invalid': 'Не верный формат '}, max_length=15, blank=True)
  511.  
  512. c_m_i_regex = RegexValidator(regex=r'^(\d){1,16}$')
  513. C_M_O_policy = models.CharField('Полис ОМС', validators=[c_m_i_regex], error_messages={'invalid': 'Должно быть 16 цифр !'}, max_length=16, blank=True)
  514. reason_for_calling = models.TextField('Необхоимый приём')
  515. polyclinic = models.ForeignKey(Polyclinic, on_delete=models.SET_NULL, blank=True, null=True)
  516. recording_time = models.DateTimeField('Время записи', blank=False, null=True)
  517. сall_transferred = models.BooleanField("Вызов передан", default=False)
  518. operator = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name='Оператор', null=True, blank=True)
  519. final_state = models.TextField('Итоговое состояние', null=True)
  520.  
  521. address_fk = models.ForeignKey(Location, verbose_name="Адрес",on_delete=models.SET_NULL, blank=True, null=True, db_index=True)
  522. direction_number = models.CharField('Номер направления ', max_length=255, blank=True, db_index=True)
  523.  
  524. class Meta:
  525. verbose_name = 'Список ожидания'
  526. verbose_name_plural = "Список ожиданий"
  527. db_table = "waiting_list"
  528.  
  529. def __str__(self):
  530. return str(self.fio)
  531.  
  532. class Activity(models.Model):
  533. """Логирование действий"""
  534. CHOICES_OPTION = (
  535. ('Создание объекта', 'Создание объекта'),
  536. ('Обновление объекта', 'Обновление объекта'),
  537. ('Удаление объекта', 'Удаление объекта'),
  538. ('Запись в МИС', 'Запись в МИС'),
  539. ('Отправка email','Отправка email'),
  540. ('Отмена заявки на привязку к поликлинике','Отмена заявки на привязку к поликлинике'),
  541. )
  542. user = models.ForeignKey(User, on_delete=models.CASCADE)
  543. actions = models.CharField(choices=CHOICES_OPTION, max_length=50, blank=False, null=True)
  544. recording_time = models.DateTimeField('Время записи', blank=False, null=True)
  545. obj = models.CharField('Объект с котором произошло действие',max_length=150, blank=False, null=True)
  546.  
  547. def __str__(self):
  548. return str(self.user) + ' : ' + str(self.actions) + ' : ' + str(self.obj)
  549.  
  550. class Meta:
  551. verbose_name = 'Действия на сайте'
  552. verbose_name_plural = "Действие на сайте"
  553. db_table = "activity"
  554.  
  555.  
  556. class Account(models.Model):
  557. user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, verbose_name='Пользователь')
  558. read_only = models.BooleanField('Только для чтения', default=False, null=True)
  559. polyclinic = models.ManyToManyField(Polyclinic, blank=True, verbose_name='Мед. Учреждение')
  560. autoupdate = models.BooleanField('Авто обновление страницы', default=True)
  561. # login_allowed = models.BooleanField('Только для чтения', default=False, null=True)
  562. def __str__(self):
  563. return str(self.user)
  564.  
  565. class Meta:
  566. verbose_name = 'Аккаунты'
  567. verbose_name_plural = "Аккаунт"
  568. db_table = "account"
  569.  
  570. @receiver(post_save, sender=User)
  571. def save_or_create_account(sender, instance, created, **kwargs):
  572. if created:
  573. Account.objects.create(user=instance)
  574. else:
  575. try:
  576. instance.account.save()
  577. except ObjectDoesNotExist:
  578. Account.objects.create(user=instance)
  579.  
  580.  
  581.  
  582.  
  583. class HospitalWard(models.Model):
  584. """Больничная палата"""
  585.  
  586. class HospitalWardStatus(models.TextChoices):
  587. """ Возможные типы палат """
  588. COVID = "COVID", "COVID"
  589. OTHER = "OTHER", "Прочее"
  590.  
  591. number = models.IntegerField('Номер')
  592. description = models.CharField('Описание', max_length=255)
  593. type = models.CharField('Назначение', choices=HospitalWardStatus.choices, max_length=255)
  594. hospital = models.ForeignKey(Polyclinic, verbose_name='Больница', on_delete=models.CASCADE)
  595.  
  596. @property
  597. def total_bed_count(self):
  598. """ Общее количество коек в палате """
  599. return HospitalBed.objects.filter(ward=self).count()
  600.  
  601. @property
  602. def vacant_bed_count(self):
  603. """ Количество свободных коек в палате """
  604. return HospitalBed.objects.filter(ward=self, status=HospitalBed.HospitalBedStatus.VACANT).count()
  605.  
  606. def to_json(self):
  607. return model_to_dict(self)
  608.  
  609. def __str__(self):
  610. return str(self.number)
  611.  
  612. class Meta:
  613. verbose_name = 'Палата'
  614. verbose_name_plural = 'Палаты'
  615. db_table = 'hospital_wards'
  616.  
  617.  
  618. class Gender(models.Model):
  619. gender = models.CharField('Пол', blank=False, max_length=25)
  620. def __str__(self):
  621. return str(self.gender)
  622.  
  623. class Meta:
  624. verbose_name = 'Пол'
  625. verbose_name_plural = 'Пол'
  626. db_table = 'gender'
  627.  
  628. class Blod_Type(models.Model):
  629. name_type = models.CharField('Тип крови', max_length=25, null=False)
  630. def __str__(self):
  631. return str(self.name_type)
  632.  
  633. class Meta:
  634. verbose_name = 'Тип крови'
  635. verbose_name_plural = 'Тип крови'
  636. db_table = 'blod_type'
  637.  
  638. class Region(models.Model):
  639. name = models.CharField('Название Региона/Области',null=True,blank=True, max_length=150)
  640. num_code = models.CharField('Код телефона', null=True,blank=True, max_length=3)
  641. name_ENG = models.CharField('Название на английском', null=True, blank=True, max_length=180)
  642.  
  643. def return_city_code(name_ENG):
  644. num_code = Region.objects.get(name_ENG = name_ENG).num_code
  645. return settings.EMERGENCY_PHONES.get(num_code, None)
  646.  
  647. def __str__(self):
  648. return self.name
  649. class Meta:
  650. db_table = 'region'
  651. verbose_name = 'Регион'
  652. verbose_name_plural = 'Регионы'
  653. ordering = ['name']
  654.  
  655. class Entity(models.Model):
  656. name_organization = models.CharField('Название организации',null=True,blank=True, max_length=150)
  657. inn = models.CharField('ИНН',null=True,blank=True, max_length=12)
  658.  
  659. class Meta:
  660. db_table = 'entity'
  661. verbose_name = 'Юридическое лицо'
  662. verbose_name_plural = 'Юридическое лицо'
  663.  
  664.  
  665. class Patient_Address(models.Model):
  666. region = models.ForeignKey(Region, verbose_name="Регион",null=True, blank=True, on_delete=models.SET_NULL)
  667. town = models.ForeignKey(Town, verbose_name="Город",null=True, blank=True, on_delete=models.SET_NULL)
  668. district = models.CharField('Район',null=True,blank=True, max_length=150)
  669. postal_code = models.CharField('Индекс почтовый', blank=True,null=True,max_length=6)
  670. building = models.CharField('Дом №', max_length=100, blank=True, null=True, default='')
  671. street = models.CharField(max_length=100, null=True, blank=True, verbose_name='Улица',)
  672. flat = models.CharField('Квартира №', blank=True,null=True, max_length=10)
  673.  
  674. def __str__(self):
  675. str_addr = ''
  676. if self.town:
  677. str_addr += str(self.town) + ' '
  678. if self.street:
  679. str_addr += str(self.street) + ' '
  680. if self.building:
  681. str_addr += str(self.building) + ', '
  682. if self.flat:
  683. str_addr += '№' + str(self.flat) + ' '
  684. if self.region:
  685. str_addr += str(self.region) + ' '
  686.  
  687. return str_addr
  688.  
  689. class Meta:
  690. db_table = 'patient_address'
  691. verbose_name= 'Адресс пациента'
  692. verbose_name_plural= 'Адреса пациентов'
  693.  
  694.  
  695. class Patient(models.Model):
  696. """Пациент"""
  697. phone_regex = RegexValidator(regex=r'^\+7\d{11}$')
  698. user = models.OneToOneField(User, related_name='profile',null=True,on_delete=models.CASCADE)
  699. email = models.EmailField('E-mail',unique=True,null=True)
  700. surname = models.CharField('Фамилия', max_length=32, db_index=True)
  701. name = models.CharField('Имя', max_length=32)
  702. patronymic = models.CharField('Отчество', max_length=32)
  703. birth_date = models.DateField('Дата рождения',null=True)
  704. OMS = models.CharField('Номер полиса ОМС',unique=True,null=True, max_length=16)
  705. DMS = models.CharField('Номер полиса ДМС',unique=True,null=True, max_length=16)
  706. phone_number = models.CharField('Номер телефона',blank=True,unique=True,null=True, max_length=12)
  707. foto = models.FileField('Фото профиля', blank=True)
  708. relatives_phone_number = models.CharField('Номер телефона родственника', validators=[phone_regex], max_length=12, blank=True)
  709. relatives_phone_number_two = models.CharField('Номер телефона родственника', validators=[phone_regex], max_length=12, blank=True)
  710. # address = models.CharField('Адрес проживания', max_length=128)
  711. registration_address = models.CharField('Адрес регистрации', max_length=128)
  712. state = models.TextField('Состояние')
  713. order_bracelet = models.BooleanField('Заказан ли браслет?', default = False)
  714.  
  715. """Personal data"""
  716. gender = models.ForeignKey(Gender,verbose_name='Пол', null=True, on_delete=models.CASCADE)
  717. type_blood = models.ForeignKey(Blod_Type, verbose_name='Тип крови', null=True,on_delete=models.CASCADE)
  718. weight = models.FloatField('Вес', null=True)
  719. growth = models.FloatField('Рост', null=True)
  720.  
  721. """Patient addres"""
  722. place_of_residence = models.ForeignKey(Patient_Address, null=True,verbose_name='Адрес прописки', related_name='place_of_residence',on_delete=models.SET_NULL)
  723. residence_address = models.ForeignKey(Patient_Address, null=True,verbose_name='Адрес проживания',related_name='residence_address',on_delete=models.SET_NULL)
  724. information_about_work = models.ForeignKey(Patient_Address, null=True,verbose_name='Адрес проживания',related_name='information_about_work',on_delete=models.SET_NULL)
  725.  
  726.  
  727. """Citizenship"""
  728. сitizenship = models.CharField('Гражданство', max_length=150,blank=True, null=True)
  729. nationality = models.CharField('Национальность', max_length=100,blank=True, null=True)
  730. passport_serial_number = models.CharField('Серийный номер паспорта',blank=True, max_length=10, null=True)
  731. issued_by = models.CharField('выдан', max_length=355,blank=True, null=True)
  732. valid_until = models.DateField('Действует до',blank=True, null=True)
  733. identification_number = models.CharField('Идентификационный номер',blank=True, max_length=150, null=True)
  734.  
  735. """Critical value"""
  736.  
  737. bp_high_min = models.IntegerField('Минимальное верхнее давление', null=True, blank=True, default=100)
  738. bp_high_max = models.IntegerField('Максимальное верхнее давление', null=True, blank=True, default=180)
  739.  
  740. bp_low_min = models.IntegerField('Минимальное нижнее давление', null=True, blank=True, default=55)
  741. bp_low_max = models.IntegerField('Максимальное нижнее давление', null=True, blank=True, default=130)
  742. pulse_min = models.IntegerField('Минимальный пульс', null=True, blank=True, default=40)
  743. pulse_max = models.IntegerField('Максимальный пульс', null=True, blank=True, default=180)
  744.  
  745. temperature_min = models.IntegerField('Минимальная температура', null=True, blank=True, default=34)
  746. temperature_max = models.IntegerField('Максимальная температура', null=True, blank=True, default=42)
  747.  
  748. bo_min = models.IntegerField('Минимальное значение кислорода', null=True, blank=True, default=95)
  749. # bo_max = models.IntegerField('Максимальное значение кислорода', null=True, blank=True, default=100)
  750.  
  751. distance_min = models.IntegerField('Минимальное кол-во шагов', null=True, blank=True, default=2700)
  752. distance_min = models.IntegerField('Минимальное кол-во шагов', null=True, blank=True, default=20000)
  753.  
  754. distance_trand_min = models.IntegerField('Минимальное кол-во шагов', null=True, blank=True, default=2000)
  755. distance_trand_min = models.IntegerField('Минимальное кол-во шагов', null=True, blank=True, default=40000)
  756.  
  757. calories_min = models.IntegerField('Минимальное кол-во калорий', null=True, blank=True, default=1000)
  758. calories_max = models.IntegerField('Максимальное кол-во калорий', null=True, blank=True, default=5000)
  759.  
  760. calories_trand_min = models.IntegerField('Нижняя граница кол-ва калорий', null=True, blank=True, default=500)
  761. calories_trand_max = models.IntegerField('Верхняя граница кол-ва калорий', null=True, blank=True, default=5000)
  762.  
  763. tonometer_hp_min = models.IntegerField('Минимальное Систолическое давление', null=True, blank=True, default=100)
  764. tonometer_hp_max = models.IntegerField('Максимальное Систолическое давление', null=True, blank=True, default=180)
  765.  
  766. tonometer_hp_trand_min = models.IntegerField('Нижняя граница Систолическое давления', null=True, blank=True, default=110)
  767. tonometer_hp_trand_max = models.IntegerField('Верхняя граница Систолическое давления', null=True, blank=True, default=130)
  768.  
  769. tonometer_lp_min = models.IntegerField('Минимальное Диастолическое давление', null=True, blank=True, default=55)
  770. tonometer_lp_max = models.IntegerField('Максимальное Диастолическое давление', null=True, blank=True, default=130)
  771.  
  772. tonometer_lp_trand_min = models.IntegerField('Нижняя граница Диастолическое давления', null=True, blank=True, default=70)
  773. tonometer_lp_trand_max = models.IntegerField('Верхняя граница Диастолическое давления', null=True, blank=True, default=100)
  774.  
  775. temperature_trand_min = models.IntegerField('Нижняя граница тенденции температуры', null=True, blank=True)
  776. temperature_trand_max = models.IntegerField('Нижняя граница тенденции температуры', null=True, blank=True)
  777.  
  778. bp_difference_max = models.IntegerField('Максимальная разница давлений', null=True, blank=True)
  779. bp_difference_min = models.IntegerField('Минимальная разница давлений', null=True, blank=True)
  780.  
  781. bp_trand_high_min = models.IntegerField('Нижняя граница тенденции верхнего давления', null=True, blank=True)
  782. bp_trand_high_max = models.IntegerField('Верхняя граница тенденции верхнего давления', null=True, blank=True)
  783.  
  784. bp_trand_low_min = models.IntegerField('Нижняя граница тенденции нижнего давления', null=True, blank=True)
  785. bp_trand_low_max = models.IntegerField('Верхняя граница тенденции нижнего давления', null=True, blank=True)
  786.  
  787. bp_trand_difference_max = models.IntegerField('Верхняя граница тенденции разницы давлений', null=True, blank=True)
  788. bp_trand_difference_min = models.IntegerField('Нижняя граница тенденции разницы давлений', null=True, blank=True)
  789.  
  790. pulse_trand_min = models.IntegerField('Нижняя граница тенденции пульса', null=True, blank=True, default=70)
  791. pulse_trand_max = models.IntegerField('Верхняя граница тенденции пульса', null=True, blank=True, default=90)
  792.  
  793. bp_scenario_id = models.IntegerField('Сценарий давления', null=True, blank=True)
  794. mean_slide_number = models.IntegerField('Скользящая средняя', default=5)
  795.  
  796. bo_trand_min = models.IntegerField('Нижняя граница тенденции содержания кислорода', null=True, blank=True, default=90)
  797. bo_trand_max = models.IntegerField('Верхняя граница тенденции содержания кислорода', null=True, blank=True, default=95)
  798.  
  799. bg_min = models.IntegerField('Минимальное значение сахара в крови', null=True, blank=True, default=10)
  800. bg_max = models.IntegerField('Максимальное значение сахара в крови', null=True, blank=True, default=300)
  801.  
  802. bg_trand_min = models.IntegerField('Нижняя граница тенденции содержания сахара', null=True, blank=True)
  803. bg_trand_max = models.IntegerField('Верхняя граница тенденции содержания сахара', null=True, blank=True)
  804.  
  805. wristband_hr = models.IntegerField('Максимальное верхнее давление', null=True, blank=True, default=60)
  806.  
  807. '''Value Zones'''
  808. pulse_zone_min = models.IntegerField('Зона Максимума пульса', null=True, blank=True, default=50)
  809. pulse_zone_max = models.IntegerField('Зона Минимума пульса', null=True, blank=True, default=90)
  810.  
  811. calories_zone_min = models.IntegerField('Нижняя граница кол-ва калорий', null=True, blank=True, default=1500)
  812. calories_zone_max = models.IntegerField('Верхняя граница кол-ва калорий', null=True, blank=True, default=4000)
  813.  
  814. distance_zone_min = models.IntegerField('Минимальное кол-во шагов', null=True, blank=True, default=5000)
  815. distance_zone_min = models.IntegerField('Минимальное кол-во шагов', null=True, blank=True, default=10000)
  816.  
  817. tonometer_hp_zone_min = models.IntegerField('Нижняя граница Систолическое давления', null=True, blank=True, default=110)
  818. tonometer_hp_zone_max = models.IntegerField('Верхняя граница Систолическое давления', null=True, blank=True, default=130)
  819.  
  820. tonometer_lp_zone_min = models.IntegerField('Нижняя граница Систолическое давления', null=True, blank=True, default=70)
  821. tonometer_lp_zone_max = models.IntegerField('Верхняя граница Систолическое давления', null=True, blank=True, default=90)
  822.  
  823. bo_zone_min = models.IntegerField('Зона минимального значения кислорода', null=True, blank=True, default=95)
  824.  
  825.  
  826. mean_excess_number = models.IntegerField('Количество данных выше средней', default=2)
  827.  
  828. date_start = models.DateField('Начало периода', null=True, blank=True)
  829. date_end = models.DateField('Конец периода', null=True, blank=True)
  830.  
  831. def __str__(self):
  832. return ' '.join([self.surname, self.name, self.patronymic])
  833.  
  834. def to_json(self):
  835. return model_to_dict(self)
  836.  
  837. class Meta:
  838. verbose_name = 'Пациент'
  839. verbose_name_plural = 'Пациенты'
  840. db_table = 'patients'
  841.  
  842.  
  843. class Diagnosis(models.Model):
  844. """Диагноз"""
  845.  
  846. diagnosis_1 = models.TextField('Диагноз 1')
  847. diagnosis_2 = models.TextField('Диагноз 2', blank=True)
  848. diagnosis_3 = models.TextField('Диагноз 3', blank=True)
  849. diagnosis_4 = models.TextField('Диагноз 4', blank=True)
  850. diagnosis_5 = models.TextField('Диагноз 5', blank=True)
  851.  
  852. def __str__(self):
  853. return self.diagnosis_1
  854.  
  855. class Meta:
  856. verbose_name = 'Диагноз'
  857. verbose_name_plural = 'Диагнозы'
  858. db_table = 'diagnoses'
  859.  
  860.  
  861. class HospitalRefusal(models.Model):
  862. """Отказ от госпитализации"""
  863.  
  864. description = models.TextField('Описание')
  865. datetime = models.DateTimeField('Дата и время отказа', auto_now_add=True)
  866.  
  867. def __str__(self):
  868. return self.description
  869.  
  870. class Meta:
  871. verbose_name = 'Отказ'
  872. verbose_name_plural = 'Отказы'
  873. db_table = 'hospital_refusals'
  874.  
  875.  
  876. class HospitalDirection(models.Model):
  877. """Направление"""
  878.  
  879. class HospitalDirectionStatus(models.TextChoices):
  880. WAITING = "WAITING", "Ожидание"
  881. HOSPITALIZED = "HOSPITALIZED", "Госпитализация"
  882. REFUSED = "REFUSED", "Отмена"
  883.  
  884. phone_regex = RegexValidator(regex=r'^\+7\d{11}$')
  885.  
  886. from_ambulance = models.BooleanField('От скорой')
  887. doctor = models.ForeignKey(Doctor, verbose_name='Доктор', blank=True, null=True, on_delete=models.SET_NULL)
  888. patient_surname = models.CharField('Фамилия пациента', max_length=32, blank=True, db_index=True)
  889. patient_name = models.CharField('Имя пациента', blank=True, max_length=32)
  890. patient_patronymic = models.CharField('Отчество пациента', blank=True, max_length=32)
  891. patient_OMS = models.CharField('Номер полиса ОМС пациента', blank=True, max_length=16)
  892. patient_phone_number = models.CharField('Номер телефона пациента', blank=True, validators=[phone_regex], max_length=12)
  893. status = models.CharField('Статус', max_length=32, choices=HospitalDirectionStatus.choices)
  894. refusal = models.ForeignKey(HospitalRefusal, verbose_name='Отказ', blank=True, null=True, on_delete=models.SET_NULL)
  895. diagnosis = models.ForeignKey(Diagnosis, verbose_name='Диагноз', blank=True, null=True, on_delete=models.SET_NULL)
  896. wait_date_start = models.DateField('Дата начала ожидания', blank=True, null=True)
  897. wait_date_end = models.DateField('Дата окончания ожидания', blank=True, null=True)
  898.  
  899. hospital = models.ForeignKey(Polyclinic, verbose_name='Больница', on_delete=models.CASCADE)
  900.  
  901. def to_json(self):
  902. return model_to_dict(self)
  903.  
  904. def __str__(self):
  905. return 'ID %s (%s)' % (self.id, 'СМП' if self.from_ambulance else self.doctor.polyclinic)
  906.  
  907. class Meta:
  908. verbose_name = 'Направление'
  909. verbose_name_plural = 'Направления'
  910. db_table = 'hospital_directions'
  911.  
  912.  
  913. class HospitalAdmission(models.Model):
  914. """Поступление"""
  915.  
  916. patient = models.ForeignKey(Patient, verbose_name='Пациент', on_delete=models.CASCADE)
  917. direction = models.ForeignKey(HospitalDirection, verbose_name='Направление', on_delete=models.CASCADE)
  918. diagnosis = models.ForeignKey(Diagnosis, verbose_name='Поступление', on_delete=models.CASCADE)
  919. hospital = models.ForeignKey(Polyclinic, verbose_name='Больница', on_delete=models.CASCADE)
  920.  
  921. admission_date = models.DateField('Дата поступления', auto_now_add=True)
  922. discharge_planned_date = models.DateField('Планируемая дата выписки', blank=True, null=True)
  923. discharge_date = models.DateField('Дата выписки', blank=True, null=True)
  924. state = models.TextField('Состояние', blank=True)
  925.  
  926. @property
  927. def bed(self):
  928. """ Койка, занятая пациентом """
  929. return str(HospitalBed.objects.get(admission=self))
  930.  
  931. def __str__(self):
  932. return ', '.join([str(self.patient), self.admission_date.strftime('%d.%m.%Y')])
  933.  
  934. class Meta:
  935. verbose_name = 'Поступление'
  936. verbose_name_plural = 'Поступления'
  937. db_table = 'hospital_admissions'
  938.  
  939.  
  940. class HospitalBed(models.Model):
  941. """Больничная койка"""
  942.  
  943. class HospitalBedStatus(models.TextChoices):
  944. """ Возможные статусы коек """
  945. VACANT = "VACANT", "Свободна"
  946. OCCUPIED = "OCCUPIED", "Занята"
  947. RESERVED = "RESERVED", "Резерв"
  948.  
  949. @classmethod
  950. def create(cls, ward, status=HospitalBedStatus.VACANT, description='', direction=None, admission=None):
  951. """ Создание новой койки.
  952. Здесь мы выбираем минимальный еще не занятый номер для новой койки
  953. """
  954. nums = list(HospitalBed.objects.filter(ward=ward).values_list('number', flat=True))
  955. nums.sort()
  956. if not nums:
  957. number = 1
  958. else:
  959. number = max(nums) + 1
  960. for i in range(1, number):
  961. if i != nums[i-1]:
  962. number = i
  963. break
  964. bed = cls(ward=ward, number=number, status=status, description=description, direction=direction, admission=admission)
  965. bed.save()
  966. return bed
  967.  
  968. number = models.PositiveIntegerField('Номер')
  969. ward = models.ForeignKey(HospitalWard, verbose_name='Палата', related_name='wards', on_delete=models.CASCADE)
  970. description = models.CharField('Описание', max_length=64, blank=True)
  971. status = models.CharField('Статус', choices=HospitalBedStatus.choices, max_length=16)
  972. direction = models.ForeignKey(HospitalDirection, verbose_name='Направление', unique=True, blank=True, null=True, on_delete=models.SET_NULL)
  973. admission = models.ForeignKey(HospitalAdmission, verbose_name='Поступление', unique=True, blank=True, null=True, on_delete=models.SET_NULL)
  974.  
  975. @property
  976. def patient(self):
  977. """ Информация о пациенте.
  978. Если койка занята, берем данные о пациенте из поступления,
  979. если койка зарезервирована - из направления
  980. """
  981. if self.status == self.HospitalBedStatus.OCCUPIED:
  982. return str(self.admission)
  983. if self.status == self.HospitalBedStatus.RESERVED:
  984. return str(self.direction)
  985. else:
  986. return '-'
  987.  
  988. def to_json(self):
  989. return model_to_dict(self)
  990.  
  991. def __str__(self):
  992. return '%s/%s' % (str(self.ward), self.number)
  993.  
  994. class Meta:
  995. verbose_name = 'Палата'
  996. verbose_name_plural = 'Палаты'
  997. db_table = 'hospital_beds'
  998.  
  999. class CriticalParametrs(models.Model):
  1000. """Критические параметры, их устанавливает поликлиника пациенту через связь с таблицей Attachment по вн. ключу"""
  1001.  
  1002. bp_high_min = models.IntegerField('Минимальное верхнее давление', null=True, blank=True, default=100)
  1003. bp_high_max = models.IntegerField('Максимальное верхнее давление', null=True, blank=True, default=180)
  1004.  
  1005. bp_low_min = models.IntegerField('Минимальное нижнее давление', null=True, blank=True, default=55)
  1006. bp_low_max = models.IntegerField('Максимальное нижнее давление', null=True, blank=True, default=130)
  1007. pulse_min = models.IntegerField('Минимальный пульс', null=True, blank=True, default=40)
  1008. pulse_max = models.IntegerField('Максимальный пульс', null=True, blank=True, default=180)
  1009.  
  1010. temperature_min = models.IntegerField('Минимальная температура', null=True, blank=True, default=34)
  1011. temperature_max = models.IntegerField('Максимальная температура', null=True, blank=True, default=42)
  1012.  
  1013. bo_min = models.IntegerField('Минимальное значение кислорода', null=True, blank=True, default=95)
  1014. # bo_max = models.IntegerField('Максимальное значение кислорода', null=True, blank=True, default=100)
  1015.  
  1016. distance_min = models.IntegerField('Минимальное кол-во шагов', null=True, blank=True, default=2700)
  1017. distance_min = models.IntegerField('Минимальное кол-во шагов', null=True, blank=True, default=20000)
  1018.  
  1019. distance_trand_min = models.IntegerField('Минимальное кол-во шагов', null=True, blank=True, default=2000)
  1020. distance_trand_min = models.IntegerField('Минимальное кол-во шагов', null=True, blank=True, default=40000)
  1021.  
  1022. calories_min = models.IntegerField('Минимальное кол-во калорий', null=True, blank=True, default=1000)
  1023. calories_max = models.IntegerField('Максимальное кол-во калорий', null=True, blank=True, default=5000)
  1024.  
  1025. calories_trand_min = models.IntegerField('Нижняя граница кол-ва калорий', null=True, blank=True, default=500)
  1026. calories_trand_max = models.IntegerField('Верхняя граница кол-ва калорий', null=True, blank=True, default=5000)
  1027.  
  1028. temperature_trand_min = models.IntegerField('Нижняя граница тенденции температуры', null=True, blank=True)
  1029. temperature_trand_max = models.IntegerField('Нижняя граница тенденции температуры', null=True, blank=True)
  1030.  
  1031. bp_difference_max = models.IntegerField('Максимальная разница давлений', null=True, blank=True)
  1032. bp_difference_min = models.IntegerField('Минимальная разница давлений', null=True, blank=True)
  1033.  
  1034. bp_trand_high_min = models.IntegerField('Нижняя граница тенденции верхнего давления', null=True, blank=True)
  1035. bp_trand_high_max = models.IntegerField('Верхняя граница тенденции верхнего давления', null=True, blank=True)
  1036.  
  1037. bp_trand_low_min = models.IntegerField('Нижняя граница тенденции нижнего давления', null=True, blank=True)
  1038. bp_trand_low_max = models.IntegerField('Верхняя граница тенденции нижнего давления', null=True, blank=True)
  1039.  
  1040. bp_trand_difference_max = models.IntegerField('Верхняя граница тенденции разницы давлений', null=True, blank=True)
  1041. bp_trand_difference_min = models.IntegerField('Нижняя граница тенденции разницы давлений', null=True, blank=True)
  1042.  
  1043. pulse_trand_min = models.IntegerField('Нижняя граница тенденции пульса', null=True, blank=True, default=70)
  1044. pulse_trand_max = models.IntegerField('Верхняя граница тенденции пульса', null=True, blank=True, default=90)
  1045.  
  1046. bp_scenario_id = models.IntegerField('Сценарий давления', null=True, blank=True)
  1047. mean_slide_number = models.IntegerField('Скользящая средняя', default=5)
  1048.  
  1049. bo_trand_min = models.IntegerField('Нижняя граница тенденции содержания кислорода', null=True, blank=True, default=90)
  1050. bo_trand_max = models.IntegerField('Верхняя граница тенденции содержания кислорода', null=True, blank=True, default=95)
  1051.  
  1052. bg_min = models.IntegerField('Минимальное значение сахара в крови', null=True, blank=True, default=10)
  1053. bg_max = models.IntegerField('Максимальное значение сахара в крови', null=True, blank=True, default=300)
  1054.  
  1055. bg_trand_min = models.IntegerField('Нижняя граница тенденции содержания сахара', null=True, blank=True)
  1056. bg_trand_max = models.IntegerField('Верхняя граница тенденции содержания сахара', null=True, blank=True)
  1057.  
  1058. wristband_hr = models.IntegerField('Максимальное верхнее давление', null=True, blank=True, default=60)
  1059.  
  1060. '''Value Zones'''
  1061. pulse_zone_min = models.IntegerField('Зона Максимума пульса', null=True, blank=True, default=50)
  1062. pulse_zone_max = models.IntegerField('Зона Минимума пульса', null=True, blank=True, default=90)
  1063.  
  1064. calories_zone_min = models.IntegerField('Нижняя граница кол-ва калорий', null=True, blank=True, default=1500)
  1065. calories_zone_max = models.IntegerField('Верхняя граница кол-ва калорий', null=True, blank=True, default=4000)
  1066.  
  1067. distance_zone_min = models.IntegerField('Минимальное кол-во шагов', null=True, blank=True, default=5000)
  1068. distance_zone_min = models.IntegerField('Минимальное кол-во шагов', null=True, blank=True, default=10000)
  1069.  
  1070. bo_zone_min = models.IntegerField('Зона минимального значения кислорода', null=True, blank=True, default=95)
  1071.  
  1072. mean_excess_number = models.IntegerField('Количество данных выше средней', default=2)
  1073.  
  1074. date_start = models.DateField('Начало периода', null=True, blank=True)
  1075. date_end = models.DateField('Конец периода', null=True, blank=True)
  1076.  
  1077.  
  1078. class Attachment(models.Model):
  1079. """Прикрепление"""
  1080. recording_time = models.DateTimeField('Время записи', blank=False, null=True)
  1081. pacient = models.ForeignKey(Patient, verbose_name='Пациент', on_delete=models.CASCADE)
  1082. polyclinic = models.ForeignKey(Polyclinic, verbose_name='Поликлиника', on_delete=models.CASCADE)
  1083.  
  1084. confirmation_polyclynic = models.BooleanField('Подтверждение поликлиники', default=False)
  1085. confirmation_pacient = models.BooleanField('Подтверждение пациента', default=False)
  1086. refusal = models.BooleanField('Отказ', default=False)
  1087.  
  1088. critical_value = models.ForeignKey(CriticalParametrs, verbose_name='Критические параметры пациета', null=True, on_delete=models.CASCADE)
  1089.  
  1090. def __str__(self):
  1091. return str(self.pacient) + ' - ' + str(self.polyclinic)
  1092.  
  1093.  
  1094. def save(self, *args, **kwargs):
  1095. super(Attachment, self).save(*args, **kwargs)
  1096.  
  1097.  
  1098. class Meta:
  1099. db_table= 'attachment'
  1100. verbose_name = 'Запрос на прикрепление'
  1101. verbose_name_plural = 'Запросы на прикрепления'
  1102.  
  1103. # class Сonfirmation_Ticket(models.Model):
  1104.  
  1105.  
  1106. class Ticket(models.Model):
  1107. start_date_of_appointment = models.TimeField('Начала приёма', blank=True, null=True)
  1108. appointment_end_date = models.TimeField('Конец приёма', blank=True, null=True)
  1109. doctor = models.ForeignKey(Doctor, verbose_name='Доктор', null=True, on_delete=models.SET_NULL)
  1110. number_for_inspection = models.PositiveIntegerField('Кол-во времени на осмотр', null=True)
  1111. patient = models.ForeignKey(Patient, verbose_name='Пациент', null=True, on_delete=models.SET_NULL)
  1112. confirmation_status = models.BooleanField('Подтверждение статуса', default=False)
  1113. work_chedule = models.ForeignKey('Personal_Workchedule', verbose_name='Расписание доктора', null=True, on_delete=models.SET_NULL)
  1114. refuse = models.BooleanField('Отказ о данном талоне', default=False)
  1115. class Meta:
  1116. verbose_name = 'Талоны'
  1117. verbose_name_plural = "Талон"
  1118. ordering = ["work_chedule"]
  1119.  
  1120. def __str__(self):
  1121. return str(self.work_chedule) + ' ' + str(self.start_date_of_appointment) + ' ' + str(self.appointment_end_date) + ' ' + f'{ "" if not self.refuse else "(Отказ)"}'
  1122.  
  1123. def calculation_of_coupons(time_start, time_end, interval) -> list:
  1124. '''
  1125. Функция возвращает временной список с промежутком в {interval} минут
  1126. '''
  1127. period_list = []
  1128. period_start = time_start
  1129. while period_start < time_end:
  1130. period_end = period_start + interval
  1131. period_list.append((period_start, period_end))
  1132. period_start = period_end
  1133. return period_list
  1134.  
  1135.  
  1136. class Refusal_of_coupon(models.Model):
  1137. reason_for_renouncement = models.TextField('Причина отказа')
  1138. doctor = models.ForeignKey(Doctor, on_delete=models.SET_NULL, verbose_name='Врач', null=True, blank=True)
  1139. talon = models.ForeignKey(Ticket, on_delete=models.SET_NULL, verbose_name='Талон', related_name='refusal', null=True, blank=True)
  1140. recording_time = models.DateTimeField('Время записи', blank=False, null=True)
  1141.  
  1142. class Meta:
  1143. verbose_name = 'Отмена талона'
  1144. verbose_name_plural = "Отмена талона"
  1145. db_table = "refusal_of_coupon"
  1146.  
  1147. class Personal_Workchedule(models.Model):
  1148. """График приёма вызова на один день для врача"""
  1149. date = models.DateField('Режим работы на:', blank=False)
  1150. work_period_start = models.TimeField('Начала работы', blank=True, null=True,default=time(8, 00))
  1151. end_work_period = models.TimeField('Конец рабочего дня', blank=True, null=True,default=time(17, 00))
  1152. start_work = models.TimeField('Начала приёма', blank=True, null=True)
  1153. end_work = models.TimeField('Конец приёма', blank=True, null=True)
  1154. count_of_minute_on_one_see = models.PositiveIntegerField('Кол-во минут на осмотр', default=25)
  1155. weekend = models.BooleanField('Присутствие врача', default=True)
  1156. doctor = models.ForeignKey(Doctor, verbose_name='Врач', related_name='doctor_rec',on_delete=models.CASCADE, blank=True, null=False)
  1157.  
  1158. class Meta:
  1159. verbose_name = 'Рабочий день недели врача'
  1160. verbose_name_plural = "Рабочий день недели врача"
  1161. db_table = 'personal_workchedule'
  1162. ordering = ['date']
  1163.  
  1164. def __str__(self):
  1165. return str(self.doctor) + ' ' + str(self.date)
  1166.  
  1167. def create_list(doctor_id) -> list:
  1168. '''
  1169. Создание графика доктора в формате json
  1170. '''
  1171. graph = Personal_Workchedule.objects.filter(doctor__id = doctor_id, date__gte=datetime.today())
  1172. data = {}
  1173. for date in graph:
  1174. day, month, year = date.date.strftime('%d-%m-%Y').split('-')
  1175. if year in data:
  1176. if month in data[year]:
  1177. data[year][month].append(str(date.id) + ',' + year + '.' + month + '.' + day + ',' + str(date.weekend))
  1178. else:
  1179. data[year][month] = [str(date.id) + ',' + year + '.' + month + '.' + day+ ',' + str(date.weekend)]
  1180. else:
  1181. data[year] = {month: [str(date.id) + ',' + year + '.' + month + '.' + day+ ',' + str(date.weekend)]}
  1182.  
  1183. return json.dumps(data)
  1184.  
  1185. def create_personal_graph_again(count_of_days, doctor_id):
  1186. '''
  1187. Создание n кол-во дней режима работы для врача
  1188. '''
  1189. doctor = Doctor.objects.get(id = doctor_id)
  1190. graph = Personal_Workchedule.objects.filter(date__gte=datetime.today(), doctor = doctor)
  1191. if len(graph) < 20:
  1192. datelist = pd.date_range(graph.latest('date').date + timedelta(days=1) if graph.exists() else datetime.today(), periods=count_of_days).tolist()
  1193. for days in datelist:
  1194. create_graph = Personal_Workchedule.objects.create(
  1195. date = days,
  1196. doctor = doctor
  1197. )
  1198. return 'Дни в график были добавленны !'
  1199. else:
  1200. return 'Добавить раснисание на больше чем 20 дней нельзя!'
  1201.  
  1202. class ReceivingStaff(models.Model):
  1203. """График приёмов вызова"""
  1204.  
  1205. CHOICES_DAY_OF_WEEK = (
  1206. ('Понедельник', 'Понедельник'),
  1207. ('Вторник', 'Вторник'),
  1208. ('Среда', 'Среда'),
  1209. ('Четверг', 'Четверг'),
  1210. ('Пятница', 'Пятница'),
  1211. ('Суббота', 'Суббота'),
  1212. ('Воскресенье', 'Воскресенье'),
  1213. )
  1214. days = models.CharField(choices=CHOICES_DAY_OF_WEEK, max_length=50, blank=False, null=True)
  1215. start_work = models.TimeField('Начала работы', blank=True, null=True)
  1216. end_work = models.TimeField('Конец рабочего дня', blank=True, null=True)
  1217. staff = models.ForeignKey('Staff', verbose_name='Сотрудник', related_name='staff_rec',on_delete=models.CASCADE, blank=True, null=False)
  1218. room_number = models.CharField('Номер кабинета', max_length=16, null=True)
  1219.  
  1220. class Meta:
  1221. verbose_name = 'Прием вызовов (сотрудники)'
  1222. verbose_name_plural = "Прием вызова (сотрудники)"
  1223. db_table = 'receivingstaff'
  1224.  
  1225. class Staff(models.Model):
  1226. """Сотрудники"""
  1227. phone_regex = RegexValidator(regex=r'^\+?1?\d{9,15}$')
  1228. user = models.ForeignKey(User, on_delete=models.CASCADE)
  1229. polyclinic = models.ForeignKey('Polyclinic', null=True, blank=True,verbose_name="Учреждение", on_delete=models.CASCADE, default=None)
  1230. category = models.ForeignKey('Category',on_delete=models.SET_NULL, null=True, blank=True)
  1231.  
  1232. photo = models.ImageField(upload_to='staff/%Y/%m/%d', blank=True)
  1233.  
  1234. login = models.CharField('Логин', max_length=15, blank=False, db_index=True, null=True)
  1235. password = models.CharField('Пароль', blank=False,max_length=20, db_index=True, null=True)
  1236. short_number = models.PositiveIntegerField('Кородкий номер', null=True, blank=False)
  1237. surname = models.CharField('Фамилия', max_length=32, db_index=True)
  1238. name = models.CharField('Имя', max_length=32)
  1239. patronymic = models.CharField('Отчество', max_length=32)
  1240. date_of_birth = models.DateField('Дата рождения', blank=False)
  1241. specialty = models.CharField('Специальность', max_length = 150, blank=True)
  1242. address = models.CharField('Адресс проживания', max_length=255, blank=True, db_index=True)
  1243. phone = models.CharField('Контактный номер телефона', validators=[phone_regex], max_length=17, blank=True,db_index=True)
  1244. date_of_employment = models.DateField('Дата трудоустройства', blank=False)
  1245. date_of_dismissal = models.DateField('Дата увольнения', blank=False, null = True)
  1246. present = models.BooleanField('Присутствует', default = False)
  1247. onn_or_off_web_phone = models.BooleanField('Включить веб телефон', default=True)
  1248.  
  1249. @property
  1250. def fio(self):
  1251. return str(self.surname) + ' ' + str(self.name) + ' ' + str(self.patronymic)
  1252.  
  1253.  
  1254. class Meta:
  1255. verbose_name = 'Сотрудники'
  1256. verbose_name_plural = "Сотрудник"
  1257. db_table = 'staff'
  1258.  
  1259. def __str__(self):
  1260. return str(self.surname) + ' ' + str(self.name) + ' ' + str(self.patronymic) + ' : ' + str(self.polyclinic)
  1261.  
  1262.  
  1263. class List_SES(models.Model):
  1264. phone_regex = RegexValidator(regex=r'^\+?1?\d{9,15}$')
  1265.  
  1266. epid_number = models.CharField('Эпид номер', max_length=255,blank=True, db_index=True)
  1267. attachment_to_the_medical_device = models.ForeignKey(Polyclinic, null=True, blank=True,related_name='attachment_to_the_medical_device',verbose_name="Прикрепление к лпу", on_delete=models.CASCADE, default=None)
  1268. date_of_receipt = models.DateTimeField('Дата приема', null=True, blank=True)
  1269. time_of_receipt = models.TimeField('Часы приема', blank=True, null=True)
  1270. surname = models.CharField('Фамилия', max_length=32,blank=True, null=True, db_index=True)
  1271. name = models.CharField('Имя', max_length=32, null=True,blank=True)
  1272. patronymic = models.CharField('Отчество', null=True, max_length=32,blank=True)
  1273. date_of_birth = models.DateField('Дата рождения', null=True, blank=True)
  1274. street = models.CharField('Улица',null=True,blank=True, max_length=255, db_index=True)
  1275. house = models.CharField('Дом', max_length=255, null=True, db_index=True,blank=True)
  1276. apartment = models.CharField('Квартира', max_length=255, null=False, db_index=True, default='')
  1277. phone_number = models.CharField('Контактный номер телефона', null=True, max_length=17, blank=True,db_index=True) # validators=[phone_regex],
  1278. place_of_work_or_study = models.CharField('Место работы/учебы', null=True, max_length = 150, blank=True)
  1279. date_of_last_visit_to_the_place_of_work = models.DateField('Дата последнего посещения места работы', null=True, blank=True)
  1280. date_of_illness = models.DateField('Дата заболевания', null=True,blank=True)
  1281. diagnosis = models.CharField('Диагноз', null=True, max_length = 150, blank=True)
  1282. severity = models.CharField('Степень тяжести', null=True, max_length = 150, blank=True)
  1283. date_of_establishment = models.DateField('Дата установления', null=True,blank=True)
  1284. place_of_hospitalization = models.ForeignKey(Polyclinic, null=True, blank=True,verbose_name="Место госпитализации",related_name='place_of_hospitalization', on_delete=models.CASCADE, default=None)
  1285. date_of_hospitalization = models.DateField('Дата госпитализации', null=True, blank=True)
  1286. date_of_initial_appeal = models.DateField('Дата первичного обращения', null=True, blank=True)
  1287. laboratory_research = models.CharField('Лабораторное исследование', null=True, max_length = 150, blank=True)
  1288. research_result = models.CharField('Результат исследование', null=True, max_length = 150, blank=True)
  1289. date_study = models.DateField('Дата исследование', null=True,blank=True)
  1290. discharge_date = models.DateField('Дата выписки', null=True,blank=True)
  1291. note = models.CharField('Примечание', null=True, max_length = 255, blank=True)
  1292. recording_time = models.DateTimeField('Время записи', blank=True, null=True)
  1293. operator = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name='Оператор', null=True, blank=True)
  1294.  
  1295. def __str__(self):
  1296. return str(self.surname) + ' ' + str(self.name) + ' ' + str(self.patronymic)
  1297.  
  1298. class Meta:
  1299. db_table = 'list_ses'
  1300.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement