timetable maybe working, very cloase at least
This commit is contained in:
@@ -16,6 +16,7 @@ async def get_daily_summary(
|
||||
to_date: datetime,
|
||||
day_start: str = Query("07:00"),
|
||||
day_end: str = Query("20:00"),
|
||||
timezone_offset: int = Query(0),
|
||||
session: AsyncSession = Depends(get_session),
|
||||
):
|
||||
try:
|
||||
@@ -24,15 +25,19 @@ async def get_daily_summary(
|
||||
except ValueError:
|
||||
return {"days": []}
|
||||
|
||||
adj_from_date = from_date - timedelta(days=1)
|
||||
sessions, _ = await get_sessions(session, from_date=adj_from_date, to_date=to_date)
|
||||
utc_from_date = from_date + timedelta(minutes=timezone_offset)
|
||||
utc_to_date = to_date + timedelta(minutes=timezone_offset)
|
||||
adj_utc_from_date = utc_from_date - timedelta(days=1)
|
||||
sessions, _ = await get_sessions(session, from_date=adj_utc_from_date, to_date=utc_to_date)
|
||||
summary_map = {}
|
||||
|
||||
for s in sessions:
|
||||
if not s.end_time:
|
||||
continue
|
||||
local_start = s.start_time - timedelta(minutes=timezone_offset)
|
||||
local_end = s.end_time - timedelta(minutes=timezone_offset)
|
||||
segments = get_day_night_splits(
|
||||
s.start_time, s.end_time, day_start_time, day_end_time
|
||||
local_start, local_end, day_start_time, day_end_time
|
||||
)
|
||||
for seg in segments:
|
||||
if not (from_date.date() <= seg["start"].date() <= to_date.date()):
|
||||
@@ -66,26 +71,34 @@ async def get_timetable(
|
||||
to_date: datetime,
|
||||
day_start: str = Query("07:00"),
|
||||
day_end: str = Query("20:00"),
|
||||
timezone_offset: int = Query(0),
|
||||
session: AsyncSession = Depends(get_session),
|
||||
):
|
||||
adj_from_date = from_date - timedelta(days=1)
|
||||
sessions, _ = await get_sessions(session, from_date=adj_from_date, to_date=to_date)
|
||||
utc_from_date = from_date + timedelta(minutes=timezone_offset)
|
||||
utc_to_date = to_date + timedelta(minutes=timezone_offset)
|
||||
adj_utc_from_date = utc_from_date - timedelta(days=1)
|
||||
sessions, _ = await get_sessions(session, from_date=adj_utc_from_date, to_date=utc_to_date)
|
||||
slots = []
|
||||
now = datetime.now(timezone.utc).replace(tzinfo=None)
|
||||
now_utc = datetime.now(timezone.utc).replace(tzinfo=None)
|
||||
current_date = from_date.date()
|
||||
while current_date <= to_date.date():
|
||||
date_str = current_date.strftime("%Y-%m-%d")
|
||||
for i in range(96):
|
||||
slot_start_time = datetime.combine(current_date, time(0, 0)) + timedelta(
|
||||
slot_start_local = datetime.combine(current_date, time(0, 0)) + timedelta(
|
||||
minutes=i * 15
|
||||
)
|
||||
slot_end_time = slot_start_time + timedelta(minutes=15)
|
||||
slot_start_str = slot_start_time.strftime("%H:%M")
|
||||
slot_end_str = slot_end_time.strftime("%H:%M")
|
||||
slot_end_local = slot_start_local + timedelta(minutes=15)
|
||||
slot_start_str = slot_start_local.strftime("%H:%M")
|
||||
slot_end_str = slot_end_local.strftime("%H:%M")
|
||||
|
||||
# Convert local slots to UTC for comparison with DB sessions
|
||||
slot_start_utc = slot_start_local + timedelta(minutes=timezone_offset)
|
||||
slot_end_utc = slot_end_local + timedelta(minutes=timezone_offset)
|
||||
|
||||
is_sleeping = False
|
||||
for s in sessions:
|
||||
effective_end_time = s.end_time if s.end_time is not None else now
|
||||
if s.start_time <= slot_end_time and effective_end_time >= slot_start_time:
|
||||
effective_end_time_utc = s.end_time if s.end_time is not None else now_utc
|
||||
if s.start_time <= slot_end_utc and effective_end_time_utc >= slot_start_utc:
|
||||
is_sleeping = True
|
||||
break
|
||||
slots.append(
|
||||
@@ -140,6 +153,7 @@ async def get_wake_sleep_times(
|
||||
to_date: datetime,
|
||||
wakeup_ref: str = Query("04:00"),
|
||||
bedtime_ref: str = Query("19:00"),
|
||||
timezone_offset: int = Query(0),
|
||||
session: AsyncSession = Depends(get_session),
|
||||
):
|
||||
try:
|
||||
@@ -147,10 +161,11 @@ async def get_wake_sleep_times(
|
||||
b_ref_time = time.fromisoformat(bedtime_ref)
|
||||
except ValueError:
|
||||
return {"days": []}
|
||||
|
||||
# Fetch sessions starting from one day before to catch night sleep ending on from_date
|
||||
adj_from_date = from_date - timedelta(days=1)
|
||||
sessions, _ = await get_sessions(session, from_date=adj_from_date, to_date=to_date)
|
||||
|
||||
utc_from_date = from_date + timedelta(minutes=timezone_offset)
|
||||
utc_to_date = to_date + timedelta(minutes=timezone_offset)
|
||||
adj_utc_from_date = utc_from_date - timedelta(days=1)
|
||||
sessions, _ = await get_sessions(session, from_date=adj_utc_from_date, to_date=utc_to_date)
|
||||
days_data = []
|
||||
current_date = from_date.date()
|
||||
while current_date <= to_date.date():
|
||||
@@ -162,20 +177,24 @@ async def get_wake_sleep_times(
|
||||
|
||||
night_session = None
|
||||
for s in sessions:
|
||||
# A session that runs over midnight into current_date
|
||||
if s.start_time < midnight_today and s.end_time and s.end_time >= midnight_today:
|
||||
night_session = s
|
||||
# Convert to local for comparison
|
||||
s_start_local = s.start_time - timedelta(minutes=timezone_offset)
|
||||
s_end_local = s.end_time - timedelta(minutes=timezone_offset) if s.end_time else None
|
||||
|
||||
if s_start_local < midnight_today and s_end_local and s_end_local >= midnight_today:
|
||||
night_session = (s, s_start_local, s_end_local)
|
||||
break
|
||||
|
||||
if night_session:
|
||||
# Bedtime offset from b_ref_time on the day it started
|
||||
s_start_date = night_session.start_time.date()
|
||||
s, s_start_local, s_end_local = night_session
|
||||
# Bedtime offset from b_ref_time on the day it started (local)
|
||||
s_start_date = s_start_local.date()
|
||||
ref_datetime_bedtime = datetime.combine(s_start_date, b_ref_time)
|
||||
bedtime_min = int((night_session.start_time - ref_datetime_bedtime).total_seconds() / 60.0)
|
||||
bedtime_min = int((s_start_local - ref_datetime_bedtime).total_seconds() / 60.0)
|
||||
|
||||
# Wakeup offset from w_ref_time on the current day
|
||||
# Wakeup offset from w_ref_time on the current day (local)
|
||||
ref_datetime_wakeup = datetime.combine(current_date, w_ref_time)
|
||||
wakeup_min = int((night_session.end_time - ref_datetime_wakeup).total_seconds() / 60.0)
|
||||
wakeup_min = int((s_end_local - ref_datetime_wakeup).total_seconds() / 60.0)
|
||||
|
||||
days_data.append(
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user