124 lines
5.4 KiB
Python
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
|