Feat: Add ability to edit events for logged in users
This commit is contained in:
@@ -36,7 +36,8 @@ def get_session():
|
||||
with Session(engine) as session:
|
||||
yield session
|
||||
|
||||
def get_user(request: Request, allow_none: bool=True) -> dict | None:
|
||||
|
||||
def get_user(request: Request, allow_none: bool = True) -> dict | None:
|
||||
"""
|
||||
Retrieve user information from the incoming request.
|
||||
|
||||
@@ -68,6 +69,7 @@ def get_user(request: Request, allow_none: bool=True) -> dict | None:
|
||||
else:
|
||||
raise HTTPException(status_code=401, detail="Not logged in")
|
||||
|
||||
|
||||
def create_db_and_tables():
|
||||
Base.metadata.create_all(engine)
|
||||
|
||||
@@ -87,8 +89,10 @@ SessionDep = Annotated[Session, Depends(get_session)]
|
||||
|
||||
UserDep = Annotated[dict, Depends(get_user)]
|
||||
StrictUserDep = Annotated[dict, Depends(partial(get_user, allow_none=False))]
|
||||
|
||||
|
||||
@app.get("/")
|
||||
async def index(request: Request, session: SessionDep, user : UserDep):
|
||||
async def index(request: Request, session: SessionDep, user: UserDep):
|
||||
"""Displays coming events and a button to register new ones"""
|
||||
now = datetime.now()
|
||||
# TODO: Once we refactored to use SQLAlchemy directly, we can probably do a nicer filtering on the date alone
|
||||
@@ -194,22 +198,46 @@ async def add_event_form(request: Request, user: StrictUserDep):
|
||||
return templates.TemplateResponse(request=request, name="add_event.html")
|
||||
|
||||
|
||||
@app.get("/event/{event_id}/edit")
|
||||
async def edit_event_form(
|
||||
request: Request, event_id: int, session: SessionDep, user: StrictUserDep
|
||||
):
|
||||
statement = select(Event).where(Event.id == event_id)
|
||||
event = session.scalars(statement).one()
|
||||
|
||||
return templates.TemplateResponse(
|
||||
request=request,
|
||||
context={"event": event, "edit_mode": True},
|
||||
name="add_event.html",
|
||||
)
|
||||
|
||||
|
||||
@app.post("/event/{event_id}/edit")
|
||||
async def edit_event(
|
||||
request: Request, event_id: int, session: SessionDep, user: StrictUserDep
|
||||
):
|
||||
statement = select(Event).where(Event.id == event_id)
|
||||
event = session.scalars(statement).one()
|
||||
|
||||
form_data = await request.form()
|
||||
event_time, registration_deadline = await parse_event_times(form_data)
|
||||
|
||||
event.title = form_data["eventName"]
|
||||
event.event_time = event_time
|
||||
event.registration_deadline = registration_deadline
|
||||
event.description = form_data.get("eventDescription")
|
||||
event.recipe_link = form_data.get("recipeLink")
|
||||
|
||||
session.commit()
|
||||
|
||||
return RedirectResponse(url=f"/event/{event.id}", status_code=status.HTTP_302_FOUND)
|
||||
|
||||
|
||||
@app.post("/event/add")
|
||||
async def add_event(request: Request, session: SessionDep, user: StrictUserDep):
|
||||
form_data = await request.form()
|
||||
|
||||
event_time = datetime.fromisoformat(form_data["eventTime"])
|
||||
registration_deadline = form_data.get("registrationDeadline")
|
||||
if not registration_deadline:
|
||||
# Find the last Sunday before event_time
|
||||
deadline = event_time
|
||||
while deadline.weekday() != 6: # 6 represents Sunday
|
||||
deadline = deadline.replace(day=deadline.day - 1)
|
||||
registration_deadline = deadline.replace(
|
||||
hour=19, minute=30, second=0, microsecond=0
|
||||
)
|
||||
else:
|
||||
registration_deadline = datetime.fromisoformat(registration_deadline)
|
||||
event_time, registration_deadline = await parse_event_times(form_data)
|
||||
|
||||
event = Event(
|
||||
title=form_data["eventName"],
|
||||
@@ -222,8 +250,27 @@ async def add_event(request: Request, session: SessionDep, user: StrictUserDep):
|
||||
session.commit()
|
||||
return RedirectResponse(url="/", status_code=status.HTTP_302_FOUND)
|
||||
|
||||
|
||||
async def parse_event_times(form_data):
|
||||
event_time = datetime.fromisoformat(form_data["eventTime"])
|
||||
registration_deadline = form_data.get("registrationDeadline")
|
||||
if not registration_deadline:
|
||||
# Find the last Sunday before event_time
|
||||
deadline = event_time
|
||||
while deadline.weekday() != 6: # 6 represents Sunday
|
||||
deadline = deadline.replace(day=deadline.day - 1)
|
||||
registration_deadline = deadline.replace(
|
||||
hour=19, minute=30, second=0, microsecond=0
|
||||
)
|
||||
else:
|
||||
registration_deadline = datetime.fromisoformat(registration_deadline)
|
||||
return event_time, registration_deadline
|
||||
|
||||
|
||||
@app.get("/event/{event_id}/delete")
|
||||
async def delete_event(request: Request, session: SessionDep, event_id: int, user: StrictUserDep):
|
||||
async def delete_event(
|
||||
request: Request, session: SessionDep, event_id: int, user: StrictUserDep
|
||||
):
|
||||
if not user["admin"]:
|
||||
raise HTTPException(status_code=403, detail="Not authorized")
|
||||
|
||||
@@ -234,8 +281,11 @@ async def delete_event(request: Request, session: SessionDep, event_id: int, use
|
||||
session.commit()
|
||||
return RedirectResponse(url="/", status_code=status.HTTP_302_FOUND)
|
||||
|
||||
|
||||
@app.get("/event/{event_id}")
|
||||
async def read_event(request: Request, event_id: int, session: SessionDep, user: UserDep):
|
||||
async def read_event(
|
||||
request: Request, event_id: int, session: SessionDep, user: UserDep
|
||||
):
|
||||
statement = select(Event).where(Event.id == event_id)
|
||||
event = session.scalars(statement).one()
|
||||
|
||||
@@ -252,7 +302,12 @@ async def read_event(request: Request, event_id: int, session: SessionDep, user:
|
||||
return templates.TemplateResponse(
|
||||
request=request,
|
||||
name="event.html",
|
||||
context={"event": event, "households": households, "now": datetime.now(), "user": user},
|
||||
context={
|
||||
"event": event,
|
||||
"households": households,
|
||||
"now": datetime.now(),
|
||||
"user": user,
|
||||
},
|
||||
)
|
||||
|
||||
|
||||
@@ -334,6 +389,7 @@ async def delete_team_registration(
|
||||
session.commit()
|
||||
return RedirectResponse(url=f"/event/{event_id}", status_code=status.HTTP_302_FOUND)
|
||||
|
||||
|
||||
@app.get("/event/{event_id}/pdf")
|
||||
def get_event_attendance_pdf(event_id: int, session: SessionDep):
|
||||
|
||||
@@ -347,7 +403,5 @@ def get_event_attendance_pdf(event_id: int, session: SessionDep):
|
||||
}
|
||||
|
||||
return Response(
|
||||
content=pdf_buffer.getvalue(),
|
||||
media_type="application/pdf",
|
||||
headers=headers
|
||||
)
|
||||
content=pdf_buffer.getvalue(), media_type="application/pdf", headers=headers
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user