381 lines
12 KiB
Python
381 lines
12 KiB
Python
import json
|
|
from django.db import models
|
|
|
|
from module_iam.models import BaseModel, IAmPrincipal
|
|
|
|
|
|
class FoodIngredintDataset(models.Model):
|
|
food_name = models.CharField(max_length=100)
|
|
ingredients = models.JSONField(default=list)
|
|
|
|
class Meta:
|
|
db_table = "food_ingredient_dataset"
|
|
|
|
def set_ingredients(self, x):
|
|
self.ingredients = json.dumps(x)
|
|
|
|
def get_ingredients(self):
|
|
return json.loads(self.ingredients)
|
|
|
|
|
|
class PrincipalHealthData(BaseModel):
|
|
principal = models.OneToOneField(
|
|
IAmPrincipal,
|
|
on_delete=models.CASCADE,
|
|
related_name="health_data_principal",
|
|
verbose_name="Principal",
|
|
db_index=True,
|
|
)
|
|
# Gastrointestinal health (choices if applicable)
|
|
gastrointestinal_health = models.CharField(
|
|
max_length=255,
|
|
blank=True,
|
|
null=True,
|
|
verbose_name="Gastrointestinal Health",
|
|
help_text="Describe your gastrointestinal health (e.g., best, average, poor, etc.)",
|
|
)
|
|
|
|
# Exercise frequency (choices if applicable)
|
|
exercise_frequency = models.CharField(
|
|
max_length=255,
|
|
blank=True,
|
|
null=True,
|
|
verbose_name="Exercise Frequency",
|
|
help_text="Describe your exercise frequency (e.g., Less than equal to 3 days, 2 days, Greater than 3 days, etc.)",
|
|
)
|
|
|
|
sleep_duration = models.CharField(
|
|
max_length=255,
|
|
blank=True,
|
|
null=True,
|
|
verbose_name="Sleep Duration (hours)",
|
|
help_text="Enter your average sleep duration in hours per night.",
|
|
)
|
|
|
|
# Ethnicity (choices if applicable)
|
|
ethenicity = models.CharField(
|
|
max_length=255,
|
|
blank=True,
|
|
null=True,
|
|
verbose_name="Ethnicity",
|
|
help_text="Select your ethnicity.",
|
|
)
|
|
|
|
weight = models.DecimalField(
|
|
max_digits=5,
|
|
decimal_places=2,
|
|
default=0.0,
|
|
blank=True,
|
|
null=True,
|
|
verbose_name="Weight",
|
|
help_text="Enter your weight in kilograms.",
|
|
)
|
|
|
|
weight_unit = models.CharField(
|
|
max_length=10,
|
|
choices=[
|
|
('kg', 'kg'),
|
|
('lbs', 'lbs'),
|
|
],
|
|
blank=True,
|
|
null=True,
|
|
verbose_name="Weight Unit",
|
|
help_text="Select your weight unit.",
|
|
)
|
|
|
|
converted_weight_kg = models.DecimalField(
|
|
max_digits=5,
|
|
decimal_places=2,
|
|
blank=True,
|
|
null=True,
|
|
verbose_name="Converted Weight",
|
|
help_text="The equivalent weight converted into kilograms.",
|
|
)
|
|
|
|
height = models.DecimalField(
|
|
max_digits=6,
|
|
decimal_places=2,
|
|
default=0.0,
|
|
blank=True,
|
|
null=True,
|
|
verbose_name="Height",
|
|
help_text="Enter your height in centimeters.",
|
|
)
|
|
|
|
height_unit = models.CharField(
|
|
max_length=10,
|
|
choices=[
|
|
('cm', 'cm'),
|
|
('ft+inch', 'ft+inch'),
|
|
],
|
|
blank=True,
|
|
null=True,
|
|
verbose_name="Height Unit",
|
|
help_text="Select your height unit.",
|
|
)
|
|
|
|
converted_height_cm = models.DecimalField(
|
|
max_digits=5,
|
|
decimal_places=2,
|
|
blank=True,
|
|
null=True,
|
|
verbose_name="Converted Height",
|
|
help_text="The equivalent height converted into centimeters.",
|
|
)
|
|
|
|
# Eat frequency (choices if applicable)
|
|
eat_frequency = models.CharField(
|
|
max_length=255,
|
|
blank=True,
|
|
null=True,
|
|
verbose_name="Eating Frequency",
|
|
help_text="Describe your eating frequency (e.g., 3 meals per day, frequent snacking, etc.)",
|
|
)
|
|
|
|
class Meta:
|
|
db_table = "princpal_health_data"
|
|
|
|
def __str__(self):
|
|
return f"Health Data for {self.principal}"
|
|
|
|
@property
|
|
def converted_height_in_cm(self):
|
|
if self.height_unit == 'ft+inch':
|
|
feet, inches = divmod(float(self.height) * 10, 12)
|
|
return round(feet * 30.48 + inches * 2.54, 2) # Convert feet to cm and inches to cm
|
|
return None
|
|
|
|
@property
|
|
def converted_weight_in_kg(self):
|
|
if self.weight_unit == 'lbs':
|
|
return round(float(self.weight) * 0.453592, 2) # Convert pounds to kg
|
|
return None
|
|
|
|
def save(self, *args, **kwargs):
|
|
if self.height_unit == 'ft+inch':
|
|
self.converted_height_cm = self.converted_height_in_cm # Update converted height
|
|
if self.weight_unit == 'lbs':
|
|
self.converted_weight_kg = self.converted_weight_in_kg # Update converted weight
|
|
super().save(*args, **kwargs)
|
|
|
|
|
|
class Intolerance(BaseModel):
|
|
principal = models.ForeignKey(
|
|
IAmPrincipal,
|
|
on_delete=models.CASCADE,
|
|
related_name="intolerance_principal",
|
|
db_index=True,
|
|
)
|
|
name = models.CharField(max_length=255, blank=True, null=True)
|
|
duration = models.CharField(max_length=255, blank=True, null=True)
|
|
|
|
class Meta:
|
|
db_table = "intolerance"
|
|
|
|
def __str__(self):
|
|
return f"intolerance of {self.principal}"
|
|
|
|
|
|
class Symptoms(BaseModel):
|
|
principal = models.ForeignKey(
|
|
IAmPrincipal,
|
|
on_delete=models.CASCADE,
|
|
related_name="symptoms_principal",
|
|
db_index=True,
|
|
)
|
|
name = models.CharField(max_length=255, blank=True, null=True)
|
|
duration = models.CharField(max_length=255, blank=True, null=True)
|
|
|
|
class Meta:
|
|
db_table = "symptoms"
|
|
|
|
def __str__(self):
|
|
return f"symptoms of {self.principal}"
|
|
|
|
|
|
class PastTreatment(BaseModel):
|
|
principal = models.ForeignKey(
|
|
IAmPrincipal,
|
|
on_delete=models.CASCADE,
|
|
related_name="pasttreatment_principal",
|
|
db_index=True,
|
|
)
|
|
name = models.CharField(max_length=255, blank=True, null=True)
|
|
duration = models.DateField()
|
|
is_recurring = models.BooleanField(default=False)
|
|
treatment_frequency = models.TextField(blank=True, null=True)
|
|
|
|
class Meta:
|
|
db_table = "past_treatment"
|
|
|
|
def __str__(self):
|
|
return f"past treatment of {self.principal}"
|
|
|
|
|
|
class ChronicCondition(BaseModel):
|
|
principal = models.ForeignKey(
|
|
IAmPrincipal,
|
|
on_delete=models.CASCADE,
|
|
related_name="chronic_principal",
|
|
db_index=True,
|
|
)
|
|
name = models.CharField(max_length=255, blank=True, null=True)
|
|
duration = models.CharField(max_length=255, blank=True, null=True)
|
|
|
|
class Meta:
|
|
db_table = "chronic_condition"
|
|
|
|
def __str__(self):
|
|
return f"chronic condition of {self.principal}"
|
|
|
|
|
|
class FoodIngredientRecord(models.Model):
|
|
name = models.CharField(max_length=100)
|
|
from_dataset = models.BooleanField(default=False)
|
|
|
|
class Meta:
|
|
db_table = "food_ingredient_record"
|
|
|
|
class FoodRecord(models.Model):
|
|
name = models.CharField(max_length=100)
|
|
quantity = models.IntegerField()
|
|
|
|
class Meta:
|
|
db_table = "food_record"
|
|
|
|
class BeverageRecord(models.Model):
|
|
beverage_type = models.CharField(max_length=100)
|
|
quantity = models.IntegerField()
|
|
quantity_measure = models.CharField(max_length=100)
|
|
|
|
class Meta:
|
|
db_table = "beverage_record"
|
|
|
|
class MealRecord(BaseModel):
|
|
principal = models.ForeignKey(
|
|
IAmPrincipal, related_name="meal_principal", on_delete=models.CASCADE
|
|
)
|
|
date = models.DateField()
|
|
time = models.TimeField()
|
|
meal_type = models.CharField(max_length=100, blank=True, null=True)
|
|
food_records = models.ManyToManyField(FoodRecord, through='MealRecordFoodRecord')
|
|
beverage_records = models.ManyToManyField(BeverageRecord, through='MealRecordBeverageRecord')
|
|
food_ingredient_records = models.ManyToManyField(FoodIngredientRecord, through='MealRecordFoodIngredientRecord')
|
|
|
|
class Meta:
|
|
db_table = "meal_record"
|
|
|
|
class MealRecordFoodRecord(models.Model):
|
|
meal_record = models.ForeignKey(MealRecord, on_delete=models.CASCADE)
|
|
food_record = models.ForeignKey(FoodRecord, on_delete=models.CASCADE)
|
|
|
|
class Meta:
|
|
db_table = "meal_record_food_record"
|
|
|
|
class MealRecordBeverageRecord(models.Model):
|
|
meal_record = models.ForeignKey(MealRecord, on_delete=models.CASCADE)
|
|
beverage_record = models.ForeignKey(BeverageRecord, on_delete=models.CASCADE)
|
|
|
|
class Meta:
|
|
db_table = "meal_record_beverage_record"
|
|
|
|
class MealRecordFoodIngredientRecord(models.Model):
|
|
meal_record = models.ForeignKey(MealRecord, on_delete=models.CASCADE)
|
|
food_ingredient_record = models.ForeignKey(FoodIngredientRecord, on_delete=models.CASCADE)
|
|
|
|
class Meta:
|
|
db_table = "meal_record_food_ingredient_record"
|
|
|
|
class Medicine(models.Model):
|
|
name = models.CharField(max_length=255, blank=True, null=True)
|
|
quantity = models.IntegerField(default=0)
|
|
type = models.CharField(max_length=100, blank=True, null=True)
|
|
|
|
class Meta:
|
|
db_table = "medicine"
|
|
|
|
def __str__(self):
|
|
return f"{self.name} Medicine"
|
|
|
|
class Medication(BaseModel):
|
|
principal = models.ForeignKey(
|
|
IAmPrincipal, related_name="medication_principal", on_delete=models.CASCADE
|
|
)
|
|
date = models.DateField()
|
|
time = models.TimeField()
|
|
medicines = models.ManyToManyField(
|
|
Medicine,
|
|
through="MedicationMedicine",
|
|
related_name="medications"
|
|
)
|
|
|
|
class Meta:
|
|
db_table = "medication"
|
|
|
|
class MedicationMedicine(models.Model):
|
|
medication = models.ForeignKey(Medication, related_name="medication_medicines", on_delete=models.CASCADE)
|
|
medicine = models.ForeignKey(Medicine, related_name="medication_medicines", on_delete=models.CASCADE)
|
|
|
|
class Meta:
|
|
db_table = "medication_medicine"
|
|
|
|
|
|
class Bowel(BaseModel):
|
|
principal = models.ForeignKey(
|
|
IAmPrincipal, related_name="bowel_principal", on_delete=models.CASCADE
|
|
)
|
|
date = models.DateField()
|
|
time = models.TimeField()
|
|
stool_type = models.CharField(max_length=100, blank=True, null=True)
|
|
stool_name = models.CharField(max_length=100, blank=True, null=True)
|
|
duration = models.DurationField(blank=True, null=True)
|
|
completeness_of_evacuation = models.CharField(max_length=100, blank=True, null=True)
|
|
urgency = models.CharField(max_length=100, blank=True, null=True)
|
|
smellness = models.CharField(max_length=100, blank=True, null=True)
|
|
pain_level = models.CharField(max_length=100, blank=True, null=True)
|
|
volume = models.CharField(max_length=100, blank=True, null=True)
|
|
color = models.CharField(max_length=100, blank=True, null=True)
|
|
excessive_flatulence = models.BooleanField(default=False)
|
|
|
|
class Meta:
|
|
db_table = "bowel"
|
|
|
|
|
|
class SymptomTypeBeforeMeal(models.Model):
|
|
name = models.CharField(max_length=100)
|
|
|
|
class Meta:
|
|
db_table = "symptom_type_before_meal"
|
|
|
|
class SymptomTypeAfterMeal(models.Model):
|
|
name = models.CharField(max_length=100)
|
|
|
|
class Meta:
|
|
db_table = "symptom_type_after_meal"
|
|
|
|
class MealSymptomRecord(BaseModel):
|
|
principal = models.ForeignKey(IAmPrincipal, related_name="meal_symptom_principal", on_delete=models.CASCADE)
|
|
related_meal = models.ForeignKey(MealRecord, related_name="symptom_related_meal", on_delete=models.SET_NULL, null=True)
|
|
date = models.DateField()
|
|
time = models.TimeField()
|
|
symptoms_description = models.TextField(blank=True, null=True)
|
|
interval = models.DurationField()
|
|
symptoms_before_meal = models.ManyToManyField(SymptomTypeBeforeMeal, through='SymptomRecordBeforeMeal')
|
|
symptoms_after_meal = models.ManyToManyField(SymptomTypeAfterMeal, through='SymptomRecordAfterMeal')
|
|
|
|
class Meta:
|
|
db_table = "meal_symptom_record"
|
|
|
|
class SymptomRecordBeforeMeal(models.Model):
|
|
symptom_record = models.ForeignKey(MealSymptomRecord, on_delete=models.CASCADE)
|
|
symptom_type_before_meal = models.ForeignKey(SymptomTypeBeforeMeal, on_delete=models.CASCADE)
|
|
|
|
class Meta:
|
|
db_table = "symptom_record_before_meal"
|
|
|
|
class SymptomRecordAfterMeal(models.Model):
|
|
symptom_record = models.ForeignKey(MealSymptomRecord, on_delete=models.CASCADE)
|
|
symptom_type_after_meal = models.ForeignKey(SymptomTypeAfterMeal, on_delete=models.CASCADE)
|
|
|
|
class Meta:
|
|
db_table = "symptom_record_after_meal" |