From 5f19409da41d94744169896a75bb178ed07ed0ce Mon Sep 17 00:00:00 2001 From: ahtlon Date: Mon, 27 Jul 2026 16:26:58 +0200 Subject: [PATCH] [AA] Add oneshot to checkAccess function --- app/services/door.py | 40 +++++++++++++++++++++++++++------------- 1 file changed, 27 insertions(+), 13 deletions(-) diff --git a/app/services/door.py b/app/services/door.py index c4d1faf..f4d3548 100644 --- a/app/services/door.py +++ b/app/services/door.py @@ -4,9 +4,9 @@ from sqlmodel import select from fastapi import Depends, HTTPException, status from sqlalchemy.orm import selectinload import sqlalchemy.exc as exc -import datetime +from datetime import datetime, date, timedelta -from app.services.database import Session, get_session +from app.services.database import Session, get_session, add_and_refresh from app.model.models import * doorIsOpen = True @@ -28,22 +28,36 @@ def closeDoor(): def isDoorOpen(): return doorIsOpen +def decrementOneshot(db: Session, oneshot: OneShotAccess): + data = oneshot.model_dump() + if data["uses"] > 0: + data["uses"] = data["uses"] - 1 + oneshot.sqlmodel_update(oneshot, update=data) + add_and_refresh(db, oneshot) + def checkAccess(key: str, db: Session): try: - current_weekday = datetime.datetime.weekday(datetime.date.today()) - current_time = datetime.datetime.now() + current_weekday = datetime.weekday(date.today()) + current_time = datetime.now() card = db.exec(select(Card).where(Card.key == key)).one() for auth in card.group.accessauths: logger.info(f"checking auth: {auth.name}") - for timetable in auth.timetables: - logger.info(f" checking timetable {timetable.id}") - logger.info(f" comparing weekday: CUR:{current_weekday} TT:{timetable.weekday}") - if current_weekday == timetable.weekday: - starttime = datetime.datetime.combine(datetime.date.today(), timetable.starttime) - endtime = starttime + datetime.timedelta(minutes=timetable.duration) - logger.info(f" comparing time: Start:{starttime} Current:{current_time} End:{endtime}") - if starttime < current_time < endtime: - logger.info("Access Valid!") + if auth.type == "timetable": + for timetable in auth.timetables: + logger.info(f" checking timetable {timetable.id}") + logger.info(f" comparing weekday: CUR:{current_weekday} TT:{timetable.weekday}") + if current_weekday == timetable.weekday: + starttime = datetime.combine(date.today(), timetable.starttime) + endtime = starttime + timedelta(minutes=timetable.duration) + logger.info(f" comparing time: Start:{starttime} Current:{current_time} End:{endtime}") + if starttime < current_time < endtime: + logger.info("Access Valid!") + return True + if auth.type == "oneshot": + logger.info(f' oneshot auth found: {auth.oneshot}') + if current_time < auth.oneshot.ends_at: + if auth.oneshot.uses > 0: + decrementOneshot(db, auth.oneshot) return True logger.info("No more auths found") return False