-
Notifications
You must be signed in to change notification settings - Fork 52
Expand file tree
/
Copy pathmenstrual_predictor.py
More file actions
120 lines (103 loc) · 3.34 KB
/
Copy pathmenstrual_predictor.py
File metadata and controls
120 lines (103 loc) · 3.34 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
import datetime
from fastapi import APIRouter, Depends, Request, HTTPException
from fastapi.responses import RedirectResponse
from loguru import logger
from sqlalchemy.exc import SQLAlchemyError
from sqlalchemy.orm import Session
from starlette.status import HTTP_302_FOUND, HTTP_400_BAD_REQUEST
from app.dependencies import get_db, templates
from app.database.models import UserMenstrualPeriodLength
from app.internal.menstrual_predictor_utils import (
add_3_month_predictions,
is_user_signed_up_to_menstrual_predictor,
generate_predicted_period_dates,
remove_existing_period_dates,
)
from app.internal.security.schema import CurrentUser
from app.internal.security.dependancies import current_user
from app.internal.utils import create_model
router = APIRouter(
prefix="/menstrual_predictor",
tags=["menstrual_predictor"],
dependencies=[Depends(get_db)],
)
MENSTRUAL_PERIOD_CATEGORY_ID = 111
@router.get("/")
def join_menstrual_predictor(
request: Request,
db: Session = Depends(get_db),
user: CurrentUser = Depends(current_user),
):
current_user_id = user.user_id
if not is_user_signed_up_to_menstrual_predictor(db, current_user_id):
return templates.TemplateResponse(
"join_menstrual_predictor.html",
{
"request": request,
},
)
else:
return RedirectResponse(url="/", status_code=HTTP_302_FOUND)
@router.get("/add-period-start/{start_date}")
def add_period_start(
request: Request,
start_date: str,
db: Session = Depends(get_db),
user: CurrentUser = Depends(current_user),
):
try:
period_start_date = datetime.datetime.strptime(start_date, "%Y-%m-%d")
except ValueError as err:
logger.exception(err)
raise HTTPException(
status_code=HTTP_400_BAD_REQUEST,
detail="The given date doesn't match a date format YYYY-MM-DD",
)
else:
current_user_id = user.user_id
user_period_length = is_user_signed_up_to_menstrual_predictor(
db,
current_user_id,
)
remove_existing_period_dates(db, current_user_id)
if user_period_length:
add_3_month_predictions(
db,
user_period_length,
period_start_date,
current_user_id,
)
logger.info("adding menstrual start date")
return RedirectResponse("/", status_code=HTTP_302_FOUND)
@router.post("/")
async def submit_join_form(
request: Request,
db: Session = Depends(get_db),
user: CurrentUser = Depends(current_user),
):
data = await request.form()
user_menstrual_period_length = {
"user_id": user.user_id,
"period_length": data["avg_period_length"],
}
last_period_date = datetime.datetime.strptime(
data["last_period_date"],
"%Y-%m-%d",
)
try:
create_model(
session=db,
model_class=UserMenstrualPeriodLength,
**user_menstrual_period_length,
)
except SQLAlchemyError:
logger.info("Current user already signed up to the service, hurray")
db.rollback()
url = "/"
generate_predicted_period_dates(
db,
data["avg_period_length"],
last_period_date,
user.user_id,
)
return RedirectResponse(url=url, status_code=HTTP_302_FOUND)