from fastapi import ( APIRouter, Depends, Security, ) from sqlalchemy import distinct, func, over, desc from sqlalchemy.orm import Session from ..models import Attendance from ..schemas.auth import UserToken from ..core.security import get_current_active_user as get_user from ..db.session import SessionLocal router = APIRouter() # Dependency def get_db() -> Session: try: db = SessionLocal() yield db finally: db.close() @router.post("") def post_check_db(db: Session = Depends(get_db), user: UserToken = Security(get_user)): info = {} duplicate_attendances = get_duplicate_attendances(db) if duplicate_attendances > 0: fix_duplicate_attendances(db) info["Duplicate Attendances Fixed"] = duplicate_attendances db.commit() return info def get_duplicate_attendances(db): sub_query = ( db.query( over(distinct(func.first_value(Attendance.id)), partition_by=[Attendance.employee_id, Attendance.date],) ) .filter(Attendance.is_valid == True) .subquery() ) query = ( db.query(func.count(Attendance.id)).filter(~Attendance.id.in_(sub_query)).filter(Attendance.is_valid == True) ) return query.scalar() def fix_duplicate_attendances(db): sub = ( db.query( over( distinct(func.first_value(Attendance.id)), partition_by=[Attendance.employee_id, Attendance.date], order_by=desc(Attendance.creation_date), ) ) .filter(Attendance.is_valid == True) .subquery() ) db.query(Attendance).filter(~Attendance.id.in_(sub)).filter(Attendance.is_valid == True).delete(False)