Rename meds to health

Add more health related models
Add activity categories
This commit is contained in:
Kumi 2021-02-16 12:15:56 +00:00
parent e4ec8200b7
commit 399be9aafc
12 changed files with 139 additions and 44 deletions

5
health/apps.py Normal file
View file

@ -0,0 +1,5 @@
from django.apps import AppConfig
class HealthConfig(AppConfig):
name = 'health'

101
health/models.py Normal file
View file

@ -0,0 +1,101 @@
from django.db import models
from django.contrib.auth import get_user_model
from django.utils import timezone
from datetime import time, date
from dateutil.relativedelta import relativedelta
class MedicationSettings(models.Model):
user = models.ForeignKey(get_user_model(), models.CASCADE)
morning_from = models.TimeField(default=time(6))
morning_till = models.TimeField(default=time(10))
noon_from = models.TimeField(default=time(12))
noon_till = models.TimeField(default=time(14))
evening_from = models.TimeField(default=time(19))
evening_till = models.TimeField(default=time(21))
night_from = models.TimeField(default=time(22))
night_till = models.TimeField(default=time(23))
notifications = models.BooleanField(default=True)
refill_reminder = models.PositiveSmallIntegerField(default=7)
class Medication(models.Model):
user = models.ForeignKey(get_user_model(), models.CASCADE)
name = models.CharField(max_length=128)
icon = models.CharField(max_length=64, default="fas fa-tablets")
supply = models.DecimalField(null=True, blank=True, max_digits=5, decimal_places=2)
default_refill = models.PositiveSmallIntegerField(default=1)
prn = models.BooleanField(default=False)
remarks = models.TextField(null=True, blank=True)
class MedicationSchedule(models.Model):
class ScheduleChoices(models.IntegerChoices):
DAYS = 0
WEEKS = 1
MONTHS = 2
medication = models.ForeignKey(Medication, models.CASCADE)
cycle_type = models.IntegerField(choices=ScheduleChoices.choices)
cycle_count = models.IntegerField(default=1)
first = models.DateField(default=date.today)
last = models.DateField(null=True, blank=True)
morning = models.DecimalField(null=True, blank=True, max_digits=5, decimal_places=2)
noon = models.DecimalField(null=True, blank=True, max_digits=5, decimal_places=2)
evening = models.DecimalField(null=True, blank=True, max_digits=5, decimal_places=2)
night = models.DecimalField(null=True, blank=True, max_digits=5, decimal_places=2)
def next(self, today=True):
if timezone.now().date() > self.last:
return False
cur = self.first
while True:
if (timezone.now().date() < cur) or (today and timezone.now().date() == cur):
return cur
cur += relativedelta(
days=self.cycle_count if self.cycle_type == ScheduleChoices.DAYS else 0,
weeks=self.cycle_count if self.cycle_type == ScheduleChoices.WEEKS else 0,
months=self.cycle_count if self.cycle_type == ScheduleChoices.MONTHS else 0
)
if cur > self.last:
return False
class MedicationCalendar(models.Model):
class TimeChoices(models.IntegerChoices):
MORNING = 0
NOON = 1
EVENING = 2
NIGHT = 3
date = models.DateField(default=date.today)
time = models.IntegerField(choices=TimeChoices.choices)
medication = models.ForeignKey(Medication, models.CASCADE)
schedule = models.ForeignKey(MedicationSchedule, models.SET_NULL, null=True)
count = models.DecimalField(max_digits=5, decimal_places=2)
taken = models.BooleanField(default=False)
class HealthParameter(models.Model):
user = models.ForeignKey(get_user_model(), models.CASCADE)
name = models.CharField(max_length=128)
icon = models.CharField(max_length=64, default="fas fa-heart")
unit = models.CharField(max_length=12, null=True, blank=True)
class HealthRecord(models.Model):
parameter = models.ForeignKey(HealthParameter, models.CASCADE)
value = models.DecimalField(max_digits=12, decimal_places=6, null=True, blank=True)
comment = models.TextField(null=True, blank=True)

View file

@ -24,7 +24,7 @@ INSTALLED_APPS = [
'cronhandler', 'cronhandler',
'cbt', 'cbt',
'dreams', 'dreams',
'meds', 'health',
'friends', 'friends',
'habits', 'habits',
] ]

View file

@ -1,5 +0,0 @@
from django.apps import AppConfig
class MedsConfig(AppConfig):
name = 'meds'

View file

@ -1,37 +0,0 @@
from django.db import models
from django.contrib.auth import get_user_model
from datetime import time
class MedicationSettings(models.Model):
user = models.ForeignKey(get_user_model(), models.CASCADE)
morning_from = models.TimeField(default=time(6))
morning_till = models.TimeField(default=time(10))
noon_from = models.TimeField(default=time(12))
noon_till = models.TimeField(default=time(14))
evening_from = models.TimeField(default=time(19))
evening_till = models.TimeField(default=time(21))
night_from = models.TimeField(default=time(22))
night_till = models.TimeField(default=time(23))
notifications = models.BooleanField(default=True)
refill_reminder = models.PositiveSmallIntegerField(default=7)
class Medication(models.Model):
user = models.ForeignKey(get_user_model(), models.CASCADE)
name = models.CharField(max_length=128)
icon = models.CharField(max_length=64, default="fas fa-tablets")
supply = models.DecimalField(null=True, blank=True, max_digits=5, decimal_places=2)
default_refill = models.PositiveSmallIntegerField(null=True, blank=True)
morning = models.DecimalField(null=True, blank=True, max_digits=5, decimal_places=2)
noon = models.DecimalField(null=True, blank=True, max_digits=5, decimal_places=2)
evening = models.DecimalField(null=True, blank=True, max_digits=5, decimal_places=2)
night = models.DecimalField(null=True, blank=True, max_digits=5, decimal_places=2)
remarks = models.TextField(null=True, blank=True)

View file

@ -37,11 +37,21 @@ class Status(models.Model):
def __str__(self): def __str__(self):
return self.short_text return self.short_text
class ActivityCategory(models.Model):
user = models.ForeignKey(get_user_model(), models.CASCADE)
name = models.CharField(max_length=64)
icon = models.CharField(default="fas fa-check", max_length=64)
color = ColorField(default="#000000")
def __str__(self):
return self.name
class Activity(models.Model): class Activity(models.Model):
user = models.ForeignKey(get_user_model(), models.CASCADE) user = models.ForeignKey(get_user_model(), models.CASCADE)
name = models.CharField(max_length=64) name = models.CharField(max_length=64)
icon = models.CharField(default="fas fa-check", max_length=64) icon = models.CharField(default="fas fa-check", max_length=64)
color = ColorField(default="#000000") color = ColorField(default="#000000")
category = models.ForeignKey(ActivityCategory, models.SET_NULL, null=True)
def __str__(self): def __str__(self):
return self.name return self.name

View file

@ -1,4 +1,5 @@
{% extends "frontend/base.html" %} {% extends "frontend/base.html" %}
{% load mood_categories %}
{% block "content" %} {% block "content" %}
{% if form.errors %} {% if form.errors %}
@ -33,9 +34,22 @@
</select></td></tr> </select></td></tr>
<tr><th><label for="activities">Activities:</label></th><td> <tr><th><label for="activities">Activities:</label></th><td>
{% for activity in request.user.activity_set.all %} {% for activitycategory in request.user.activitycategory_set.all %}
<b>{{ activitycategory.name }}</b>
{% for activity in activitycategory.activity_set.all %}
<input type="checkbox" {% if activity in object.activity_set %}checked{% endif %} value="{{ activity.id }}" name="activities"> <i class="{{ activity.icon }}" style="color:{{ activity.color }};"></i> {{ activity }}<br> <input type="checkbox" {% if activity in object.activity_set %}checked{% endif %} value="{{ activity.id }}" name="activities"> <i class="{{ activity.icon }}" style="color:{{ activity.color }};"></i> {{ activity }}<br>
{% endfor %} {% endfor %}
{% endfor %}
<b>Uncategorized activities</b>
{% for activitycategory in request.user.activitycategory_set.all %}
{% for activity in activitycategory.activity_set.all %}
<input type="checkbox" {% if activity in object.activity_set %}checked{% endif %} value="{{ activity.id }}" name="activities"> <i class="{{ activity.icon }}" style="color:{{ activity.color }};"></i> {{ activity }}<br>
{% endfor %}
{% endfor %}
</td></tr> </td></tr>
<tr><th><label for="id_uploads">Uploads:</label></th><td><input type="file" name="uploads" id="id_uploads" multiple="multiple"></td></tr> <tr><th><label for="id_uploads">Uploads:</label></th><td><input type="file" name="uploads" id="id_uploads" multiple="multiple"></td></tr>

View file

@ -0,0 +1,7 @@
from django import template
register = template.Library()
@register.simple_tag(takes_context=True)
def other_activities(context):
return context["user"].activity_set.filter(category=None)