334 lines
8.3 KiB
Python
334 lines
8.3 KiB
Python
from django.db import models
|
|
from django.urls import reverse
|
|
|
|
INDEPENDENT = 'IN'
|
|
ASSISTED = 'AS'
|
|
TOTALLY_DEPENDENT = 'DE'
|
|
|
|
ASSISTANCE_CHOICES = [
|
|
(INDEPENDENT, 'Independent'),
|
|
(ASSISTED, 'Assisted'),
|
|
(TOTALLY_DEPENDENT, 'Totally dependent'),
|
|
]
|
|
|
|
class Chart(models.Model):
|
|
class Meta:
|
|
ordering = ('-created_at',)
|
|
|
|
patient = models.CharField(max_length=250)
|
|
assignment = models.CharField(max_length=250)
|
|
student_name = models.CharField(max_length=250)
|
|
student_id = models.CharField(max_length=250)
|
|
|
|
created_at = models.DateTimeField(auto_now_add=True)
|
|
updated_at = models.DateTimeField(auto_now=True)
|
|
|
|
def get_absolute_url(self):
|
|
return reverse('chart-detail', kwargs={'pk': self.pk})
|
|
|
|
def __str__(self):
|
|
return f"Chart {self.pk}, for {self.patient}"
|
|
|
|
class Entry(models.Model):
|
|
class Meta:
|
|
ordering = ('time',)
|
|
verbose_name_plural = 'entries'
|
|
|
|
time = models.TimeField()
|
|
chart = models.ForeignKey(Chart, on_delete=models.CASCADE)
|
|
notes = models.TextField(blank=True)
|
|
|
|
created_at = models.DateTimeField(auto_now_add=True)
|
|
updated_at = models.DateTimeField(auto_now=True)
|
|
|
|
def get_absolute_url(self):
|
|
return reverse('chart-detail', kwargs={'pk': self.chart_id})
|
|
|
|
def __str__(self):
|
|
return f"{self.time}"
|
|
|
|
|
|
class OralCare(Entry):
|
|
class Meta:
|
|
verbose_name_plural = 'oral care'
|
|
|
|
assistance = models.CharField(
|
|
max_length=2,
|
|
choices=ASSISTANCE_CHOICES,
|
|
default=INDEPENDENT,
|
|
blank=True
|
|
)
|
|
|
|
dentures_upper = models.BooleanField(default=False)
|
|
dentures_lower = models.BooleanField(default=False)
|
|
|
|
class Bathing(Entry):
|
|
class Meta:
|
|
verbose_name_plural = 'bathing'
|
|
|
|
METHOD_CHOICES = [
|
|
('SH', 'Shower'),
|
|
('TU', 'Tub'),
|
|
('PA', 'Partial'),
|
|
('BB', 'Bed bath'),
|
|
('SP', 'Specialty'),
|
|
]
|
|
method = models.CharField(
|
|
max_length=2,
|
|
choices=METHOD_CHOICES,
|
|
blank=True
|
|
)
|
|
method_other = models.CharField(max_length=250, blank=True)
|
|
assistance = models.CharField(
|
|
max_length=2,
|
|
choices=ASSISTANCE_CHOICES,
|
|
default=INDEPENDENT,
|
|
blank=True
|
|
)
|
|
|
|
class Toileting(Entry):
|
|
assistance = models.CharField(
|
|
max_length=2,
|
|
choices=ASSISTANCE_CHOICES,
|
|
default=INDEPENDENT,
|
|
blank=True
|
|
)
|
|
|
|
TOILETING_METHOD_CHOICES = [
|
|
('CO', 'Commode'),
|
|
('BP', 'Bed pan'),
|
|
('CA', 'Catheter'),
|
|
]
|
|
method = models.CharField(
|
|
max_length=2,
|
|
choices=TOILETING_METHOD_CHOICES,
|
|
blank=True
|
|
)
|
|
|
|
brief_change = models.BooleanField(default=False)
|
|
perineal_care = models.BooleanField(default=False)
|
|
catheter_care = models.BooleanField(default=False)
|
|
|
|
|
|
class Dressing(Entry):
|
|
DRESSING_TIME_CHOICES = [
|
|
('AM', 'Morning'),
|
|
('PM', 'Evening'),
|
|
]
|
|
|
|
time_of_day = models.CharField(
|
|
max_length=2,
|
|
choices=DRESSING_TIME_CHOICES,
|
|
blank=True
|
|
)
|
|
|
|
assistance = models.CharField(
|
|
max_length=2,
|
|
choices=ASSISTANCE_CHOICES,
|
|
default=INDEPENDENT,
|
|
blank=True
|
|
)
|
|
|
|
|
|
class Meal(Entry):
|
|
KIND_CHOICES = [
|
|
('BR', 'Breakfast'),
|
|
('LU', 'Lunch'),
|
|
('DI', 'Dinner'),
|
|
('SN', 'Snack'),
|
|
]
|
|
kind = models.CharField(
|
|
max_length=2,
|
|
choices=KIND_CHOICES,
|
|
blank=True
|
|
)
|
|
amount_consumed = models.FloatField(blank=True, null=True)
|
|
|
|
|
|
class RangeOfMotion(Entry):
|
|
MOTION_KIND_CHOICES = [
|
|
('PA', 'Passive'),
|
|
('AC', 'Active'),
|
|
('CO', 'Combination'),
|
|
]
|
|
motion_kind = models.CharField(
|
|
max_length=2,
|
|
choices=MOTION_KIND_CHOICES,
|
|
blank=True
|
|
)
|
|
antiembolic_stockings = models.BooleanField(default=False)
|
|
turn_or_position_change = models.BooleanField(default=False)
|
|
|
|
class Ambulation(Entry):
|
|
METHOD_CHOICES = [
|
|
('CH', 'Chair'),
|
|
('RO', 'Up in room'),
|
|
('HA', 'Ambulate in hall'),
|
|
('PT', 'To PT'),
|
|
]
|
|
method = models.CharField(
|
|
max_length=2,
|
|
choices=METHOD_CHOICES,
|
|
blank=True
|
|
)
|
|
|
|
ASSISTANCE_CHOICES = [
|
|
('IN', 'Independent'),
|
|
('ON', 'One assist with gait belt'),
|
|
('TW', 'Two assist'),
|
|
('LI', 'Lift'),
|
|
]
|
|
assistance = models.CharField(
|
|
max_length=2,
|
|
choices=ASSISTANCE_CHOICES,
|
|
blank=True
|
|
)
|
|
DEVICES_USED_CHOICES = [
|
|
('WA', 'Walker'),
|
|
('CR', 'Crutches'),
|
|
('WH', 'Wheelchair'),
|
|
]
|
|
devices_used = models.CharField(
|
|
max_length=2,
|
|
choices=DEVICES_USED_CHOICES,
|
|
blank=True
|
|
)
|
|
|
|
|
|
class Vitals(Entry):
|
|
o2_saturation = models.PositiveIntegerField(blank=True, null=True)
|
|
temperature = models.FloatField(blank=True, null=True)
|
|
TEMPERATURE_UNITS_CHOICES = [
|
|
('CE', 'C'),
|
|
('FA', 'F'),
|
|
]
|
|
temperature_units = models.CharField(
|
|
max_length=2,
|
|
choices=TEMPERATURE_UNITS_CHOICES,
|
|
default='FA',
|
|
blank=True,
|
|
null=True
|
|
)
|
|
pulse = models.IntegerField(blank=True, null=True)
|
|
respirations = models.IntegerField(blank=True, null=True)
|
|
blood_pressure_systolic = models.IntegerField(blank=True, null=True)
|
|
blood_pressure_diastolic = models.IntegerField(blank=True, null=True)
|
|
|
|
weight = models.FloatField(blank=True, null=True)
|
|
|
|
WEIGHT_UNITS_CHOICES = [
|
|
('LB', 'LBS'),
|
|
('KG', 'KG'),
|
|
]
|
|
weight_units = models.CharField(
|
|
max_length=2,
|
|
choices=WEIGHT_UNITS_CHOICES,
|
|
default='LB',
|
|
blank=True,
|
|
null=True
|
|
)
|
|
|
|
|
|
class FluidIntake(Entry):
|
|
fluid_type = models.CharField(max_length=100)
|
|
intake_amount = models.PositiveIntegerField()
|
|
npo = models.BooleanField(default=False)
|
|
|
|
|
|
class Urine(Entry):
|
|
URINE_COLOR_CHOICES = [
|
|
('YE', 'Yellow'),
|
|
('DA', 'Dark yellow'),
|
|
('BR', 'Brown'),
|
|
]
|
|
assistance = models.CharField(
|
|
max_length=2,
|
|
choices=ASSISTANCE_CHOICES,
|
|
default=INDEPENDENT,
|
|
blank=True
|
|
)
|
|
color = models.CharField(
|
|
max_length=2,
|
|
choices=URINE_COLOR_CHOICES,
|
|
blank=True
|
|
)
|
|
amount = models.PositiveIntegerField()
|
|
|
|
class Emesis(Entry):
|
|
amount = models.PositiveIntegerField()
|
|
color = models.CharField(max_length=100, blank=True)
|
|
|
|
class BowelMovement(Entry):
|
|
assistance = models.CharField(
|
|
max_length=2,
|
|
choices=ASSISTANCE_CHOICES,
|
|
default=INDEPENDENT,
|
|
blank=True
|
|
)
|
|
AMOUNT_CHOICES = [
|
|
('SM', 'Small'),
|
|
('MD', 'Moderate'),
|
|
('LG', 'Large'),
|
|
]
|
|
amount = models.CharField(
|
|
max_length=2,
|
|
choices=AMOUNT_CHOICES,
|
|
blank=True
|
|
)
|
|
color = models.CharField(max_length=100, blank=True)
|
|
CONSISTENCY_CHOICES = [
|
|
('SO', 'Soft'),
|
|
('HD', 'Hard'),
|
|
('LQ', 'Liquid'),
|
|
('FM', 'Formed'),
|
|
('SF', 'Soft and formed'),
|
|
]
|
|
consistency = models.CharField(
|
|
max_length=2,
|
|
choices=CONSISTENCY_CHOICES,
|
|
blank=True
|
|
)
|
|
|
|
class PainLevel(Entry):
|
|
score = models.PositiveIntegerField(blank=True, null=True)
|
|
reported_to_nurse = models.BooleanField(default=False)
|
|
|
|
|
|
class OxygenLevel(Entry):
|
|
oxygen_level = models.FloatField(blank=True, null=True)
|
|
DELIVERY_METHOD_CHOICES = [
|
|
('NA', 'Per nasal cannula'),
|
|
('MA', 'Per mask'),
|
|
('RE', 'Refused to wear'),
|
|
]
|
|
delivery_method = models.CharField(
|
|
max_length=2,
|
|
choices=DELIVERY_METHOD_CHOICES,
|
|
blank=True
|
|
)
|
|
|
|
|
|
class Restraint(Entry):
|
|
RESTRAINTS_USED_CHOICES = [
|
|
('TW', 'Side rails x2'),
|
|
('FO', 'Side rails x4'),
|
|
('NO', 'None'),
|
|
]
|
|
restraints_used = models.CharField(
|
|
max_length=2,
|
|
choices=RESTRAINTS_USED_CHOICES,
|
|
blank=True
|
|
)
|
|
restraints_soft = models.BooleanField(default=False)
|
|
|
|
|
|
class Safety(Entry):
|
|
call_light_in_reach = models.BooleanField(default=False)
|
|
bed_low = models.BooleanField(default=False)
|
|
brakes_on = models.BooleanField(default=False)
|
|
falls = models.CharField(max_length=999, blank=True)
|
|
nausea = models.CharField(max_length=999, blank=True)
|
|
vomiting = models.CharField(max_length=999, blank=True)
|
|
confusion = models.CharField(max_length=999, blank=True)
|
|
combative = models.CharField(max_length=999, blank=True)
|