Advertisement
Mochinov

Untitled

May 20th, 2021
1,204
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 40.81 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
  8. from django.urls import reverse
  9. from registration.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. from registration.models import Patient, CriticalParametrs,Entity,Attachment
  15. from django.contrib.contenttypes.fields import GenericForeignKey, GenericRelation
  16. from django.contrib.contenttypes.models import ContentType
  17. from django.db import models
  18. from registration.date import get_time_to_city, get_week, cheked_set_write, tz
  19. from django.utils import timezone
  20.  
  21. class Apps(models.Model):
  22.     name = models.CharField('Название приложение', max_length=35)
  23.     version  = models.CharField('Версия приложение', max_length=35, default='')
  24.     comment = models.CharField('Коммент', max_length=35)
  25.     is_last = models.BooleanField('Является ли последней', unique=True, default=True)
  26.     app = models.FileField('Приложение')
  27.  
  28.     def __str__(self):
  29.         return f'{self.name} {self.version} {"Last version" if self.is_last else ""}'
  30.  
  31.     def get_last_app():
  32.         return Apps.objects.get(is_last=True)
  33.    
  34.     def to_json(self):
  35.         return model_to_dict(self)
  36.     class Meta:
  37.         verbose_name = 'Приложение'
  38.         verbose_name_plural = 'Приложения'
  39.         db_table = 'app'
  40.  
  41. class DeviceTypes(models.Model):
  42.     type = models.CharField('Тип устройства', max_length=30)
  43.  
  44.     def __str__(self):
  45.         return f'{self.type}'
  46.    
  47.     class Meta:
  48.         verbose_name = "Тип устройства"
  49.         verbose_name_plural = "Типы устройств"
  50.  
  51.  
  52. class DeviceSpecies(models.Model):
  53.     species = models.CharField('Вид устройства', max_length=10)
  54.     type = models.ForeignKey(DeviceTypes,on_delete=models.CASCADE, default=30)
  55.  
  56.     def __str__(self):
  57.         return f'{self.species} {self.type}'
  58.    
  59.     class Meta:
  60.         verbose_name = "Вид устройства"
  61.         verbose_name_plural = "Виды устройств"
  62.  
  63. class Sertificate_Device(models.Model):
  64.     name_sertificate = models.CharField('Название сетиификата', max_length=255)
  65.     sertificate = models.FileField('Сертификат', blank=True)
  66.  
  67.     def __str__(self):
  68.         return 'Сертификат на устройство(Браслет): ' + str(self.name_sertificate)
  69.    
  70.     class Meta:
  71.         verbose_name = "Сертификат устройства"
  72.         verbose_name_plural = "Сертификаты устройств"
  73.  
  74. class HealthDevice(models.Model):
  75.     name = models.CharField('Название браслета', max_length=255, null=False, default = 'Anonymous')
  76.     mac_adress = models.CharField('Мак адрес измерительного устройства', unique=True, max_length=17)
  77.     last_connect = models.DateTimeField('Последнее соединение')
  78.     battery_charge = models.SmallIntegerField('Уровень заряда')
  79.     last_user = models.ForeignKey(Patient, related_name="health_device",on_delete=models.CASCADE,default=0)
  80.     is_active = models.BooleanField(default=True)
  81.     now_measure = models.BooleanField(default=False)
  82.     device_species = models.ForeignKey(DeviceSpecies,on_delete=models.CASCADE, default=0)
  83.     device_type = models.ForeignKey(DeviceTypes,on_delete=models.CASCADE, default=0)
  84.  
  85.     def __str__(self):
  86.         return f'{self.mac_adress} {self.last_user} {self.last_connect} {"Active" if self.is_active else "NoN"}'
  87.  
  88.     class Meta:
  89.         verbose_name = "Параметры состояния устройства"
  90.         verbose_name_plural = "Параметры состояния устройств"
  91.  
  92. # таблица андроид устройств пользователя
  93. class Android(models.Model):
  94.     mac_adress = models.CharField('Мак адрес телефона', primary_key=True, max_length=17)
  95.     last_connect = models.DateTimeField('Последнее соединение')
  96.     battery_charge = models.SmallIntegerField('Уровень заряда')
  97.     last_user = models.ForeignKey(Patient, on_delete=models.CASCADE,default=0)
  98.     is_active = models.BooleanField(default=True)
  99.  
  100.     def __str__(self):
  101.         return f'{self.mac_adress} {self.last_user} {"Active" if self.is_active else "NoN active"}'
  102.    
  103.     class Meta:
  104.         verbose_name = "Android устройство"
  105.         verbose_name_plural = "Android устройства"
  106.  
  107. class BaseDevicesClass(models.Model):
  108.     datetime = models.DateTimeField('Время измерения', db_index=True)
  109.     sync_datetime = models.DateTimeField('Время получения измерения')
  110.     tags = GenericRelation('CriticalValue')
  111.  
  112.     lat = models.FloatField('Широта', blank=True, null=True)
  113.     lon = models.FloatField('Долгота', blank=True, null=True)
  114.  
  115.     class Meta:
  116.         abstract = True
  117.  
  118. # Теперь ты можешь получить из этого поля user.health_device.get().field_name , попробуй так
  119. class Tonometer(BaseDevicesClass):
  120.     user = models.ForeignKey(Patient,on_delete=models.CASCADE,  null=True)
  121.     HR = models.IntegerField('Пульс')
  122.     HP = models.IntegerField('Систолическое давление')
  123.     LP = models.IntegerField('Диастолическое давление')
  124.     AFTER_MED = models.BooleanField('Прием лекарств')
  125.  
  126.     def __str__(self):
  127.         return f'{self.user} пульс: {self.HR} давление: {self.HP}/{self.LP}'
  128.  
  129.     def get_params(self = None):
  130.         if self:
  131.             return {
  132.                 'id' : self.id,
  133.                 'name': 'Давление',
  134.                 'values' : str(self.HP) + '/' + str(self.LP),
  135.                 'pacient' : self.user,
  136.                 'only_values':{
  137.                     'HP': self.HP,
  138.                     'LP': self.LP
  139.                 }
  140.             }
  141.  
  142.         else:
  143.             return {
  144.                 'only_values':{
  145.                     'HP': None,
  146.                     'LP': None
  147.                 }
  148.             }
  149.  
  150.     @property
  151.     def get_time(self):
  152.         time_shifting = self.user.residence_address.town.time_shifting if self.user.residence_address.town else 0
  153.         return (self.datetime + timedelta(hours=time_shifting)).strftime("%Y-%m-%d %H:%M")
  154.        
  155.     class Meta:
  156.         verbose_name = "Тонометр"
  157.         verbose_name_plural = "Тонометр"
  158.  
  159.  
  160. class Oximeter(BaseDevicesClass):
  161.  
  162.     android_mac = models.ForeignKey(Android,on_delete=models.CASCADE, null=True)
  163.     user = models.ForeignKey(Patient,on_delete=models.CASCADE,  null=True)
  164.     HR = models.IntegerField('Пульс')
  165.     BO = models.IntegerField('Уровень кислорода')
  166.  
  167.     def __str__(self):
  168.         return f'{self.user} пульс: {self.HR} oxi:{self.BO}'
  169.  
  170.     def get_params(self):
  171.         return {
  172.             'id' : self.id,
  173.             'name': 'Пульс',
  174.             'values' : self.HR,
  175.             'pacient' : self.user
  176.         }
  177.    
  178.     @property
  179.     def get_time(self):
  180.         time_shifting = self.user.residence_address.town.time_shifting if self.user.residence_address.town else 0
  181.         return (self.datetime + timedelta(hours=time_shifting)).strftime("%Y-%m-%d %H:%M")
  182.  
  183.     class Meta:
  184.         verbose_name = "Оксиметр"
  185.         verbose_name_plural = "Оксиметр"
  186.  
  187. class Glucometer(BaseDevicesClass):
  188.  
  189.     android_mac = models.ForeignKey(Android,on_delete=models.CASCADE,  null=True)
  190.     user = models.ForeignKey(Patient,on_delete=models.CASCADE, null=True)
  191.     BG = models.DecimalField('Уровень сахара', max_digits=3, decimal_places=1)
  192.     AFTER_EAT = models.BooleanField(default=True)
  193.  
  194.     def __str__(self):
  195.         return f'{self.user} sugar:{self.BG} { "После" if self.AFTER_EAT else "До"}'
  196.  
  197.     def get_params(self):
  198.         return {
  199.             'id' : self.id,
  200.             'name': 'Уровень сахара',
  201.             'values' : self.BG,
  202.             'pacient' : self.user
  203.         }
  204.    
  205.     @property
  206.     def get_time(self):
  207.         time_shifting = self.user.residence_address.town.time_shifting if self.user.residence_address.town else 0
  208.         return (self.datetime + timedelta(hours=time_shifting)).strftime("%Y-%m-%d %H:%M")
  209.  
  210.     class Meta:
  211.         verbose_name = "Глюкометр"
  212.         verbose_name_plural = "Глюкометр"
  213.  
  214. class Thermometer(BaseDevicesClass):
  215.     android_mac = models.ForeignKey(Android,on_delete=models.CASCADE,  null=True)
  216.     user = models.ForeignKey(Patient,on_delete=models.CASCADE,  null=True)
  217.     TM = models.DecimalField('Температура', max_digits=3, decimal_places=1)
  218.  
  219.     def __str__(self):
  220.         return f'{self.user} {self.TM}'
  221.  
  222.     def get_params(self = None):
  223.         if self:
  224.             return {
  225.                 'id' : self.id,
  226.                 'name': 'Температура',
  227.                 'values' : self.TM,
  228.                 'pacient' : self.user
  229.             }
  230.         else:
  231.             return {
  232.                 'only_values':{
  233.                     'TM': None,
  234.                 }
  235.             }
  236.    
  237.     class Meta:
  238.         verbose_name = "Термометр"
  239.         verbose_name_plural = "Термометр"
  240.  
  241. class Wristband(BaseDevicesClass):
  242.  
  243.     android_mac = models.ForeignKey(Android,on_delete=models.CASCADE, null=True)
  244.     user = models.ForeignKey(Patient,on_delete=models.CASCADE,  null=True)
  245.     HP = models.IntegerField('Систолическое давление', default=0)
  246.     LP = models.IntegerField('Диастолическое давление', default=0)
  247.  
  248.     def __str__(self):
  249.         return f'{self.user} {self.HP}/{self.LP}'
  250.    
  251.     @property
  252.     def get_time(self):
  253.         time_shifting = self.user.residence_address.town.time_shifting if self.user.residence_address.town else 0
  254.         return (self.datetime + timedelta(hours=time_shifting)).strftime("%Y-%m-%d %H:%M")
  255.  
  256.     def get_params(self = None):
  257.         if self:
  258.             return {
  259.                 'id' : self.id,
  260.                 'name': 'Давление',
  261.                 'values' : str(self.HP) + '/' + str(self.LP),
  262.                 'pacient' : self.user,
  263.                 'only_values':{
  264.                     'HP': self.HP,
  265.                     'LP': self.LP
  266.                 }
  267.             }
  268.  
  269.         else:
  270.             return {
  271.                 'only_values':{
  272.                     'HP': None,
  273.                     'LP': None
  274.                 }
  275.             }
  276.  
  277.     class Meta:
  278.         verbose_name = "Давление"
  279.         verbose_name_plural = "Давление"
  280.  
  281. class Calories(BaseDevicesClass):
  282.     datetime = models.DateTimeField('Время измерения', db_index=True)
  283.     sync_datetime = models.DateTimeField('Время получения измерения')
  284.     android_mac = models.ForeignKey(Android,on_delete=models.CASCADE,  null=True)
  285.     user = models.ForeignKey(Patient,on_delete=models.CASCADE,  null=True)
  286.     kilocalories = models.FloatField('Калории', default=0)
  287.  
  288.     def __str__(self):
  289.         return f'{self.user} {self.kilocalories}'
  290.  
  291.     def create_or_update_model(sync_datetime, android_mac, user, kilocalories):
  292.         try:
  293.             сalories = Calories.objects.get(user = user,sync_datetime = sync_datetime)
  294.             сalories.kilocalories = kilocalories
  295.             сalories.save()
  296.             return сalories
  297.         except:
  298.             сalories = Calories.objects.create(
  299.                 user=user,
  300.                 datetime=datetime.now(),
  301.                 sync_datetime=sync_datetime,
  302.                 android_mac = android_mac,
  303.                 kilocalories=kilocalories,
  304.             )
  305.             return сalories
  306.  
  307.     @property
  308.     def get_time(self):
  309.         time_shifting = self.user.residence_address.town.time_shifting if self.user.residence_address.town else 0
  310.         return (self.datetime + timedelta(hours=time_shifting)).strftime("%Y-%m-%d %H:%M")
  311.  
  312.     def get_params(self = None):
  313.         if self:
  314.             return {
  315.                 'id' : self.id,
  316.                 'name': 'Калории',
  317.                 'values' : str(self.kilocalories),
  318.                 'pacient' : self.user,
  319.                 'only_values':{
  320.                     'kilocalories': self.kilocalories,
  321.                 }
  322.             }
  323.  
  324.         else:
  325.             return {
  326.                 'only_values':{
  327.                     'kilocalories': None
  328.                 }
  329.             }
  330.  
  331.     class Meta:
  332.         verbose_name = "Калории"
  333.         verbose_name_plural = "Калории"
  334.  
  335. class Distance(BaseDevicesClass):
  336.     datetime = models.DateTimeField('Время измерения', db_index=True)
  337.     sync_datetime = models.DateTimeField('Время получения измерения')
  338.     android_mac = models.ForeignKey(Android,on_delete=models.CASCADE, null=True)
  339.     user = models.ForeignKey(Patient,on_delete=models.CASCADE,  null=True)
  340.     count_of_steps = models.IntegerField('Дистанция (шаг(и))', null=True)
  341.     meters =  models.IntegerField('Дистанция (метр)',  null=True)
  342.  
  343.     def __str__(self):
  344.         return f'{self.user} {self.count_of_steps} {self.meters}метров'
  345.  
  346.     def create_or_update_model(sync_datetime, android_mac, user, count_of_steps, meters):
  347.         try:
  348.             distance = Distance.objects.get(user = user,sync_datetime = sync_datetime)
  349.             distance.count_of_steps = count_of_steps
  350.             distance.meters = meters
  351.             distance.save()
  352.             return distance
  353.         except:
  354.             distance = Distance.objects.create(
  355.                 user=user,
  356.                 datetime=datetime.now(),
  357.                 sync_datetime=sync_datetime,
  358.                 android_mac = android_mac,
  359.                 meters=meters,
  360.                 count_of_steps=count_of_steps
  361.             )
  362.             return distance
  363.  
  364.     @property
  365.     def get_time(self):
  366.         time_shifting = self.user.residence_address.town.time_shifting if self.user.residence_address.town else 0
  367.         return (self.datetime + timedelta(hours=time_shifting)).strftime("%Y-%m-%d %H:%M")
  368.  
  369.     def get_params(self = None):
  370.         if self:
  371.             return {
  372.                 'only_values':{
  373.                     'count_of_steps': self.count_of_steps,
  374.                     'meters': self.meters
  375.                 }
  376.             }
  377.         else:
  378.             return {
  379.                 'only_values':{
  380.                     'count_of_steps': None,
  381.                     'meters': None
  382.                 }
  383.             }
  384.  
  385.     class Meta:
  386.         verbose_name = "Дистанция"
  387.         verbose_name_plural = "Дистанция"
  388.  
  389. class WristbandHR(BaseDevicesClass):
  390.  
  391.     android_mac = models.ForeignKey(Android,on_delete=models.CASCADE, null=True)
  392.     user = models.ForeignKey(Patient,on_delete=models.CASCADE,related_name='pacient_hr', null=True)
  393.     HR = models.IntegerField('Пульс')
  394.  
  395.     def __str__(self):
  396.         return f'{self.user} {self.HR}'
  397.  
  398.     def get_params(self = None):
  399.         if self:
  400.             return {
  401.                 'id' : self.id,
  402.                 'name': 'Пульс',
  403.                 'values' : self.HR,
  404.                 'pacient' : self.user
  405.             }
  406.         else:
  407.             return {
  408.                 'only_values':{
  409.                     'HR': None
  410.                 }
  411.             }
  412.     @property
  413.     def get_time(self):
  414.         time_shifting = self.user.residence_address.town.time_shifting if self.user.residence_address.town else 0
  415.         return (self.datetime + timedelta(hours=time_shifting)).strftime("%Y-%m-%d %H:%M")
  416.    
  417.     class Meta:
  418.         verbose_name = "Пульс браслета"
  419.         verbose_name_plural = "Пульс браслета"
  420.  
  421. class WristbandBO(BaseDevicesClass):
  422.  
  423.     android_mac = models.ForeignKey(Android,on_delete=models.CASCADE,  null=True)
  424.     user = models.ForeignKey(Patient,on_delete=models.CASCADE,related_name='pacient_bo',  null=True)
  425.     BO = models.IntegerField('Уровень кислорода', default=0)
  426.  
  427.     def __str__(self):
  428.         return f'{self.user} {self.BO}'
  429.  
  430.     def get_params(self = None):
  431.         if self:
  432.             return {
  433.                 'id' : self.id,
  434.                 'name': 'Уровень кислорода',
  435.                 'values' : self.BO,
  436.                 'pacient' : self.user
  437.             }
  438.  
  439.         else:
  440.             return {
  441.                 'only_values':{
  442.                     'BO': None
  443.                 }
  444.             }
  445.     @property
  446.     def get_time(self):
  447.         time_shifting = self.user.residence_address.town.time_shifting if self.user.residence_address.town else 0
  448.         return (self.datetime + timedelta(hours=time_shifting)).strftime("%Y-%m-%d %H:%M")
  449.    
  450.     class Meta:
  451.         verbose_name = "Оксигенация браслета"
  452.         verbose_name_plural = "Оксигенация браслета"
  453.  
  454. class Device(models.Model):
  455.     COLOR_CHOICES = (
  456.         ('Красный', 'Красный'),
  457.         ('Синий', 'Синий'),
  458.         ('Чёрный', 'Чёрный'),
  459.     )
  460.  
  461.     name = models.CharField('Название', max_length=64)
  462.     title = models.CharField('Заголовок', max_length=256, blank=True, default='')
  463.     cost = models.FloatField('Цена')
  464.     color = models.CharField('Цвет',choices=COLOR_CHOICES, max_length=32)
  465.  
  466.     foto_1 = models.ImageField('Фото браслета', blank=True)
  467.     foto_2 = models.ImageField('Фото браслета', blank=True)
  468.     foto_3 = models.ImageField('Фото браслета', blank=True)
  469.  
  470.     sertificate = models.ManyToManyField(Sertificate_Device, verbose_name='Сетритикат', blank=True, null=True)
  471.  
  472.     description = models.TextField('Описание',  blank=True, default='')
  473.     basic_specific = models.TextField('Основные спецификации')
  474.  
  475.     battery = models.CharField('Батарея', max_length=128)
  476.     strap_size = models.CharField('Размер ремешка', max_length=128)
  477.     weight = models.CharField('Вес', max_length=128)
  478.     type_material = models.CharField('Тип материала', max_length=128)
  479.     bluetooth = models.BooleanField('Bluetooth', default = True)
  480.     wi_fi = models.BooleanField('Wi-fi', default = True)
  481.     water_resistance = models.BooleanField('Водостойкость', default = True)
  482.     pedometer = models.BooleanField('Шагомер', default = True)
  483.     heart_rate_monitor = models.BooleanField('Пульсометр',default=True)
  484.     thermometer = models.BooleanField('Термометр',default=True)
  485.     bo_sensor = models.BooleanField('Датчик кислорода в крови',default=True)
  486.  
  487.     def to_json(self):
  488.         return model_to_dict(self)
  489.  
  490.     def __str__(self):
  491.         return f'{self.id} {self.name} {self.color} {self.cost}'
  492.    
  493.     class Meta:
  494.         verbose_name = "Устройство"
  495.         verbose_name_plural = "Устройства"
  496.  
  497. class Order(models.Model):
  498.     status = models.CharField('Статус заказа', max_length=128)
  499.     pacient = models.ForeignKey(Patient, on_delete=models.SET_NULL, null = True)
  500.     type_devise = models.ForeignKey(Device, on_delete=models.SET_NULL, null = True)
  501.     color = models.CharField(verbose_name="Цвет",null=True, blank=True,max_length=150)
  502.  
  503.     region = models.CharField(verbose_name="Регион",null=True, blank=True,max_length=150)
  504.     town = models.CharField(verbose_name="Город",null=True, blank=True,max_length=150)
  505.     district = models.CharField('Район',null=True,blank=True, max_length=150)
  506.     postal_code = models.CharField('Индекс почтовый', blank=True,null=True,max_length=6)
  507.     building = models.CharField('Дом №', max_length=100, blank=True, null=True, default='')
  508.     street = models.CharField(max_length=100, null=True, blank=True, verbose_name='Улица',)
  509.     flat = models.CharField('Квартира №', blank=True,null=True, max_length=10)
  510.  
  511.     phone_number = models.CharField('Номер телефона', max_length=12, default=None)
  512.     email = models.CharField('Почта', max_length=170, default=None)
  513.     paid = models.BooleanField('Оплачен?', default=False)
  514.     submitted = models.DateTimeField(blank=True, null=True)
  515.     created = models.DateTimeField(auto_now_add=True)
  516.     updated = models.DateTimeField(auto_now=True)
  517.  
  518.     class Meta:
  519.         verbose_name = "Заказ"
  520.         verbose_name_plural = "Заказы"
  521.         ordering = ('-created',)
  522.    
  523.     def __str__(self):
  524.         return f'{self.id} {self.pacient} { "PAID" if self.paid else "NO paid"}'
  525.  
  526.     def to_json(self):
  527.         return model_to_dict(self)
  528.     class Meta:
  529.         verbose_name = "Заказ через сайт"
  530.         verbose_name_plural = "Заказ через сайт"
  531.         db_table = 'order'
  532.  
  533.  
  534. class Orders_Operations(models.Model):
  535.     status = models.CharField('Статус заказа', max_length=128)
  536.     surname = models.CharField('Фамилия', max_length=32, db_index=True)
  537.     name = models.CharField('Имя', max_length=32)
  538.     patronymic = models.CharField('Отчество', max_length=32)
  539.     type_devise = models.ForeignKey(Device, on_delete=models.SET_NULL, null = True)
  540.     color = models.CharField(verbose_name="Цвет",null=True, blank=True,max_length=150)
  541.  
  542.     region = models.CharField(verbose_name="Регион",null=True, blank=True,max_length=150)
  543.     town = models.CharField(verbose_name="Город",null=True, blank=True,max_length=150)
  544.     district = models.CharField('Район',null=True,blank=True, max_length=150)
  545.     postal_code = models.CharField('Индекс почтовый', blank=True,null=True,max_length=6)
  546.     building = models.CharField('Дом №', max_length=100, blank=True, null=True, default='')
  547.     street = models.CharField(max_length=100, null=True, blank=True, verbose_name='Улица',)
  548.     flat = models.CharField('Квартира №', blank=True,null=True, max_length=10)
  549.  
  550.     phone_number = models.CharField('Номер телефона', max_length=12, default=None)
  551.     email = models.CharField('Почта', max_length=170, default=None)
  552.     paid = models.BooleanField('Оплачен', default=False)
  553.     sent = models.BooleanField('Отправлен', default=False)
  554.     сonfirmed = models.BooleanField('Подтверждён', default=False)
  555.     submitted = models.DateTimeField(blank=True, null=True)
  556.     created = models.DateTimeField(auto_now_add=True)
  557.     updated = models.DateTimeField(auto_now=True)
  558.    
  559.     def to_json(self):
  560.         return model_to_dict(self)
  561.  
  562.     def __str__(self):
  563.         return f'{self.phone_number if self.phone_number else self.email} { "PAID" if self.paid else "NO paid"}'
  564.  
  565.     def sent_order(id_order, id_device):
  566.         order = Orders_Operations.objects.get(id = id_order)
  567.         order.sent = True
  568.         order.save()
  569.         device = Device.objects.get(id = id_device)
  570.         Leftovers_Devices.decrement(device)
  571.  
  572.     def paid_product_user(id_order):
  573.         order = Orders_Operations.objects.get(id = id_order)
  574.         order.paid = True
  575.         order.save()
  576.  
  577.     @property
  578.     def get_address_person(self):
  579.         str_addr = ''
  580.         if self.region:
  581.             str_addr += str(self.region) + ', '
  582.         if self.town:
  583.             str_addr += str(self.town) + ', '
  584.         if self.street:
  585.             str_addr += str(self.street) + ', '
  586.         if self.building:
  587.             str_addr +=  'дом' +str(self.building) + ', '
  588.         if self.flat:
  589.             str_addr += 'кв №' + str(self.flat) + ' '
  590.        
  591.         return str_addr
  592.     class Meta:
  593.         ordering = ('-created',)
  594.         verbose_name = "Заказ через оператора"
  595.         verbose_name_plural = "Заказ через оператора"
  596.         db_table = 'orders_operations'
  597.  
  598. class Permissions_Patient(models.Model):
  599.     name = models.CharField('Название', max_length=64)
  600.  
  601.     def __str__(self):
  602.         return self.name
  603.  
  604.     class Meta:
  605.         verbose_name = "Права на сайте"
  606.         verbose_name_plural = "Права на сайте"
  607.         db_table = 'permissions_patient'
  608.  
  609. class Tarifs(models.Model):
  610.     name = models.CharField('Название тарифа', max_length=64)
  611.     cost = models.PositiveIntegerField('Цена')
  612.     permission = models.ManyToManyField(Permissions_Patient, verbose_name="Права по тарифу")
  613.     slug = models.SlugField(max_length=150, null = True,  default='')
  614.     title = models.CharField('Заголовок', max_length=356,  default='')
  615.     description = models.TextField('Описание', null = True,  default='')
  616.  
  617.     def __str__(self):
  618.         return self.name
  619.  
  620.     def get_absolute_url(self):
  621.         return reverse('tarif_set', args=[str(self.slug)])
  622.  
  623.     class Meta:
  624.         verbose_name = "Тарифы"
  625.         verbose_name_plural = "Тариф"
  626.         db_table = 'tarifs'
  627.  
  628. class Subscription(models.Model):
  629.     CHOICES_MOUNTH = (
  630.         ('1', '1'),
  631.         ('6', '6'),
  632.         ('12', '12'),
  633.     )
  634.  
  635.     user = models.ForeignKey(Patient, related_name='subscription', verbose_name='Пациент', on_delete=models.SET_NULL, null = True)
  636.     tarif = models.ForeignKey(Tarifs, verbose_name='Тариф', on_delete=models.SET_NULL, null = True)
  637.     subscription_date = models.DateTimeField("Дата оформления подписки", default=timezone.now, db_index=True)
  638.     subscription_end_date = models.DateTimeField("Конец подписки", default=datetime.today() + timedelta(1*365/12), db_index=True)
  639.     duration = models.CharField(max_length=12, choices=CHOICES_MOUNTH , default="1")
  640.     status = models.BooleanField("Статуc подписки: ", default = False)
  641.  
  642.     def create_subscription(user, tarif):
  643.         sub_user = Subscription.objects.create(
  644.             user = user,
  645.             tarif = tarif,
  646.             status = True
  647.         )
  648.         bil_account = BillingAccount.objects.get(user = user)
  649.         bil_account.paymant_operation(tarif.cost)
  650.  
  651.     def __str__(self):
  652.         return f"{self.user} {self.tarif}"
  653.    
  654.     class Meta:
  655.         verbose_name = "Подписка"
  656.         verbose_name_plural = "Подписки"
  657.  
  658. class HistoryBalance(models.Model):
  659.     amount = models.FloatField('Сумма операции')
  660.     current_amount = models.FloatField('Сумма текущего счёта')
  661.     write_off = models.BooleanField('Снята ли блокировка с текущей суммы', default=False)
  662.     billing_account = models.ForeignKey('BillingAccount', verbose_name= 'Пользователь', on_delete=models.CASCADE)
  663.     datetime_create = models.DateTimeField('Дата создания операции',default=timezone.now, db_index=True)
  664.  
  665.     def __str__(self):
  666.         return f"{self.billing_account} {self.amount}"
  667.  
  668.     class Meta:
  669.         verbose_name = "История счёта"
  670.         verbose_name_plural = "История счёта"
  671.         db_table = 'historybalance'
  672.  
  673. class BillingAccount(models.Model):
  674.     user = models.ForeignKey(Patient,related_name='bil_pacient_account', on_delete=models.SET_NULL, null = True)
  675.     datetime_create = models.DateTimeField('Дата создания аккаунта',default=timezone.now, db_index=True)
  676.     amount = models.FloatField('Cумма на счету', default=0, null=False)
  677.  
  678.     def __str__(self):
  679.         return f"{self.user} {self.amount}"
  680.  
  681.     def paymant_operation(self, amount):
  682.         history = HistoryBalance.objects.create(
  683.             current_amount = self.amount,
  684.             amount = amount,
  685.             write_off = True,
  686.             billing_account = self
  687.         )
  688.         self.amount = self.amount - amount
  689.         self.save()
  690.  
  691.     def check_status_amount(pacient_id):
  692.         """Проверка суммы для списания со счёта !"""
  693.         count = 0
  694.         block_amount = Block_amount.objects.filter(write_off = False, billing_account__user = pacient_id)
  695.         for amount in block_amount:
  696.             count += amount.amount
  697.         total_amount = BillingAccount.objects.get(user__id = pacient_id).amount- count > 0
  698.         return total_amount
  699.  
  700.     def block_amount(self, amount):
  701.         """Блокирование суммы для дальнейшего списания"""
  702.         Block_amount.objects.create(billing_account = self, amount = amount, write_off = False)
  703.  
  704.     def take_away_block_amount(self):
  705.         """отмена заблокированной суммы !"""
  706.         block_amount = Block_amount.objects.get(id = self.id)
  707.         block_amount.write_off = True
  708.         block_amount.save()
  709.  
  710.     def get_summ_in_account(self):
  711.         return self.amount
  712.     class Meta:
  713.         verbose_name = "Счёт пациентнов"
  714.         verbose_name_plural = "Счёт пациента"
  715.         db_table = 'billingaccount'
  716.  
  717. class Block_amount(models.Model):
  718.     amount = models.FloatField('Сумма для блокировки аккаунта')
  719.     write_off = models.BooleanField('Снята ли блокировка с текущей суммы', default=False)
  720.     billing_account = models.ForeignKey(BillingAccount, verbose_name= 'Пользователь с заблокированной суммой', on_delete=models.CASCADE)
  721.     datetime_block = models.DateTimeField('Дата блокировки',default=timezone.now, db_index=True)
  722.  
  723.     def __str__(self):
  724.         return f"{self.billing_account} {self.amount}"
  725.  
  726.     class Meta:
  727.         verbose_name = "Блокировка счёта"
  728.         verbose_name_plural = "Блокировка счёта"
  729.         db_table = 'block_amount'
  730.  
  731. @receiver(post_save, sender=Patient)
  732. def save_or_create_account(sender, instance, created, **kwargs):
  733.     if created:
  734.         BillingAccount.objects.create(user=instance, amount = 290)
  735.     else:
  736.         try:
  737.             bl_acc = BillingAccount.objects.get(user=instance)
  738.             bl_acc.save()
  739.         except ObjectDoesNotExist:
  740.             BillingAccount.objects.create(user=instance)
  741.  
  742. class Attachment_phys(models.Model):
  743.     """Прикрепление физ.лиц"""
  744.     recording_time = models.DateTimeField('Время записи', blank=False, null=True)
  745.     pacient = models.ForeignKey(Patient, related_name='pacient', verbose_name='Пациент', on_delete=models.CASCADE)
  746.     connected_pacients = models.ForeignKey(Patient, related_name='connected', verbose_name='Физ.лица', on_delete=models.CASCADE)
  747.  
  748.     confirmation_connected = models.BooleanField('Подтверждение Физ.лица', default=False)
  749.     confirmation_pacient = models.BooleanField('Подтверждение пациента', default=False)
  750.     refusal = models.BooleanField('Отказ', default=False)
  751.  
  752.     def __str__(self):
  753.         return str(self.pacient) + ' - ' + str(self.connected_pacients)
  754.  
  755.     def save(self, *args, **kwargs):
  756.         super(Attachment_phys, self).save(*args, **kwargs)
  757.    
  758.     class Meta:
  759.         verbose_name = "Прикрепление физ.лиц"
  760.         verbose_name_plural = "Прикрепление физ.лиц"
  761.        
  762. class Attachment_entity(models.Model):
  763.     """Прикрепление физ.лиц"""
  764.     recording_time = models.DateTimeField('Время записи', blank=False, null=True)
  765.     pacient_entity = models.ForeignKey(Patient, related_name='pacient_entity', verbose_name='Пациент', on_delete=models.CASCADE)
  766.     connected_pacients_entity = models.ForeignKey(Entity, related_name='connected_entity', verbose_name='Юр.лица', on_delete=models.CASCADE)
  767.  
  768.     confirmation_connected = models.BooleanField('Подтверждение Юр.лица', default=False)
  769.     confirmation_pacient = models.BooleanField('Подтверждение пациента', default=False)
  770.     refusal = models.BooleanField('Отказ', default=False)
  771.  
  772.     def __str__(self):
  773.         return str(self.pacient) + ' - ' + str(self.connected_pacients)
  774.  
  775.     def save(self, *args, **kwargs):
  776.         super(Attachment_entity, self).save(*args, **kwargs)
  777.  
  778.  
  779.     class Meta:
  780.         db_table= 'attachment_entity'
  781.         verbose_name = 'Запрос на прикрепление к пациенту'
  782.         verbose_name_plural = 'Запросы на прикрепления к пациентам'
  783.  
  784. class Trusted_persons(models.Model):
  785.     phone_regex = RegexValidator(regex=r'^\+7\d{11}$')
  786.     user = models.ForeignKey(Patient, on_delete=models.SET_NULL, null = True)
  787.     surname = models.CharField('Фамилия', max_length=32,null = True, db_index=True)
  788.     name = models.CharField('Имя', max_length=32,null = True)
  789.     patronymic = models.CharField('Отчество', max_length=32,null = True)
  790.     comments = models.CharField('Комментарий', max_length=250, null = True)
  791.     relatives_phone_number = models.CharField('Номер телефона доверенного лица', validators=[phone_regex], max_length=12, blank=True)
  792.     hidden = models.BooleanField('Скрыть запись', default=False)
  793.  
  794.     def __str__(self):
  795.         return f'{self.user}'
  796.  
  797.     class Meta:
  798.         verbose_name = "Доверенные лица"
  799.         verbose_name_plural = "Доверенное лицо"
  800.         db_table = 'trusted_persons'
  801.  
  802. class CriticalValue(models.Model):
  803.     content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
  804.     object_id = models.PositiveIntegerField()
  805.     content_object = GenericForeignKey('content_type', 'object_id')
  806.     connect = models.DateTimeField('Дата формирования записи', default=timezone.now)
  807.     user = models.ForeignKey(Patient, on_delete=models.SET_NULL, null = True)
  808.     measures = models.BooleanField('Обработан', default=False)
  809.  
  810.     def __str__(self):
  811.         return f'{self.user} {self.content_type} {self.user}'
  812.  
  813.     def get_measures_filter(id_pacien):
  814.         if ArchiveCriticalValue.objects.filter(critical_values__user = id_pacien).exists():
  815.             list_cr = ArchiveCriticalValue.objects.filter(critical_values__user = id_pacien).last()
  816.             block_time =  datetime.strftime(list_cr.date_time_create + timedelta(minutes = 2),'%Y-%m-%d %H:%M:%S')
  817.             now = datetime.strftime(datetime.now(),'%Y-%m-%d %H:%M:%S')
  818.             if datetime.strptime(str(block_time),'%Y-%m-%d %H:%M:%S') < datetime.strptime(str(now),'%Y-%m-%d %H:%M:%S'):
  819.                 return False
  820.             else:
  821.                 return True
  822.         return False
  823.  
  824.     def get_values():
  825.         critical_list = []
  826.         cr_v = CriticalValue.objects.filter(connect__date = datetime.today().date())
  827.         for cr in cr_v:
  828.             get_list = cr.content_object.get_params()
  829.             get_list['id_cr_values'] = cr.id
  830.             get_list['connect'] = cr.connect
  831.             critical_list.append(get_list)
  832.         return critical_list
  833.  
  834.     def get_values_for_pacient(user, o_time=None):
  835.         critical_list = []
  836.         for cr in CriticalValue.objects.filter(connect__date = datetime.today().date(), user = user,measures=False):
  837.             now = datetime.strftime(datetime.now(),'%Y-%m-%d %H:%M:%S')
  838.             if o_time:
  839.                 if datetime.strptime(str(o_time),'%Y-%m-%d %H:%M:%S') < datetime.strptime(str(now),'%Y-%m-%d %H:%M:%S'):
  840.                     cr.measures = True
  841.                     cr.save()
  842.             get_list = cr.content_object.get_params()
  843.             get_list['id_cr_values'] = cr.id
  844.             get_list['connect'] = cr.connect
  845.             critical_list.append(get_list)
  846.         return critical_list
  847.    
  848.     class Meta:
  849.         verbose_name = "Критическое значение"
  850.         verbose_name_plural = "Критические значения"
  851.  
  852.  
  853. class ArchiveCriticalValue(models.Model):
  854.     date_time_create = models.DateTimeField('Время формирования записи')
  855.     critical_values = models.ForeignKey(CriticalValue,related_name='archive_values', verbose_name='Критический показатель', on_delete=models.CASCADE)
  856.     subject_of_communication = models.CharField('Предмет общения', blank=True, max_length=255)
  857.     action_taken = models.CharField('Cовершённое действие', blank=True, max_length=255)
  858.     date_time_communication = models.DateTimeField('Дата и время обращения оператора к пациенту')
  859.     talk_time_start = models.DateTimeField('Начало разговора')
  860.     talk_time_end = models.DateTimeField('Конец разговора')
  861.  
  862.     def __str__(self):
  863.         return f'Архив {self.critical_values.user.name} {self.critical_values.user.surname} {self.critical_values.user.patronymic} {self.date_time_create}'
  864.  
  865.    
  866.     def to_json(self):
  867.         return model_to_dict(self)
  868.  
  869.     def create_values(id_critical_value, talk_time_start, talk_time_end):
  870.         cr_v = CriticalValue.objects.get(id = id_critical_value)
  871.         archive = ArchiveCriticalValue.objects.create(
  872.                 date_time_create=get_time_to_city(cr_v.user.residence_address.town.time_shifting),
  873.                 critical_values=cr_v,
  874.                 talk_time_start = talk_time_start,
  875.                 talk_time_end = talk_time_end,
  876.                 date_time_communication = get_time_to_city(cr_v.user.residence_address.town.time_shifting)
  877.             )
  878.         cr_v.measures= True
  879.         cr_v.save()
  880.         archive.save()
  881.         json_data = archive.to_json()
  882.  
  883.         json_data['date_time_create'] = archive.date_time_create.strftime('%Y-%m-%d %H:%M:%s')
  884.         json_data['date_time_communication'] = archive.date_time_communication.strftime('%Y-%m-%d %H:%M:%s')
  885.         # json_data['talk_time_start'] = archive.talk_time_start#.strftime('%Y-%m-%d %H:%M:%S')
  886.         # json_data['talk_time_end'] = archive.talk_time_end#.strftime('%Y-%m-%d %H:%M:%S')
  887.         return json_data
  888.  
  889.     class Meta:
  890.         db_table = 'archive_critical_values'
  891.         verbose_name = 'Архив критических значений'
  892.         verbose_name_plural = 'Архив критических значений'
  893.  
  894.  
  895. class Post(models.Model):
  896.     title = models.CharField('Заголовок',max_length = 256)
  897.     body = models.TextField('Статья')
  898.     previes = models.TextField('Превью',null=True)
  899.     publish = models.DateTimeField('Дата публикации',default = timezone.now)
  900.     created = models.DateTimeField(auto_now_add = True)
  901.     updated = models.DateTimeField(auto_now = True)
  902.  
  903.     def __str__(self):
  904.         return self.title
  905.  
  906.     class Meta:
  907.         verbose_name = 'Новости'
  908.         verbose_name_plural = 'Новости'
  909.  
  910. # @receiver(post_save, sender=Patient)
  911. # def save_or_create_subscription(sender, instance, created, **kwargs):
  912. #     if created:
  913. #         Subscription.objects.create(user=instance)
  914. #     else:
  915. #         try:
  916. #             sub_acc = Subscription.objects.get(user=instance)
  917. #             sub_acc.save()
  918. #         except ObjectDoesNotExist:
  919. #             Subscription.objects.create(user=instance)
  920.  
  921. class Leftovers_Devices(models.Model):
  922.     type_device = models.ForeignKey(Device, on_delete=models.SET_NULL, null = True)
  923.     count = models.PositiveIntegerField('Кол-во', default = 0)
  924.  
  925.     def decrement(type_device):
  926.         leftovers = Leftovers_Devices.objects.get(type_device = type_device)
  927.         leftovers.count -= 1
  928.         leftovers.save()
  929.  
  930.     def __str__(self):
  931.         return f'{self.type_device} {self.count}шт'
  932.    
  933.     class Meta:
  934.         verbose_name = 'Таблица остатков'
  935.         verbose_name_plural = 'Таблица остатков'
  936.  
  937. class Receipts_Devices(models.Model):
  938.     type_device = models.ForeignKey(Device, on_delete=models.SET_NULL, null = True)
  939.     date = models.DateTimeField('Дата поступления')
  940.     count = models.PositiveIntegerField('Кол-во')
  941.     new = models.BooleanField('Новое поступление', default=True)
  942.     re_take = models.BooleanField('Возврат', default=False)
  943.     comment = models.TextField('Комментарий', default='')
  944.  
  945.     def save(self, *args, **kwargs):
  946.         leftovers, created = Leftovers_Devices.objects.get_or_create(type_device = self.type_device, defaults = {'type_device': self.type_device, 'count': 0})
  947.         leftovers.count += self.count
  948.         leftovers.save()
  949.         super(Receipts_Devices, self).save(*args, **kwargs)
  950.  
  951.     def __str__(self):
  952.         return f'{self.date} {self.type_device} {self.count}шт'
  953.    
  954.     class Meta:
  955.         verbose_name = 'Таблица поступленийй'
  956.         verbose_name_plural = 'Таблица поступлений'
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement