ba-thesis/app/medwings/models.py

124 lines
5.4 KiB
Python

from django.db import models
from django.contrib.auth.models import User
from . import validators
class Profile(models.Model):
SEX_FEMALE = "F"
SEX_MALE = "M"
SEX_CHOICES = [
(SEX_FEMALE, "Female"),
(SEX_MALE, "Male")
]
user = models.OneToOneField(User, on_delete=models.CASCADE, primary_key=True)
date_of_birth = models.DateField(validators=[validators.PersonValidator.date_of_birth], verbose_name="Date of birth")
sex = models.CharField(max_length=1, choices=SEX_CHOICES, verbose_name="Sex assigned at birth")
class BloodPressureRecord(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
recorded = models.DateTimeField(validators=[validators.BloodPressureRecordValidator.recorded], unique=True, verbose_name="Time at which measurement was taken")
value_systolic_mmhg = models.PositiveIntegerField(validators=[validators.BloodPressureRecordValidator.value_systolic_mmhg], verbose_name="Systolic Blood Pressure (mmhg)")
value_diastolic_mmhg = models.PositiveIntegerField(validators=[validators.BloodPressureRecordValidator.value_diastolic_mmhg], verbose_name="Diastolic Blood Pressure (mmhg)")
class BodyTempRecord(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
recorded = models.DateTimeField(validators=[validators.BodyTempRecordValidator.recorded], unique=True, verbose_name="Time at which measurement was taken")
value_celsius = models.DecimalField(max_digits=5, decimal_places=2, validators=[validators.BodyTempRecordValidator.value_celsius], unique=True, verbose_name="Body Temperature (\u00B0C)")
class HeartRateRecord(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
recorded = models.DateTimeField(validators=[validators.HeartRateRecordValidator.recorded], unique=True, verbose_name="Time at which measurement was taken")
value_bpm = models.PositiveIntegerField(validators=[validators.HeartRateRecordValidator.value_bpm], verbose_name="Heart Rate (bpm)")
class Spo2LevelRecord(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
recorded = models.DateTimeField(validators=[validators.Spo2LevelRecordValidator.recorded], unique=True, verbose_name="Time at which measurement was taken")
value_percent = models.PositiveIntegerField(validators=[validators.Spo2LevelRecordValidator.value_percent], verbose_name="SPO2 (\u0025)")
class RespirationScoreRecord(models.Model):
SEVERITY_NONE = 0
SEVERITY_LOW = 1
SEVERITY_HIGH = 2
SEVERITY_CHOICES = [
(SEVERITY_NONE, "No shortness of breath"),
(SEVERITY_LOW, "A little shortness of breath"),
(SEVERITY_HIGH, "Severe shortness of breath"),
]
user = models.ForeignKey(User, on_delete=models.CASCADE)
recorded = models.DateTimeField(validators=[validators.RespirationScoreRecordValidator.recorded], unique=True, verbose_name="Time at which measurement was taken")
value_severity = models.PositiveIntegerField(choices=SEVERITY_CHOICES, validators=[validators.RespirationScoreRecordValidator.value_severity], verbose_name="Shortness Of Breath Severity")
class MewsRecord(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
recorded = models.DateTimeField(validators=[validators.MewsRecordValidator.recorded], unique=True, verbose_name="Time at which measurement was calculated")
value_n = models.PositiveIntegerField(validators=[validators.MewsRecordValidator.value_n], verbose_name="Modified Early Warning Score")
blood_pressure_record = models.ForeignKey(BloodPressureRecord, on_delete=models.CASCADE)
body_temp_record = models.ForeignKey(BodyTempRecord, on_delete=models.CASCADE)
heart_rate_record = models.ForeignKey(HeartRateRecord, on_delete=models.CASCADE)
spo2_level_record = models.ForeignKey(Spo2LevelRecord, on_delete=models.CASCADE)
respiration_score_record = models.ForeignKey(RespirationScoreRecord, on_delete=models.CASCADE)
@staticmethod
def calculate_mews_value(
blood_pressure_systolic_value_mmhg: int,
body_temp_value_celsius: float,
heart_rate_value_bpm: int,
spo2_level_value_percent: int,
respiration_score_value_severity: int,
):
mews_value = 0
if blood_pressure_systolic_value_mmhg <= 70:
mews_value += 3
elif blood_pressure_systolic_value_mmhg <= 80:
mews_value += 2
elif blood_pressure_systolic_value_mmhg <= 100:
mews_value += 1
elif blood_pressure_systolic_value_mmhg < 200:
mews_value += 0
else:
mews_value += 2
if heart_rate_value_bpm < 40:
mews_value += 2
elif heart_rate_value_bpm <= 50:
mews_value += 1
elif heart_rate_value_bpm <= 100:
mews_value += 0
elif heart_rate_value_bpm <= 110:
mews_value += 1
elif heart_rate_value_bpm < 130:
mews_value += 2
else:
mews_value += 3
if respiration_score_value_severity == 1:
mews_value += 1
elif respiration_score_value_severity == 2:
mews_value += 2
if spo2_level_value_percent < 90:
mews_value += 2
elif spo2_level_value_percent < 95:
mews_value += 1
if body_temp_value_celsius < 35:
mews_value += 2
elif body_temp_value_celsius <= 38.4:
mews_value += 0
else:
mews_value += 2
return mews_value