Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # -*- coding=utf-8 -*-
- from django.db import models
- from django.core.validators import RegexValidator
- from django.contrib.auth.models import User
- from django.conf import settings
- from django.db.models.signals import post_save
- from datetime import timedelta, datetime, time
- from django.urls import reverse
- from .date import *
- from django.db.models.signals import post_save
- from django.dispatch import receiver
- from django.core.exceptions import ValidationError
- from django.forms.models import model_to_dict
- import pandas as pd
- import json
- class RegionOfDepartment(models.Model):
- region_name = models.CharField('Название региона', max_length=255, blank=False, db_index=True)
- def __str__(self):
- return str(self.region_name)
- class Meta:
- verbose_name = 'Регион проживания'
- verbose_name_plural = 'Регионы проживания'
- db_table = 'region_of_department'
- class HumanResourcesDepartment(models.Model):
- fio = models.CharField('Ф.И.О', max_length=255, blank=False, db_index=True)
- region_of_residence = models.ForeignKey(RegionOfDepartment, verbose_name='Регион проживания', on_delete=models.CASCADE, blank=False, db_index=True)
- phone_regex = RegexValidator(regex=r'^\+?1?\d{9,15}$')
- phone = models.CharField('Контактный номер телефона', validators=[phone_regex], max_length=17, blank=False,db_index=True)
- education = models.CharField('Образование', max_length=450, blank=False)
- specialty = models.CharField('Cпециальность', max_length=450, blank=False)
- practical_experience = models.CharField('Практический опыт', max_length=450, blank=False)
- desired_place_of_work = models.CharField('Желаемое место работы', max_length=450)
- desired_salary = models.CharField('Желаемая заработная плата', max_length=450)
- note = models.TextField('Примечание')
- recording_time = models.DateTimeField('Время записи', blank=False, null=True)
- operator = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name='Оператор', null=True, blank=False)
- def __str__(self):
- return str(self.fio)
- class Meta:
- verbose_name = 'Отдел кадров'
- verbose_name_plural = 'Отдел кадров'
- db_table = 'human_resources_department'
- ordering = ['recording_time']
- class Complaints(models.Model):
- fio = models.CharField('Ф.И.О', max_length=255, blank=False, db_index=True)
- phone_regex = RegexValidator(regex=r'^\+?1?\d{9,15}$')
- phone = models.CharField('Контактный номер телефона', validators=[phone_regex], max_length=17, blank=True,db_index=True)
- text = models.TextField('Сообщение', max_length=1000, blank=False)
- institution = models.CharField('Учреждение', max_length=500, null=True, blank=False)
- operator = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name='Оператор', null=True, blank=True)
- recording_time = models.DateTimeField('Время записи', blank=False, null=True)
- polyclinic = models.ForeignKey('Polyclinic', null=True, blank=True,verbose_name="Учреждение", on_delete=models.CASCADE, default=None)
- сomplaint_forwarded = models.BooleanField("Жалоба передана", default=False)
- def __str__(self):
- return 'Жалоба от: ' + str(self.fio)
- class Meta:
- verbose_name = 'Жалобы'
- verbose_name_plural = 'Жалобы'
- db_table = 'complaints'
- ordering = ['recording_time']
- class Notice(models.Model):
- topic = models.CharField('Тема', max_length=150, blank=False)
- text = models.CharField('Сообщение', max_length=1000, blank=False)
- polyclinic = models.ForeignKey('Polyclinic', null=True, blank=True,verbose_name="Мед. учреждение", on_delete=models.CASCADE, default=None)
- operator = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name='Оператор', null=True, blank=True)
- recording_time = models.DateTimeField('Время записи', blank=False, null=True)
- active = models.BooleanField('Снята с доски', blank=False, default=False)
- def __str__(self):
- return 'Заметка : ' + str(self.polyclinic)
- class Meta:
- verbose_name = 'Заметки'
- verbose_name_plural = 'Заметка'
- db_table = 'notice'
- ordering = ['recording_time']
- class DiseaseCode(models.Model):
- code = models.FloatField('Код Заболевания',blank=False)
- name_disease = models.CharField('Название заболевания', max_length=150, blank=False)
- def __str__(self):
- return str(self.code) +')' + ' ' + str(self.name_disease)
- class Meta:
- verbose_name = 'Коды заболеваний'
- verbose_name_plural = 'Код заболевания'
- db_table = 'disease_code'
- ordering = ['code']
- class Town(models.Model):
- """Модель города"""
- name = models.CharField('Название Города', blank=False, max_length=25)
- time_shifting = models.IntegerField('Временной сдвиг', blank=False)
- def __str__(self):
- return self.name
- class Meta:
- verbose_name = 'Город'
- verbose_name_plural = 'Города'
- db_table = 'town'
- class WorkInfo(models.Model):
- """Дополнительная информация для поликлиники"""
- text = models.TextField("Уведомление", null=True, blank=False)
- polyclinic = models.ForeignKey('Polyclinic', null=True, blank=True,verbose_name="Мед. учреждение", on_delete=models.CASCADE, default=None)
- archive = models.BooleanField('Архивировать уведомление', blank=True, default=False)
- recording_time = models.DateTimeField('Время записи', blank=False, null=True)
- class Meta:
- verbose_name = 'Уведомления поликлиник'
- verbose_name_plural = "Уведомление поликлиники"
- db_table = 'workinfo'
- ordering = ['-recording_time']
- def save(self, *args, **kwargs):
- if self.polyclinic.town:
- self.recording_time = get_time_to_city(self.polyclinic.town.time_shifting)
- super(WorkInfo, self).save(*args, **kwargs)
- def __str__(self):
- return 'Уведомление: ' + str(self.polyclinic.name)
- def get_absolute_url(self):
- return reverse('detail_views', args=[self.polyclinic.id])
- class Week(models.Model):
- """Дни недели"""
- day_of_week = models.CharField(
- 'День недели', max_length=13, null=True, blank=False)
- class Meta:
- verbose_name = 'Дни недели'
- verbose_name_plural = "День недели"
- db_table = 'week'
- def __str__(self):
- if self.day_of_week == None:
- return ''
- else:
- return str(self.day_of_week)
- class ReceivingCalls(models.Model):
- """График приёмов вызова"""
- days_of_the_week = models.ForeignKey(Week, verbose_name='График Приёмов вызова', on_delete=models.CASCADE, null=True)
- polyclinic = models.ForeignKey('Polyclinic', null=True, blank=True, verbose_name="Мед. учреждение", on_delete=models.CASCADE, default=None)
- start_work = models.TimeField('Начала работы', blank=True, null=True)
- end_work = models.TimeField('Конец рабочего дня', blank=True, null=True)
- class Meta:
- verbose_name = 'Прием вызовов'
- verbose_name_plural = "Прием вызова"
- db_table = 'receivingcalls'
- def __str__(self):
- if self.days_of_the_week == None:
- return ''
- else:
- return str(self.days_of_the_week) + ' - ' + str(self.polyclinic.name)
- class WorkSchedule(models.Model):
- """Режим работы"""
- days_of_the_week = models.ForeignKey(
- Week, verbose_name='График работ', on_delete=models.CASCADE, null=True)
- polyclinic = models.ForeignKey('Polyclinic', null=True, blank=False,
- verbose_name="Мед. учреждение", on_delete=models.CASCADE, default=None)
- start_work = models.TimeField('Начала работы', blank=True, null=True)
- end_work = models.TimeField('Конец рабочего дня', blank=True, null=True)
- class Meta:
- verbose_name = 'График работ'
- verbose_name_plural = "График работ"
- db_table = 'workschedule'
- def __str__(self):
- if self.days_of_the_week == None:
- return ''
- else:
- return str(self.days_of_the_week) + ' - ' + str(self.polyclinic.name)
- class ServedGroups(models.Model):
- type_groups = models.CharField('Тип группы', max_length=255, blank=False, db_index=True, null=True)
- def __str__(self):
- return str(self.type_groups)
- class Meta:
- verbose_name = 'Обслуживаемые группы'
- verbose_name_plural = "Обслуживаемые группы"
- db_table = 'servedgroups'
- ordering = ['id']
- class DoctorManager(models.Manager):
- def get_by_natural_key(self, polyclinic):
- return self.get(polyclinic=polyclinic)
- class Category(models.Model):
- name = models.CharField('Категория', max_length = 150, blank=True)
- polyclinic = models.ForeignKey('Polyclinic', on_delete=models.SET_NULL, null=True)
- def __str__(self):
- return str(self.name)
- class Meta:
- verbose_name = 'Категория'
- verbose_name_plural = "Категории"
- class Specialization(models.Model):
- name = models.CharField('Название специализации', max_length=128, blank=False)
- def __str__(self):
- return str(self.name)
- class Meta:
- verbose_name = 'Cпециализации'
- verbose_name_plural = 'Cпециализации'
- db_table = 'Specialization'
- class Doctor(models.Model):
- TYPE_CALL = [
- ('Общие практики (Терапевт/Педеатор)','Общие практики (Терапевт/Педеатор)'),
- ('COVID', 'COVID'),
- ('Хроники', 'Хроники'),
- ]
- user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, verbose_name='Пользователь',default=None)
- fio = models.CharField('Ф.И.О', max_length=255, blank=False, db_index=True, null=True)
- polyclinic = models.ForeignKey('Polyclinic', on_delete=models.SET_NULL, blank=True, null=True)
- zone = models.ManyToManyField('Zone', blank=False)
- position = models.CharField('Должность', max_length = 150, blank=True)
- specialty = models.ForeignKey('Specialization',on_delete=models.SET_NULL, null=True, blank=True)
- town = models.ForeignKey(Town, verbose_name="Город",null=True, blank=False, on_delete=models.SET_NULL)
- phone_regex = RegexValidator(regex=r'^\+?1?\d{9,15}$')
- category = models.ForeignKey('Category',on_delete=models.SET_NULL, null=True, blank=True)
- phone = models.CharField('Контактный номер телефона', validators=[phone_regex], max_length=17, blank=True,db_index=True)
- type_call = models.ManyToManyField(ServedGroups, blank=True)
- read_only_license = models.BooleanField('Только для чтения', default=False, null=True)
- login = models.CharField('Логин', max_length=15, blank=False, db_index=True, null=True)
- password = models.CharField('Пароль', max_length=20, blank=False, db_index=True, null=True)
- objects = DoctorManager()
- onn_or_off_web_phone = models.BooleanField('Включить веб телефон', default=True)
- class Meta:
- unique_together = ['polyclinic']
- def natural_key(self):
- return (self.polyclinic)
- def clear_the_doctor_zone(self, id, id_zone):
- del_zone = Doctor.objects.get(id = id)
- del_zone.zone.remove(id_zone)
- def save(self,chenge_zone = False, zone_id = None, *args, **kwargs):
- if chenge_zone:
- self.zone.clear()
- if zone_id:
- zones = [int(x) for x in zone_id]
- else:
- zones = [int(x.id) for x in self.zone.all()]
- for zone in zones:
- self.zone.add(Zone.objects.get(id = zone))
- super(Doctor, self).save(*args, **kwargs)
- def __str__(self):
- return str(self.fio)
- class Meta:
- verbose_name = 'Доктор'
- verbose_name_plural = "Доктора"
- db_table = "doctors"
- class Zone(models.Model):
- """Участок"""
- number = models.CharField('Название участка',max_length=100, blank=False, null=True)
- polyclinic = models.ForeignKey('Polyclinic', on_delete=models.SET_NULL, blank=True, null=True)
- subdivision = models.ForeignKey('Subdivision_Polyclinic', on_delete=models.SET_NULL, blank=True, null=True)
- def __str__(self):
- return str(self.id) + ':'+str(self.name_zone) + ' Мед. Учреждение: ' + str(self.polyclinic)
- def __str__(self):
- if self.number == None:
- return ' '
- else:
- return str(self.number)
- class Meta:
- verbose_name = 'Номер участков'
- verbose_name_plural = "Номер участка"
- db_table = "zone_location"
- class Location(models.Model):
- """Адреса мед. учреждений"""
- polyclinic = models.ForeignKey('Polyclinic', on_delete=models.SET_NULL, blank=True, null=True)
- subdivision_polyclinics = models.ForeignKey('Subdivision_Polyclinic', on_delete=models.SET_NULL, blank=True, null=True)
- zone = models.ForeignKey(Zone, on_delete=models.SET_NULL, blank=True, null=True)
- # doctor = models.ForeignKey(Doctor, on_delete=models.SET_NULL, blank=True, null=True)
- building = models.CharField('Дом №', max_length=100, blank=True, null=True, default='')
- street = models.CharField(max_length=100, null=True, blank=True, verbose_name='Улица',)
- chek_building = models.BooleanField('Указаны ли дома:', null=True, default=True)
- document_address = models.FileField("Список адресов:", upload_to='uploads/document/', blank=True, null=True)
- def __str__(self):
- if self.street == None:
- return ' '
- else:
- return str(self.street) + ' , ' + str(self.building) + str(', ' + self.polyclinic.town.name) if self.polyclinic else ''
- class Meta:
- verbose_name = 'Дислокация участков'
- verbose_name_plural = "Дислокация участка"
- db_table = "location"
- class Subdivision_Polyclinic(models.Model):
- """Подразделение"""
- CHOICES_OPTION = (
- ('Взрослая поликлиника', 'Взрослая поликлиника'),
- ('Детская поликлиника', 'Детская поликлиника'),
- )
- name_sub = models.CharField(
- 'Название подразделения', max_length=100, blank=False, null=True, default='')
- email_sub = models.EmailField(
- 'Электронный адресс почты', null=True, blank=True)
- contact_sub = models.TextField(
- 'Контактные данные мед. подразделения', max_length=1000, null=True, blank=True)
- polyclinic = models.ForeignKey('Polyclinic', null=True, blank=True,verbose_name="Мед. Учреждение", on_delete=models.CASCADE, default=None)
- branch = models.CharField(
- 'Отделение', choices=CHOICES_OPTION, max_length=20, null=True, blank=True)
- redirect = models.CharField(
- 'Редирект на МИС', max_length=130, blank=True, unique=False)
- def to_json(self):
- return model_to_dict(self)
- def __str__(self):
- if self.name_sub==None:
- return "ERROR-CUSTOMER NAME IS NULL"
- return self.name_sub
- class Meta:
- verbose_name = 'Мед. подразделение'
- verbose_name_plural = "Мед. подразделения"
- db_table = "subdivision_polyclinics"
- def get_absolute_url(self):
- return reverse('detail_views', args=[self.polyclinic.id])
- class Polyclinic(models.Model):
- """Поликлиника"""
- name = models.CharField('Название леч. учреждения',max_length=100, blank=False, null=True)
- email = models.EmailField('Элект,адресс почты', null=True, blank=True)
- contact = models.TextField('Контактные данные мед. учреждения', max_length=1000, null=True, default='', blank=True)
- town = models.ForeignKey(Town, verbose_name="Город",null=True, blank=False, on_delete=models.SET_NULL)
- redirect = models.CharField('Редирект на МИС', max_length=130, blank=True, unique=False)
- chek_redirect = models.BooleanField(
- 'Проверка редиректа', null=True, blank=True, default=False)
- direct_recording = models.BooleanField('Запись на прямую' , default=False)
- lat = models.FloatField('Широта', blank=True, null=True)
- lon = models.FloatField('Долгота', blank=True, null=True)
- def to_json(self):
- return model_to_dict(self)
- def get_type_redirect(self):
- if self.chek_redirect:
- return 'Редирект на мис'
- else:
- return 'Редирект на нашу бд'
- def get_absolute_url(self):
- return reverse('detail_views', args=[self.id])
- def __str__(self):
- return self.name
- class Meta:
- verbose_name = 'Мед. учреждение'
- verbose_name_plural = "Мед. учреждения"
- db_table = "polyclinic"
- class Renouncement(models.Model):
- reason_for_renouncement = models.TextField('Причина отказа')
- operator = models.ForeignKey(User, on_delete=models.SET_NULL, verbose_name='Оператор', null=True, blank=True)
- recording_time = models.DateTimeField('Время записи', blank=False, null=True)
- class Meta:
- verbose_name = 'Отмена вызова'
- verbose_name_plural = "Отмена вызова"
- db_table = "renouncement"
- def __str__(self):
- return str(self.operator) + ' : ' + str(self.reason_for_renouncement) + '...'
- class Patient_registration(models.Model):
- """Заявка пациента"""
- CHOICES_OPTION = (
- ('Есть', 'Есть'),
- ('Нет', 'Нет'),
- )
- TYPE_CALL = [
- ('Терапевт','Терапевт'),
- ('COVID', 'COVID'),
- ('Хроники', 'Хроники'),
- ('АИЦ', 'АИЦ'),
- ]
- name = models.CharField('Имя', max_length=255, blank=False, db_index=True)
- surname = models.CharField('Фамилия', max_length=255, blank=False,null=True, db_index=True)
- patronymic = models.CharField('Отчество', max_length=255, blank=False,null=True, db_index=True)
- date_of_birth = models.DateField('Дата рождения пациента', blank=False)
- address = models.CharField('Адресс проживания', max_length=255, blank=True, db_index=True)
- entrance = models.PositiveIntegerField('Подъезд №', blank=False)
- intercom_code = models.PositiveIntegerField('Код домофона', blank=False)
- flat = models.CharField('Квартира №', blank=False,null=True, max_length=10)
- floor = models.PositiveIntegerField('Этаж дома ', blank=False)
- phone_regex = RegexValidator(regex=r'^\+?1?\d{9,15}$')
- phone = models.CharField('Контактный номер телефона', validators=[phone_regex], max_length=17, blank=True,db_index=True)
- SNILS_regex = RegexValidator(regex=r'^\d{3}-\d{3}-\d{3}-\d{2}$')
- SNILS = models.CharField('СНИЛС', validators=[SNILS_regex], error_messages={'invalid': 'Не верный формат '}, max_length=15, blank=True)
- c_m_i_regex = RegexValidator(regex=r'^(\d){1,16}$')
- C_M_O_policy = models.CharField('Полис ОМС', validators=[c_m_i_regex], error_messages={'invalid': 'Должно быть 16 цифр !'}, max_length=16, blank=True)
- reason_for_calling = models.TextField('Причина вызова, (в том числе Актив)')
- polyclinic = models.ForeignKey(Polyclinic, on_delete=models.SET_NULL, blank=True, null=True)
- recording_time = models.DateTimeField('Время записи', blank=False, null=True)
- сall_transferred = models.BooleanField("Вызов передан", default=False)
- temperature = models.FloatField('Температура', null=True, blank=True)
- cough = models.CharField('Кашель', max_length=15, choices=CHOICES_OPTION, null=True, blank=True)
- smell = models.CharField('Обоняние', max_length=15,choices=CHOICES_OPTION, null=True, blank=True)
- operator = models.ForeignKey(User, on_delete=models.SET_NULL, verbose_name='Оператор', null=True, blank=True)
- address_fk = models.ForeignKey(Location, verbose_name="Адрес",on_delete=models.SET_NULL, blank=True, null=True, db_index=True)
- disease_codes = models.ManyToManyField(DiseaseCode,default=True,verbose_name='Коды заболеваний',blank=True)
- close_call = models.BooleanField("Вызов завершён", default=False)
- time_close_call = models.DateTimeField('Время завершёного вызова ', blank=True, null=True)
- @property
- def fio(self):
- return str(self.surname) + ' ' + str(self.name) + ' ' + str(self.patronymic)
- type_call = models.ForeignKey(
- ServedGroups,
- verbose_name='Тип вызова',
- on_delete=models.SET_NULL,
- null=True,
- blank=True
- )
- call_cancellation = models.ForeignKey(
- Renouncement,
- on_delete=models.SET_NULL,
- verbose_name='Отмена вызова',
- null=True,
- blank=True
- )
- doctor = models.ForeignKey(
- Doctor,
- on_delete=models.SET_NULL,
- blank=True,
- null=True
- )
- call_cancellation_state = models.BooleanField("Отмена заявки", default=False)
- class Meta:
- verbose_name = 'Регистрация нового пациента'
- verbose_name_plural = "Регистрация новых пациентов"
- db_table = "patient_registration"
- class WaitingList(models.Model):
- fio = models.CharField('Ф.И.О',unique_for_date='recording_time', max_length=255, blank=False, db_index=True)
- date_of_birth = models.DateField('Дата рождения пациента', blank=False)
- address = models.CharField('Адресс проживания', max_length=255, blank=True, db_index=True)
- phone_regex = RegexValidator(regex=r'^\+?1?\d{9,15}$')
- phone = models.CharField('Контактный номер телефона', validators=[phone_regex], max_length=17, blank=True,db_index=True)
- SNILS_regex = RegexValidator(regex=r'^\d{3}-\d{3}-\d{3}-\d{2}$')
- SNILS = models.CharField('СНИЛС', validators=[SNILS_regex], error_messages={'invalid': 'Не верный формат '}, max_length=15, blank=True)
- c_m_i_regex = RegexValidator(regex=r'^(\d){1,16}$')
- C_M_O_policy = models.CharField('Полис ОМС', validators=[c_m_i_regex], error_messages={'invalid': 'Должно быть 16 цифр !'}, max_length=16, blank=True)
- reason_for_calling = models.TextField('Необхоимый приём')
- polyclinic = models.ForeignKey(Polyclinic, on_delete=models.SET_NULL, blank=True, null=True)
- recording_time = models.DateTimeField('Время записи', blank=False, null=True)
- сall_transferred = models.BooleanField("Вызов передан", default=False)
- operator = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name='Оператор', null=True, blank=True)
- final_state = models.TextField('Итоговое состояние', null=True)
- address_fk = models.ForeignKey(Location, verbose_name="Адрес",on_delete=models.SET_NULL, blank=True, null=True, db_index=True)
- direction_number = models.CharField('Номер направления ', max_length=255, blank=True, db_index=True)
- class Meta:
- verbose_name = 'Список ожидания'
- verbose_name_plural = "Список ожиданий"
- db_table = "waiting_list"
- def __str__(self):
- return str(self.fio)
- class Activity(models.Model):
- """Логирование действий"""
- CHOICES_OPTION = (
- ('Создание объекта', 'Создание объекта'),
- ('Обновление объекта', 'Обновление объекта'),
- ('Удаление объекта', 'Удаление объекта'),
- ('Запись в МИС', 'Запись в МИС'),
- ('Отправка email','Отправка email'),
- ('Отмена заявки на привязку к поликлинике','Отмена заявки на привязку к поликлинике'),
- )
- user = models.ForeignKey(User, on_delete=models.CASCADE)
- actions = models.CharField(choices=CHOICES_OPTION, max_length=50, blank=False, null=True)
- recording_time = models.DateTimeField('Время записи', blank=False, null=True)
- obj = models.CharField('Объект с котором произошло действие',max_length=150, blank=False, null=True)
- def __str__(self):
- return str(self.user) + ' : ' + str(self.actions) + ' : ' + str(self.obj)
- class Meta:
- verbose_name = 'Действия на сайте'
- verbose_name_plural = "Действие на сайте"
- db_table = "activity"
- class Account(models.Model):
- user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, verbose_name='Пользователь')
- read_only = models.BooleanField('Только для чтения', default=False, null=True)
- polyclinic = models.ManyToManyField(Polyclinic, blank=True, verbose_name='Мед. Учреждение')
- autoupdate = models.BooleanField('Авто обновление страницы', default=True)
- # login_allowed = models.BooleanField('Только для чтения', default=False, null=True)
- def __str__(self):
- return str(self.user)
- class Meta:
- verbose_name = 'Аккаунты'
- verbose_name_plural = "Аккаунт"
- db_table = "account"
- @receiver(post_save, sender=User)
- def save_or_create_account(sender, instance, created, **kwargs):
- if created:
- Account.objects.create(user=instance)
- else:
- try:
- instance.account.save()
- except ObjectDoesNotExist:
- Account.objects.create(user=instance)
- class HospitalWard(models.Model):
- """Больничная палата"""
- class HospitalWardStatus(models.TextChoices):
- """ Возможные типы палат """
- COVID = "COVID", "COVID"
- OTHER = "OTHER", "Прочее"
- number = models.IntegerField('Номер')
- description = models.CharField('Описание', max_length=255)
- type = models.CharField('Назначение', choices=HospitalWardStatus.choices, max_length=255)
- hospital = models.ForeignKey(Polyclinic, verbose_name='Больница', on_delete=models.CASCADE)
- @property
- def total_bed_count(self):
- """ Общее количество коек в палате """
- return HospitalBed.objects.filter(ward=self).count()
- @property
- def vacant_bed_count(self):
- """ Количество свободных коек в палате """
- return HospitalBed.objects.filter(ward=self, status=HospitalBed.HospitalBedStatus.VACANT).count()
- def to_json(self):
- return model_to_dict(self)
- def __str__(self):
- return str(self.number)
- class Meta:
- verbose_name = 'Палата'
- verbose_name_plural = 'Палаты'
- db_table = 'hospital_wards'
- class Gender(models.Model):
- gender = models.CharField('Пол', blank=False, max_length=25)
- def __str__(self):
- return str(self.gender)
- class Meta:
- verbose_name = 'Пол'
- verbose_name_plural = 'Пол'
- db_table = 'gender'
- class Blod_Type(models.Model):
- name_type = models.CharField('Тип крови', max_length=25, null=False)
- def __str__(self):
- return str(self.name_type)
- class Meta:
- verbose_name = 'Тип крови'
- verbose_name_plural = 'Тип крови'
- db_table = 'blod_type'
- class Region(models.Model):
- name = models.CharField('Название Региона/Области',null=True,blank=True, max_length=150)
- num_code = models.CharField('Код телефона', null=True,blank=True, max_length=3)
- name_ENG = models.CharField('Название на английском', null=True, blank=True, max_length=180)
- def return_city_code(name_ENG):
- num_code = Region.objects.get(name_ENG = name_ENG).num_code
- return settings.EMERGENCY_PHONES.get(num_code, None)
- def __str__(self):
- return self.name
- class Meta:
- db_table = 'region'
- verbose_name = 'Регион'
- verbose_name_plural = 'Регионы'
- ordering = ['name']
- class Entity(models.Model):
- name_organization = models.CharField('Название организации',null=True,blank=True, max_length=150)
- inn = models.CharField('ИНН',null=True,blank=True, max_length=12)
- class Meta:
- db_table = 'entity'
- verbose_name = 'Юридическое лицо'
- verbose_name_plural = 'Юридическое лицо'
- class Patient_Address(models.Model):
- region = models.ForeignKey(Region, verbose_name="Регион",null=True, blank=True, on_delete=models.SET_NULL)
- town = models.ForeignKey(Town, verbose_name="Город",null=True, blank=True, on_delete=models.SET_NULL)
- district = models.CharField('Район',null=True,blank=True, max_length=150)
- postal_code = models.CharField('Индекс почтовый', blank=True,null=True,max_length=6)
- building = models.CharField('Дом №', max_length=100, blank=True, null=True, default='')
- street = models.CharField(max_length=100, null=True, blank=True, verbose_name='Улица',)
- flat = models.CharField('Квартира №', blank=True,null=True, max_length=10)
- def __str__(self):
- str_addr = ''
- if self.town:
- str_addr += str(self.town) + ' '
- if self.street:
- str_addr += str(self.street) + ' '
- if self.building:
- str_addr += str(self.building) + ', '
- if self.flat:
- str_addr += '№' + str(self.flat) + ' '
- if self.region:
- str_addr += str(self.region) + ' '
- return str_addr
- class Meta:
- db_table = 'patient_address'
- verbose_name= 'Адресс пациента'
- verbose_name_plural= 'Адреса пациентов'
- class Patient(models.Model):
- """Пациент"""
- phone_regex = RegexValidator(regex=r'^\+7\d{11}$')
- user = models.OneToOneField(User, related_name='profile',null=True,on_delete=models.CASCADE)
- email = models.EmailField('E-mail',unique=True,null=True)
- surname = models.CharField('Фамилия', max_length=32, db_index=True)
- name = models.CharField('Имя', max_length=32)
- patronymic = models.CharField('Отчество', max_length=32)
- birth_date = models.DateField('Дата рождения',null=True)
- OMS = models.CharField('Номер полиса ОМС',unique=True,null=True, max_length=16)
- DMS = models.CharField('Номер полиса ДМС',unique=True,null=True, max_length=16)
- phone_number = models.CharField('Номер телефона',blank=True,unique=True,null=True, max_length=12)
- foto = models.FileField('Фото профиля', blank=True)
- relatives_phone_number = models.CharField('Номер телефона родственника', validators=[phone_regex], max_length=12, blank=True)
- relatives_phone_number_two = models.CharField('Номер телефона родственника', validators=[phone_regex], max_length=12, blank=True)
- # address = models.CharField('Адрес проживания', max_length=128)
- registration_address = models.CharField('Адрес регистрации', max_length=128)
- state = models.TextField('Состояние')
- order_bracelet = models.BooleanField('Заказан ли браслет?', default = False)
- """Personal data"""
- gender = models.ForeignKey(Gender,verbose_name='Пол', null=True, on_delete=models.CASCADE)
- type_blood = models.ForeignKey(Blod_Type, verbose_name='Тип крови', null=True,on_delete=models.CASCADE)
- weight = models.FloatField('Вес', null=True)
- growth = models.FloatField('Рост', null=True)
- """Patient addres"""
- place_of_residence = models.ForeignKey(Patient_Address, null=True,verbose_name='Адрес прописки', related_name='place_of_residence',on_delete=models.SET_NULL)
- residence_address = models.ForeignKey(Patient_Address, null=True,verbose_name='Адрес проживания',related_name='residence_address',on_delete=models.SET_NULL)
- information_about_work = models.ForeignKey(Patient_Address, null=True,verbose_name='Адрес проживания',related_name='information_about_work',on_delete=models.SET_NULL)
- """Citizenship"""
- сitizenship = models.CharField('Гражданство', max_length=150,blank=True, null=True)
- nationality = models.CharField('Национальность', max_length=100,blank=True, null=True)
- passport_serial_number = models.CharField('Серийный номер паспорта',blank=True, max_length=10, null=True)
- issued_by = models.CharField('выдан', max_length=355,blank=True, null=True)
- valid_until = models.DateField('Действует до',blank=True, null=True)
- identification_number = models.CharField('Идентификационный номер',blank=True, max_length=150, null=True)
- """Critical value"""
- bp_high_min = models.IntegerField('Минимальное верхнее давление', null=True, blank=True, default=100)
- bp_high_max = models.IntegerField('Максимальное верхнее давление', null=True, blank=True, default=180)
- bp_low_min = models.IntegerField('Минимальное нижнее давление', null=True, blank=True, default=55)
- bp_low_max = models.IntegerField('Максимальное нижнее давление', null=True, blank=True, default=130)
- pulse_min = models.IntegerField('Минимальный пульс', null=True, blank=True, default=40)
- pulse_max = models.IntegerField('Максимальный пульс', null=True, blank=True, default=180)
- temperature_min = models.IntegerField('Минимальная температура', null=True, blank=True, default=34)
- temperature_max = models.IntegerField('Максимальная температура', null=True, blank=True, default=42)
- bo_min = models.IntegerField('Минимальное значение кислорода', null=True, blank=True, default=95)
- # bo_max = models.IntegerField('Максимальное значение кислорода', null=True, blank=True, default=100)
- distance_min = models.IntegerField('Минимальное кол-во шагов', null=True, blank=True, default=2700)
- distance_min = models.IntegerField('Минимальное кол-во шагов', null=True, blank=True, default=20000)
- distance_trand_min = models.IntegerField('Минимальное кол-во шагов', null=True, blank=True, default=2000)
- distance_trand_min = models.IntegerField('Минимальное кол-во шагов', null=True, blank=True, default=40000)
- calories_min = models.IntegerField('Минимальное кол-во калорий', null=True, blank=True, default=1000)
- calories_max = models.IntegerField('Максимальное кол-во калорий', null=True, blank=True, default=5000)
- calories_trand_min = models.IntegerField('Нижняя граница кол-ва калорий', null=True, blank=True, default=500)
- calories_trand_max = models.IntegerField('Верхняя граница кол-ва калорий', null=True, blank=True, default=5000)
- tonometer_hp_min = models.IntegerField('Минимальное Систолическое давление', null=True, blank=True, default=100)
- tonometer_hp_max = models.IntegerField('Максимальное Систолическое давление', null=True, blank=True, default=180)
- tonometer_hp_trand_min = models.IntegerField('Нижняя граница Систолическое давления', null=True, blank=True, default=110)
- tonometer_hp_trand_max = models.IntegerField('Верхняя граница Систолическое давления', null=True, blank=True, default=130)
- tonometer_lp_min = models.IntegerField('Минимальное Диастолическое давление', null=True, blank=True, default=55)
- tonometer_lp_max = models.IntegerField('Максимальное Диастолическое давление', null=True, blank=True, default=130)
- tonometer_lp_trand_min = models.IntegerField('Нижняя граница Диастолическое давления', null=True, blank=True, default=70)
- tonometer_lp_trand_max = models.IntegerField('Верхняя граница Диастолическое давления', null=True, blank=True, default=100)
- temperature_trand_min = models.IntegerField('Нижняя граница тенденции температуры', null=True, blank=True)
- temperature_trand_max = models.IntegerField('Нижняя граница тенденции температуры', null=True, blank=True)
- bp_difference_max = models.IntegerField('Максимальная разница давлений', null=True, blank=True)
- bp_difference_min = models.IntegerField('Минимальная разница давлений', null=True, blank=True)
- bp_trand_high_min = models.IntegerField('Нижняя граница тенденции верхнего давления', null=True, blank=True)
- bp_trand_high_max = models.IntegerField('Верхняя граница тенденции верхнего давления', null=True, blank=True)
- bp_trand_low_min = models.IntegerField('Нижняя граница тенденции нижнего давления', null=True, blank=True)
- bp_trand_low_max = models.IntegerField('Верхняя граница тенденции нижнего давления', null=True, blank=True)
- bp_trand_difference_max = models.IntegerField('Верхняя граница тенденции разницы давлений', null=True, blank=True)
- bp_trand_difference_min = models.IntegerField('Нижняя граница тенденции разницы давлений', null=True, blank=True)
- pulse_trand_min = models.IntegerField('Нижняя граница тенденции пульса', null=True, blank=True, default=70)
- pulse_trand_max = models.IntegerField('Верхняя граница тенденции пульса', null=True, blank=True, default=90)
- bp_scenario_id = models.IntegerField('Сценарий давления', null=True, blank=True)
- mean_slide_number = models.IntegerField('Скользящая средняя', default=5)
- bo_trand_min = models.IntegerField('Нижняя граница тенденции содержания кислорода', null=True, blank=True, default=90)
- bo_trand_max = models.IntegerField('Верхняя граница тенденции содержания кислорода', null=True, blank=True, default=95)
- bg_min = models.IntegerField('Минимальное значение сахара в крови', null=True, blank=True, default=10)
- bg_max = models.IntegerField('Максимальное значение сахара в крови', null=True, blank=True, default=300)
- bg_trand_min = models.IntegerField('Нижняя граница тенденции содержания сахара', null=True, blank=True)
- bg_trand_max = models.IntegerField('Верхняя граница тенденции содержания сахара', null=True, blank=True)
- wristband_hr = models.IntegerField('Максимальное верхнее давление', null=True, blank=True, default=60)
- '''Value Zones'''
- pulse_zone_min = models.IntegerField('Зона Максимума пульса', null=True, blank=True, default=50)
- pulse_zone_max = models.IntegerField('Зона Минимума пульса', null=True, blank=True, default=90)
- calories_zone_min = models.IntegerField('Нижняя граница кол-ва калорий', null=True, blank=True, default=1500)
- calories_zone_max = models.IntegerField('Верхняя граница кол-ва калорий', null=True, blank=True, default=4000)
- distance_zone_min = models.IntegerField('Минимальное кол-во шагов', null=True, blank=True, default=5000)
- distance_zone_min = models.IntegerField('Минимальное кол-во шагов', null=True, blank=True, default=10000)
- tonometer_hp_zone_min = models.IntegerField('Нижняя граница Систолическое давления', null=True, blank=True, default=110)
- tonometer_hp_zone_max = models.IntegerField('Верхняя граница Систолическое давления', null=True, blank=True, default=130)
- tonometer_lp_zone_min = models.IntegerField('Нижняя граница Систолическое давления', null=True, blank=True, default=70)
- tonometer_lp_zone_max = models.IntegerField('Верхняя граница Систолическое давления', null=True, blank=True, default=90)
- bo_zone_min = models.IntegerField('Зона минимального значения кислорода', null=True, blank=True, default=95)
- mean_excess_number = models.IntegerField('Количество данных выше средней', default=2)
- date_start = models.DateField('Начало периода', null=True, blank=True)
- date_end = models.DateField('Конец периода', null=True, blank=True)
- def __str__(self):
- return ' '.join([self.surname, self.name, self.patronymic])
- def to_json(self):
- return model_to_dict(self)
- class Meta:
- verbose_name = 'Пациент'
- verbose_name_plural = 'Пациенты'
- db_table = 'patients'
- class Diagnosis(models.Model):
- """Диагноз"""
- diagnosis_1 = models.TextField('Диагноз 1')
- diagnosis_2 = models.TextField('Диагноз 2', blank=True)
- diagnosis_3 = models.TextField('Диагноз 3', blank=True)
- diagnosis_4 = models.TextField('Диагноз 4', blank=True)
- diagnosis_5 = models.TextField('Диагноз 5', blank=True)
- def __str__(self):
- return self.diagnosis_1
- class Meta:
- verbose_name = 'Диагноз'
- verbose_name_plural = 'Диагнозы'
- db_table = 'diagnoses'
- class HospitalRefusal(models.Model):
- """Отказ от госпитализации"""
- description = models.TextField('Описание')
- datetime = models.DateTimeField('Дата и время отказа', auto_now_add=True)
- def __str__(self):
- return self.description
- class Meta:
- verbose_name = 'Отказ'
- verbose_name_plural = 'Отказы'
- db_table = 'hospital_refusals'
- class HospitalDirection(models.Model):
- """Направление"""
- class HospitalDirectionStatus(models.TextChoices):
- WAITING = "WAITING", "Ожидание"
- HOSPITALIZED = "HOSPITALIZED", "Госпитализация"
- REFUSED = "REFUSED", "Отмена"
- phone_regex = RegexValidator(regex=r'^\+7\d{11}$')
- from_ambulance = models.BooleanField('От скорой')
- doctor = models.ForeignKey(Doctor, verbose_name='Доктор', blank=True, null=True, on_delete=models.SET_NULL)
- patient_surname = models.CharField('Фамилия пациента', max_length=32, blank=True, db_index=True)
- patient_name = models.CharField('Имя пациента', blank=True, max_length=32)
- patient_patronymic = models.CharField('Отчество пациента', blank=True, max_length=32)
- patient_OMS = models.CharField('Номер полиса ОМС пациента', blank=True, max_length=16)
- patient_phone_number = models.CharField('Номер телефона пациента', blank=True, validators=[phone_regex], max_length=12)
- status = models.CharField('Статус', max_length=32, choices=HospitalDirectionStatus.choices)
- refusal = models.ForeignKey(HospitalRefusal, verbose_name='Отказ', blank=True, null=True, on_delete=models.SET_NULL)
- diagnosis = models.ForeignKey(Diagnosis, verbose_name='Диагноз', blank=True, null=True, on_delete=models.SET_NULL)
- wait_date_start = models.DateField('Дата начала ожидания', blank=True, null=True)
- wait_date_end = models.DateField('Дата окончания ожидания', blank=True, null=True)
- hospital = models.ForeignKey(Polyclinic, verbose_name='Больница', on_delete=models.CASCADE)
- def to_json(self):
- return model_to_dict(self)
- def __str__(self):
- return 'ID %s (%s)' % (self.id, 'СМП' if self.from_ambulance else self.doctor.polyclinic)
- class Meta:
- verbose_name = 'Направление'
- verbose_name_plural = 'Направления'
- db_table = 'hospital_directions'
- class HospitalAdmission(models.Model):
- """Поступление"""
- patient = models.ForeignKey(Patient, verbose_name='Пациент', on_delete=models.CASCADE)
- direction = models.ForeignKey(HospitalDirection, verbose_name='Направление', on_delete=models.CASCADE)
- diagnosis = models.ForeignKey(Diagnosis, verbose_name='Поступление', on_delete=models.CASCADE)
- hospital = models.ForeignKey(Polyclinic, verbose_name='Больница', on_delete=models.CASCADE)
- admission_date = models.DateField('Дата поступления', auto_now_add=True)
- discharge_planned_date = models.DateField('Планируемая дата выписки', blank=True, null=True)
- discharge_date = models.DateField('Дата выписки', blank=True, null=True)
- state = models.TextField('Состояние', blank=True)
- @property
- def bed(self):
- """ Койка, занятая пациентом """
- return str(HospitalBed.objects.get(admission=self))
- def __str__(self):
- return ', '.join([str(self.patient), self.admission_date.strftime('%d.%m.%Y')])
- class Meta:
- verbose_name = 'Поступление'
- verbose_name_plural = 'Поступления'
- db_table = 'hospital_admissions'
- class HospitalBed(models.Model):
- """Больничная койка"""
- class HospitalBedStatus(models.TextChoices):
- """ Возможные статусы коек """
- VACANT = "VACANT", "Свободна"
- OCCUPIED = "OCCUPIED", "Занята"
- RESERVED = "RESERVED", "Резерв"
- @classmethod
- def create(cls, ward, status=HospitalBedStatus.VACANT, description='', direction=None, admission=None):
- """ Создание новой койки.
- Здесь мы выбираем минимальный еще не занятый номер для новой койки
- """
- nums = list(HospitalBed.objects.filter(ward=ward).values_list('number', flat=True))
- nums.sort()
- if not nums:
- number = 1
- else:
- number = max(nums) + 1
- for i in range(1, number):
- if i != nums[i-1]:
- number = i
- break
- bed = cls(ward=ward, number=number, status=status, description=description, direction=direction, admission=admission)
- bed.save()
- return bed
- number = models.PositiveIntegerField('Номер')
- ward = models.ForeignKey(HospitalWard, verbose_name='Палата', related_name='wards', on_delete=models.CASCADE)
- description = models.CharField('Описание', max_length=64, blank=True)
- status = models.CharField('Статус', choices=HospitalBedStatus.choices, max_length=16)
- direction = models.ForeignKey(HospitalDirection, verbose_name='Направление', unique=True, blank=True, null=True, on_delete=models.SET_NULL)
- admission = models.ForeignKey(HospitalAdmission, verbose_name='Поступление', unique=True, blank=True, null=True, on_delete=models.SET_NULL)
- @property
- def patient(self):
- """ Информация о пациенте.
- Если койка занята, берем данные о пациенте из поступления,
- если койка зарезервирована - из направления
- """
- if self.status == self.HospitalBedStatus.OCCUPIED:
- return str(self.admission)
- if self.status == self.HospitalBedStatus.RESERVED:
- return str(self.direction)
- else:
- return '-'
- def to_json(self):
- return model_to_dict(self)
- def __str__(self):
- return '%s/%s' % (str(self.ward), self.number)
- class Meta:
- verbose_name = 'Палата'
- verbose_name_plural = 'Палаты'
- db_table = 'hospital_beds'
- class CriticalParametrs(models.Model):
- """Критические параметры, их устанавливает поликлиника пациенту через связь с таблицей Attachment по вн. ключу"""
- bp_high_min = models.IntegerField('Минимальное верхнее давление', null=True, blank=True, default=100)
- bp_high_max = models.IntegerField('Максимальное верхнее давление', null=True, blank=True, default=180)
- bp_low_min = models.IntegerField('Минимальное нижнее давление', null=True, blank=True, default=55)
- bp_low_max = models.IntegerField('Максимальное нижнее давление', null=True, blank=True, default=130)
- pulse_min = models.IntegerField('Минимальный пульс', null=True, blank=True, default=40)
- pulse_max = models.IntegerField('Максимальный пульс', null=True, blank=True, default=180)
- temperature_min = models.IntegerField('Минимальная температура', null=True, blank=True, default=34)
- temperature_max = models.IntegerField('Максимальная температура', null=True, blank=True, default=42)
- bo_min = models.IntegerField('Минимальное значение кислорода', null=True, blank=True, default=95)
- # bo_max = models.IntegerField('Максимальное значение кислорода', null=True, blank=True, default=100)
- distance_min = models.IntegerField('Минимальное кол-во шагов', null=True, blank=True, default=2700)
- distance_min = models.IntegerField('Минимальное кол-во шагов', null=True, blank=True, default=20000)
- distance_trand_min = models.IntegerField('Минимальное кол-во шагов', null=True, blank=True, default=2000)
- distance_trand_min = models.IntegerField('Минимальное кол-во шагов', null=True, blank=True, default=40000)
- calories_min = models.IntegerField('Минимальное кол-во калорий', null=True, blank=True, default=1000)
- calories_max = models.IntegerField('Максимальное кол-во калорий', null=True, blank=True, default=5000)
- calories_trand_min = models.IntegerField('Нижняя граница кол-ва калорий', null=True, blank=True, default=500)
- calories_trand_max = models.IntegerField('Верхняя граница кол-ва калорий', null=True, blank=True, default=5000)
- temperature_trand_min = models.IntegerField('Нижняя граница тенденции температуры', null=True, blank=True)
- temperature_trand_max = models.IntegerField('Нижняя граница тенденции температуры', null=True, blank=True)
- bp_difference_max = models.IntegerField('Максимальная разница давлений', null=True, blank=True)
- bp_difference_min = models.IntegerField('Минимальная разница давлений', null=True, blank=True)
- bp_trand_high_min = models.IntegerField('Нижняя граница тенденции верхнего давления', null=True, blank=True)
- bp_trand_high_max = models.IntegerField('Верхняя граница тенденции верхнего давления', null=True, blank=True)
- bp_trand_low_min = models.IntegerField('Нижняя граница тенденции нижнего давления', null=True, blank=True)
- bp_trand_low_max = models.IntegerField('Верхняя граница тенденции нижнего давления', null=True, blank=True)
- bp_trand_difference_max = models.IntegerField('Верхняя граница тенденции разницы давлений', null=True, blank=True)
- bp_trand_difference_min = models.IntegerField('Нижняя граница тенденции разницы давлений', null=True, blank=True)
- pulse_trand_min = models.IntegerField('Нижняя граница тенденции пульса', null=True, blank=True, default=70)
- pulse_trand_max = models.IntegerField('Верхняя граница тенденции пульса', null=True, blank=True, default=90)
- bp_scenario_id = models.IntegerField('Сценарий давления', null=True, blank=True)
- mean_slide_number = models.IntegerField('Скользящая средняя', default=5)
- bo_trand_min = models.IntegerField('Нижняя граница тенденции содержания кислорода', null=True, blank=True, default=90)
- bo_trand_max = models.IntegerField('Верхняя граница тенденции содержания кислорода', null=True, blank=True, default=95)
- bg_min = models.IntegerField('Минимальное значение сахара в крови', null=True, blank=True, default=10)
- bg_max = models.IntegerField('Максимальное значение сахара в крови', null=True, blank=True, default=300)
- bg_trand_min = models.IntegerField('Нижняя граница тенденции содержания сахара', null=True, blank=True)
- bg_trand_max = models.IntegerField('Верхняя граница тенденции содержания сахара', null=True, blank=True)
- wristband_hr = models.IntegerField('Максимальное верхнее давление', null=True, blank=True, default=60)
- '''Value Zones'''
- pulse_zone_min = models.IntegerField('Зона Максимума пульса', null=True, blank=True, default=50)
- pulse_zone_max = models.IntegerField('Зона Минимума пульса', null=True, blank=True, default=90)
- calories_zone_min = models.IntegerField('Нижняя граница кол-ва калорий', null=True, blank=True, default=1500)
- calories_zone_max = models.IntegerField('Верхняя граница кол-ва калорий', null=True, blank=True, default=4000)
- distance_zone_min = models.IntegerField('Минимальное кол-во шагов', null=True, blank=True, default=5000)
- distance_zone_min = models.IntegerField('Минимальное кол-во шагов', null=True, blank=True, default=10000)
- bo_zone_min = models.IntegerField('Зона минимального значения кислорода', null=True, blank=True, default=95)
- mean_excess_number = models.IntegerField('Количество данных выше средней', default=2)
- date_start = models.DateField('Начало периода', null=True, blank=True)
- date_end = models.DateField('Конец периода', null=True, blank=True)
- class Attachment(models.Model):
- """Прикрепление"""
- recording_time = models.DateTimeField('Время записи', blank=False, null=True)
- pacient = models.ForeignKey(Patient, verbose_name='Пациент', on_delete=models.CASCADE)
- polyclinic = models.ForeignKey(Polyclinic, verbose_name='Поликлиника', on_delete=models.CASCADE)
- confirmation_polyclynic = models.BooleanField('Подтверждение поликлиники', default=False)
- confirmation_pacient = models.BooleanField('Подтверждение пациента', default=False)
- refusal = models.BooleanField('Отказ', default=False)
- critical_value = models.ForeignKey(CriticalParametrs, verbose_name='Критические параметры пациета', null=True, on_delete=models.CASCADE)
- def __str__(self):
- return str(self.pacient) + ' - ' + str(self.polyclinic)
- def save(self, *args, **kwargs):
- super(Attachment, self).save(*args, **kwargs)
- class Meta:
- db_table= 'attachment'
- verbose_name = 'Запрос на прикрепление'
- verbose_name_plural = 'Запросы на прикрепления'
- # class Сonfirmation_Ticket(models.Model):
- class Ticket(models.Model):
- start_date_of_appointment = models.TimeField('Начала приёма', blank=True, null=True)
- appointment_end_date = models.TimeField('Конец приёма', blank=True, null=True)
- doctor = models.ForeignKey(Doctor, verbose_name='Доктор', null=True, on_delete=models.SET_NULL)
- number_for_inspection = models.PositiveIntegerField('Кол-во времени на осмотр', null=True)
- patient = models.ForeignKey(Patient, verbose_name='Пациент', null=True, on_delete=models.SET_NULL)
- confirmation_status = models.BooleanField('Подтверждение статуса', default=False)
- work_chedule = models.ForeignKey('Personal_Workchedule', verbose_name='Расписание доктора', null=True, on_delete=models.SET_NULL)
- refuse = models.BooleanField('Отказ о данном талоне', default=False)
- class Meta:
- verbose_name = 'Талоны'
- verbose_name_plural = "Талон"
- ordering = ["work_chedule"]
- def __str__(self):
- return str(self.work_chedule) + ' ' + str(self.start_date_of_appointment) + ' ' + str(self.appointment_end_date) + ' ' + f'{ "" if not self.refuse else "(Отказ)"}'
- def calculation_of_coupons(time_start, time_end, interval) -> list:
- '''
- Функция возвращает временной список с промежутком в {interval} минут
- '''
- period_list = []
- period_start = time_start
- while period_start < time_end:
- period_end = period_start + interval
- period_list.append((period_start, period_end))
- period_start = period_end
- return period_list
- class Refusal_of_coupon(models.Model):
- reason_for_renouncement = models.TextField('Причина отказа')
- doctor = models.ForeignKey(Doctor, on_delete=models.SET_NULL, verbose_name='Врач', null=True, blank=True)
- talon = models.ForeignKey(Ticket, on_delete=models.SET_NULL, verbose_name='Талон', related_name='refusal', null=True, blank=True)
- recording_time = models.DateTimeField('Время записи', blank=False, null=True)
- class Meta:
- verbose_name = 'Отмена талона'
- verbose_name_plural = "Отмена талона"
- db_table = "refusal_of_coupon"
- class Personal_Workchedule(models.Model):
- """График приёма вызова на один день для врача"""
- date = models.DateField('Режим работы на:', blank=False)
- work_period_start = models.TimeField('Начала работы', blank=True, null=True,default=time(8, 00))
- end_work_period = models.TimeField('Конец рабочего дня', blank=True, null=True,default=time(17, 00))
- start_work = models.TimeField('Начала приёма', blank=True, null=True)
- end_work = models.TimeField('Конец приёма', blank=True, null=True)
- count_of_minute_on_one_see = models.PositiveIntegerField('Кол-во минут на осмотр', default=25)
- weekend = models.BooleanField('Присутствие врача', default=True)
- doctor = models.ForeignKey(Doctor, verbose_name='Врач', related_name='doctor_rec',on_delete=models.CASCADE, blank=True, null=False)
- class Meta:
- verbose_name = 'Рабочий день недели врача'
- verbose_name_plural = "Рабочий день недели врача"
- db_table = 'personal_workchedule'
- ordering = ['date']
- def __str__(self):
- return str(self.doctor) + ' ' + str(self.date)
- def create_list(doctor_id) -> list:
- '''
- Создание графика доктора в формате json
- '''
- graph = Personal_Workchedule.objects.filter(doctor__id = doctor_id, date__gte=datetime.today())
- data = {}
- for date in graph:
- day, month, year = date.date.strftime('%d-%m-%Y').split('-')
- if year in data:
- if month in data[year]:
- data[year][month].append(str(date.id) + ',' + year + '.' + month + '.' + day + ',' + str(date.weekend))
- else:
- data[year][month] = [str(date.id) + ',' + year + '.' + month + '.' + day+ ',' + str(date.weekend)]
- else:
- data[year] = {month: [str(date.id) + ',' + year + '.' + month + '.' + day+ ',' + str(date.weekend)]}
- return json.dumps(data)
- def create_personal_graph_again(count_of_days, doctor_id):
- '''
- Создание n кол-во дней режима работы для врача
- '''
- doctor = Doctor.objects.get(id = doctor_id)
- graph = Personal_Workchedule.objects.filter(date__gte=datetime.today(), doctor = doctor)
- if len(graph) < 20:
- datelist = pd.date_range(graph.latest('date').date + timedelta(days=1) if graph.exists() else datetime.today(), periods=count_of_days).tolist()
- for days in datelist:
- create_graph = Personal_Workchedule.objects.create(
- date = days,
- doctor = doctor
- )
- return 'Дни в график были добавленны !'
- else:
- return 'Добавить раснисание на больше чем 20 дней нельзя!'
- class ReceivingStaff(models.Model):
- """График приёмов вызова"""
- CHOICES_DAY_OF_WEEK = (
- ('Понедельник', 'Понедельник'),
- ('Вторник', 'Вторник'),
- ('Среда', 'Среда'),
- ('Четверг', 'Четверг'),
- ('Пятница', 'Пятница'),
- ('Суббота', 'Суббота'),
- ('Воскресенье', 'Воскресенье'),
- )
- days = models.CharField(choices=CHOICES_DAY_OF_WEEK, max_length=50, blank=False, null=True)
- start_work = models.TimeField('Начала работы', blank=True, null=True)
- end_work = models.TimeField('Конец рабочего дня', blank=True, null=True)
- staff = models.ForeignKey('Staff', verbose_name='Сотрудник', related_name='staff_rec',on_delete=models.CASCADE, blank=True, null=False)
- room_number = models.CharField('Номер кабинета', max_length=16, null=True)
- class Meta:
- verbose_name = 'Прием вызовов (сотрудники)'
- verbose_name_plural = "Прием вызова (сотрудники)"
- db_table = 'receivingstaff'
- class Staff(models.Model):
- """Сотрудники"""
- phone_regex = RegexValidator(regex=r'^\+?1?\d{9,15}$')
- user = models.ForeignKey(User, on_delete=models.CASCADE)
- polyclinic = models.ForeignKey('Polyclinic', null=True, blank=True,verbose_name="Учреждение", on_delete=models.CASCADE, default=None)
- category = models.ForeignKey('Category',on_delete=models.SET_NULL, null=True, blank=True)
- photo = models.ImageField(upload_to='staff/%Y/%m/%d', blank=True)
- login = models.CharField('Логин', max_length=15, blank=False, db_index=True, null=True)
- password = models.CharField('Пароль', blank=False,max_length=20, db_index=True, null=True)
- short_number = models.PositiveIntegerField('Кородкий номер', null=True, blank=False)
- surname = models.CharField('Фамилия', max_length=32, db_index=True)
- name = models.CharField('Имя', max_length=32)
- patronymic = models.CharField('Отчество', max_length=32)
- date_of_birth = models.DateField('Дата рождения', blank=False)
- specialty = models.CharField('Специальность', max_length = 150, blank=True)
- address = models.CharField('Адресс проживания', max_length=255, blank=True, db_index=True)
- phone = models.CharField('Контактный номер телефона', validators=[phone_regex], max_length=17, blank=True,db_index=True)
- date_of_employment = models.DateField('Дата трудоустройства', blank=False)
- date_of_dismissal = models.DateField('Дата увольнения', blank=False, null = True)
- present = models.BooleanField('Присутствует', default = False)
- onn_or_off_web_phone = models.BooleanField('Включить веб телефон', default=True)
- @property
- def fio(self):
- return str(self.surname) + ' ' + str(self.name) + ' ' + str(self.patronymic)
- class Meta:
- verbose_name = 'Сотрудники'
- verbose_name_plural = "Сотрудник"
- db_table = 'staff'
- def __str__(self):
- return str(self.surname) + ' ' + str(self.name) + ' ' + str(self.patronymic) + ' : ' + str(self.polyclinic)
- class List_SES(models.Model):
- phone_regex = RegexValidator(regex=r'^\+?1?\d{9,15}$')
- epid_number = models.CharField('Эпид номер', max_length=255,blank=True, db_index=True)
- 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)
- date_of_receipt = models.DateTimeField('Дата приема', null=True, blank=True)
- time_of_receipt = models.TimeField('Часы приема', blank=True, null=True)
- surname = models.CharField('Фамилия', max_length=32,blank=True, null=True, db_index=True)
- name = models.CharField('Имя', max_length=32, null=True,blank=True)
- patronymic = models.CharField('Отчество', null=True, max_length=32,blank=True)
- date_of_birth = models.DateField('Дата рождения', null=True, blank=True)
- street = models.CharField('Улица',null=True,blank=True, max_length=255, db_index=True)
- house = models.CharField('Дом', max_length=255, null=True, db_index=True,blank=True)
- apartment = models.CharField('Квартира', max_length=255, null=False, db_index=True, default='')
- phone_number = models.CharField('Контактный номер телефона', null=True, max_length=17, blank=True,db_index=True) # validators=[phone_regex],
- place_of_work_or_study = models.CharField('Место работы/учебы', null=True, max_length = 150, blank=True)
- date_of_last_visit_to_the_place_of_work = models.DateField('Дата последнего посещения места работы', null=True, blank=True)
- date_of_illness = models.DateField('Дата заболевания', null=True,blank=True)
- diagnosis = models.CharField('Диагноз', null=True, max_length = 150, blank=True)
- severity = models.CharField('Степень тяжести', null=True, max_length = 150, blank=True)
- date_of_establishment = models.DateField('Дата установления', null=True,blank=True)
- place_of_hospitalization = models.ForeignKey(Polyclinic, null=True, blank=True,verbose_name="Место госпитализации",related_name='place_of_hospitalization', on_delete=models.CASCADE, default=None)
- date_of_hospitalization = models.DateField('Дата госпитализации', null=True, blank=True)
- date_of_initial_appeal = models.DateField('Дата первичного обращения', null=True, blank=True)
- laboratory_research = models.CharField('Лабораторное исследование', null=True, max_length = 150, blank=True)
- research_result = models.CharField('Результат исследование', null=True, max_length = 150, blank=True)
- date_study = models.DateField('Дата исследование', null=True,blank=True)
- discharge_date = models.DateField('Дата выписки', null=True,blank=True)
- note = models.CharField('Примечание', null=True, max_length = 255, blank=True)
- recording_time = models.DateTimeField('Время записи', blank=True, null=True)
- operator = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name='Оператор', null=True, blank=True)
- def __str__(self):
- return str(self.surname) + ' ' + str(self.name) + ' ' + str(self.patronymic)
- class Meta:
- db_table = 'list_ses'
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement