Primo commit
This commit is contained in:
@@ -5,7 +5,7 @@ Manager settings, closing days, guarantees, and exclusions
|
||||
Key concept: Managers own parking spots and set rules for their managed users.
|
||||
Rules are set at manager level (users have manager_id pointing to their manager).
|
||||
"""
|
||||
from datetime import datetime
|
||||
from datetime import datetime, date
|
||||
from fastapi import APIRouter, Depends, HTTPException
|
||||
from pydantic import BaseModel
|
||||
from sqlalchemy.orm import Session
|
||||
@@ -26,7 +26,8 @@ router = APIRouter(prefix="/api/managers", tags=["managers"])
|
||||
|
||||
# Request/Response Models
|
||||
class ClosingDayCreate(BaseModel):
|
||||
date: str # YYYY-MM-DD
|
||||
date: date # Start date
|
||||
end_date: date | None = None # Optional end date (inclusive)
|
||||
reason: str | None = None
|
||||
|
||||
|
||||
@@ -36,14 +37,16 @@ class WeeklyClosingDayCreate(BaseModel):
|
||||
|
||||
class GuaranteeCreate(BaseModel):
|
||||
user_id: str
|
||||
start_date: str | None = None
|
||||
end_date: str | None = None
|
||||
start_date: date | None = None
|
||||
end_date: date | None = None
|
||||
notes: str | None = None
|
||||
|
||||
|
||||
class ExclusionCreate(BaseModel):
|
||||
user_id: str
|
||||
start_date: str | None = None
|
||||
end_date: str | None = None
|
||||
start_date: date | None = None
|
||||
end_date: date | None = None
|
||||
notes: str | None = None
|
||||
|
||||
|
||||
class ManagerSettingsUpdate(BaseModel):
|
||||
@@ -124,7 +127,7 @@ def update_manager_settings(manager_id: str, data: ManagerSettingsUpdate, db: Se
|
||||
raise HTTPException(status_code=400, detail=f"Spot prefix '{data.spot_prefix}' is already used")
|
||||
manager.manager_spot_prefix = data.spot_prefix
|
||||
|
||||
manager.updated_at = datetime.utcnow().isoformat()
|
||||
manager.updated_at = datetime.utcnow()
|
||||
db.commit()
|
||||
|
||||
return {
|
||||
@@ -155,7 +158,7 @@ def get_manager_closing_days(manager_id: str, db: Session = Depends(get_db), use
|
||||
days = db.query(ManagerClosingDay).filter(
|
||||
ManagerClosingDay.manager_id == manager_id
|
||||
).order_by(ManagerClosingDay.date).all()
|
||||
return [{"id": d.id, "date": d.date, "reason": d.reason} for d in days]
|
||||
return [{"id": d.id, "date": d.date, "end_date": d.end_date, "reason": d.reason} for d in days]
|
||||
|
||||
|
||||
@router.post("/{manager_id}/closing-days")
|
||||
@@ -172,10 +175,14 @@ def add_manager_closing_day(manager_id: str, data: ClosingDayCreate, db: Session
|
||||
if existing:
|
||||
raise HTTPException(status_code=400, detail="Closing day already exists for this date")
|
||||
|
||||
if data.end_date and data.end_date < data.date:
|
||||
raise HTTPException(status_code=400, detail="End date must be after start date")
|
||||
|
||||
closing_day = ManagerClosingDay(
|
||||
id=generate_uuid(),
|
||||
manager_id=manager_id,
|
||||
date=data.date,
|
||||
end_date=data.end_date,
|
||||
reason=data.reason
|
||||
)
|
||||
db.add(closing_day)
|
||||
@@ -270,7 +277,8 @@ def get_manager_guarantees(manager_id: str, db: Session = Depends(get_db), user=
|
||||
"user_id": g.user_id,
|
||||
"user_name": user_lookup.get(g.user_id),
|
||||
"start_date": g.start_date,
|
||||
"end_date": g.end_date
|
||||
"end_date": g.end_date,
|
||||
"notes": g.notes
|
||||
}
|
||||
for g in guarantees
|
||||
]
|
||||
@@ -292,13 +300,17 @@ def add_manager_guarantee(manager_id: str, data: GuaranteeCreate, db: Session =
|
||||
if existing:
|
||||
raise HTTPException(status_code=400, detail="User already has a parking guarantee")
|
||||
|
||||
if data.start_date and data.end_date and data.end_date < data.start_date:
|
||||
raise HTTPException(status_code=400, detail="End date must be after start date")
|
||||
|
||||
guarantee = ParkingGuarantee(
|
||||
id=generate_uuid(),
|
||||
manager_id=manager_id,
|
||||
user_id=data.user_id,
|
||||
start_date=data.start_date,
|
||||
end_date=data.end_date,
|
||||
created_at=datetime.utcnow().isoformat()
|
||||
notes=data.notes,
|
||||
created_at=datetime.utcnow()
|
||||
)
|
||||
db.add(guarantee)
|
||||
db.commit()
|
||||
@@ -340,7 +352,8 @@ def get_manager_exclusions(manager_id: str, db: Session = Depends(get_db), user=
|
||||
"user_id": e.user_id,
|
||||
"user_name": user_lookup.get(e.user_id),
|
||||
"start_date": e.start_date,
|
||||
"end_date": e.end_date
|
||||
"end_date": e.end_date,
|
||||
"notes": e.notes
|
||||
}
|
||||
for e in exclusions
|
||||
]
|
||||
@@ -362,13 +375,17 @@ def add_manager_exclusion(manager_id: str, data: ExclusionCreate, db: Session =
|
||||
if existing:
|
||||
raise HTTPException(status_code=400, detail="User already has a parking exclusion")
|
||||
|
||||
if data.start_date and data.end_date and data.end_date < data.start_date:
|
||||
raise HTTPException(status_code=400, detail="End date must be after start date")
|
||||
|
||||
exclusion = ParkingExclusion(
|
||||
id=generate_uuid(),
|
||||
manager_id=manager_id,
|
||||
user_id=data.user_id,
|
||||
start_date=data.start_date,
|
||||
end_date=data.end_date,
|
||||
created_at=datetime.utcnow().isoformat()
|
||||
notes=data.notes,
|
||||
created_at=datetime.utcnow()
|
||||
)
|
||||
db.add(exclusion)
|
||||
db.commit()
|
||||
|
||||
Reference in New Issue
Block a user