ba-thesis/app/medwings/views.py

118 lines
5.2 KiB
Python

from datetime import timedelta
import json
from django.shortcuts import redirect, render
from django.http import HttpResponse, JsonResponse
from django.contrib.auth.decorators import login_required
from django.views.decorators.http import require_http_methods
from django.utils import timezone
from . import models
from . import forms
@require_http_methods(["GET"])
def index(request):
return render(request, 'medwings/index.html')
@login_required
@require_http_methods(["GET"])
def dashboard(request):
mews_records = models.MewsRecord.objects.filter(user=request.user)
blood_pressure_records = models.BloodPressureRecord.objects.filter(user=request.user)
body_temp_records = models.BodyTempRecord.objects.filter(user=request.user)
heart_rate_records = models.HeartRateRecord.objects.filter(user=request.user)
spo2_level_records = models.Spo2LevelRecord.objects.filter(user=request.user)
respiration_score_records = models.RespirationScoreRecord.objects.filter(user=request.user)
context = {
"mews_data": json.dumps([{"x": record.recorded.timestamp(), "y": record.value_n} for record in mews_records]),
"blood_pressure_data": json.dumps([{"x": record.recorded.timestamp(), "y": record.value_systolic_mmhg} for record in blood_pressure_records]),
"body_temp_data": json.dumps([{"x": record.recorded.timestamp(), "y": float(record.value_celsius)} for record in body_temp_records]),
"heart_rate_data": json.dumps([{"x": record.recorded.timestamp(), "y": record.value_bpm} for record in heart_rate_records]),
"spo2_level_data": json.dumps([{"x": record.recorded.timestamp(), "y": record.value_percent} for record in spo2_level_records]),
"respiration_score_data": json.dumps([{"x": record.recorded.timestamp(), "y": record.value_severity} for record in respiration_score_records]),
}
return render(request, 'medwings/dashboard.html', context)
@login_required
@require_http_methods(["GET", "POST"])
def mews_init(request):
if request.method == 'POST':
respiration_score_form = forms.RespirationScoreForm(request.POST)
if respiration_score_form.is_valid():
respiration_score = respiration_score_form.save(commit=False)
respiration_score.recorded = timezone.now()
respiration_score.user = request.user
respiration_score.save()
return redirect('mews-continue')
else:
respiration_score_form = forms.RespirationScoreForm()
context = {
'respiration_score_form': respiration_score_form,
}
return render(request, 'medwings/mews-init.html', context)
@login_required
def mews_continue(request):
return render(request, 'medwings/mews-continue.html')
@require_http_methods(["GET"])
def mews_status(request):
if not request.user.is_authenticated:
return HttpResponse('Unauthorized', status=401)
request.user.apiaccount.update_records()
ten_minutes_ago = timezone.now() - timedelta(minutes=10)
blood_pressure_record = models.BloodPressureRecord.objects.filter(user=request.user).filter(recorded__gte=ten_minutes_ago).order_by('-recorded').first()
body_temp_record = models.BodyTempRecord.objects.filter(user=request.user).filter(recorded__gte=ten_minutes_ago).order_by('-recorded').first()
heart_rate_record = models.HeartRateRecord.objects.filter(user=request.user).filter(recorded__gte=ten_minutes_ago).order_by('-recorded').first()
spo2_level_record = models.Spo2LevelRecord.objects.filter(user=request.user).filter(recorded__gte=ten_minutes_ago).order_by('-recorded').first()
respiration_score_record = models.RespirationScoreRecord.objects.filter(user=request.user).filter(recorded__gte=ten_minutes_ago).order_by('-recorded').first()
data = {
'blood_pressure_value': blood_pressure_record.value_systolic_mmhg if blood_pressure_record else None,
'body_temp_value': body_temp_record.value_celsius if body_temp_record else None,
'heart_rate_value': heart_rate_record.value_bpm if heart_rate_record else None,
'spo2_level_value': spo2_level_record.value_percent if spo2_level_record else None,
'respiration_score_value': respiration_score_record.value_severity if respiration_score_record else None,
'mews_value': None,
}
if (blood_pressure_record
and body_temp_record
and heart_rate_record
and spo2_level_record
and respiration_score_record
):
mews_record = models.MewsRecord(
user=request.user, recorded=timezone.now(),
value_n=models.MewsRecord.calculate_mews_value(
blood_pressure_record.value_systolic_mmhg,
body_temp_record.value_celsius,
heart_rate_record.value_bpm,
spo2_level_record.value_percent,
respiration_score_record.value_severity
),
blood_pressure_record=blood_pressure_record,
body_temp_record=body_temp_record,
heart_rate_record=heart_rate_record,
respiration_score_record=respiration_score_record,
spo2_level_record=spo2_level_record
)
mews_record.save()
data['mews_value'] = mews_record.value_n
return JsonResponse(data)