add: Calander and reservation mode implemented.

This commit is contained in:
serversdwn
2026-02-06 20:40:31 +00:00
parent e515bff1a9
commit eb0a99796d
15 changed files with 2847 additions and 27 deletions

View File

@@ -1,7 +1,7 @@
from fastapi import APIRouter, Depends, HTTPException, Form, UploadFile, File, Request, Query
from fastapi.exceptions import RequestValidationError
from sqlalchemy.orm import Session
from datetime import datetime, date
from datetime import datetime, date, timedelta
import csv
import io
import logging
@@ -185,8 +185,13 @@ async def add_roster_unit(
except ValueError:
raise HTTPException(status_code=400, detail="Invalid last_calibrated date format. Use YYYY-MM-DD")
# Auto-calculate next_calibration_due (1 year from last_calibrated)
# This is calculated internally but not shown to user (they just see last_calibrated)
next_cal_date = None
if next_calibration_due:
if last_cal_date:
next_cal_date = last_cal_date + timedelta(days=365)
elif next_calibration_due:
# Fallback: allow explicit setting if no last_calibrated
try:
next_cal_date = datetime.strptime(next_calibration_due, "%Y-%m-%d").date()
except ValueError:
@@ -517,8 +522,13 @@ async def edit_roster_unit(
except ValueError:
raise HTTPException(status_code=400, detail="Invalid last_calibrated date format. Use YYYY-MM-DD")
# Auto-calculate next_calibration_due (1 year from last_calibrated)
# This is calculated internally but not shown to user (they just see last_calibrated)
next_cal_date = None
if next_calibration_due:
if last_cal_date:
next_cal_date = last_cal_date + timedelta(days=365)
elif next_calibration_due:
# Fallback: allow explicit setting if no last_calibrated
try:
next_cal_date = datetime.strptime(next_calibration_due, "%Y-%m-%d").date()
except ValueError:
@@ -995,8 +1005,13 @@ async def import_csv(
# Seismograph-specific fields
if row.get('last_calibrated'):
existing_unit.last_calibrated = _parse_date(row.get('last_calibrated'))
if row.get('next_calibration_due'):
last_cal = _parse_date(row.get('last_calibrated'))
existing_unit.last_calibrated = last_cal
# Auto-calculate next_calibration_due (1 year from last_calibrated)
if last_cal:
existing_unit.next_calibration_due = last_cal + timedelta(days=365)
elif row.get('next_calibration_due'):
# Only use explicit next_calibration_due if no last_calibrated
existing_unit.next_calibration_due = _parse_date(row.get('next_calibration_due'))
if row.get('deployed_with_modem_id'):
existing_unit.deployed_with_modem_id = _get_csv_value(row, 'deployed_with_modem_id')
@@ -1046,9 +1061,13 @@ async def import_csv(
address=_get_csv_value(row, 'address'),
coordinates=_get_csv_value(row, 'coordinates'),
last_updated=datetime.utcnow(),
# Seismograph fields
# Seismograph fields - auto-calc next_calibration_due from last_calibrated
last_calibrated=_parse_date(row.get('last_calibrated', '')),
next_calibration_due=_parse_date(row.get('next_calibration_due', '')),
next_calibration_due=(
_parse_date(row.get('last_calibrated', '')) + timedelta(days=365)
if _parse_date(row.get('last_calibrated', ''))
else _parse_date(row.get('next_calibration_due', ''))
),
deployed_with_modem_id=_get_csv_value(row, 'deployed_with_modem_id'),
# Modem fields
ip_address=_get_csv_value(row, 'ip_address'),