Interview-Backend/ReadDB.py

87 lines
3.3 KiB
Python

import pandas as pd
import json
from filelock import FileLock, Timeout
import time
from NoSheet import NoSheet
import datetime
"""
TODO change to use new tempate
TODO change names to be more clear
"""
def ReadDatabase():
"""
Reads the database for which slots are available
``REQUIRES``: ``None``
``PROMISES``: ``JSON`` Interview Available Slots
``Developed in part by``: Ahmad, Brock
``Contact``: ahmad.ahmad1@ucalgary.ca, darkicewolf50@gmail.com
"""
year_donation = int(str(datetime.datetime.now().year)[2:]) + 1 # gets the last two digits of the current year then adds 1 for the current season
# name based off the 2025 naming system
# Define the path to the Excel file and the lock file
excel_file_path = f"OR{year_donation}-L-Interview Data.xlsx"
lock_file_path = f"OR{year_donation}-L-Interview Data.xlsx.lock"
# Retry parameters
max_retries = 60 # Maximum number of retries if the file is locked
retry_interval = 0.5 # Wait time (in seconds) between retries
retries = 0
while retries < max_retries:
try:
# Attempt to acquire a shared read (non-blocking) access
with FileLock(lock_file_path, timeout=0): # Non-blocking, checks if the lock exists
# Load the Excel file into a pandas DataFrame
df = pd.read_excel(excel_file_path)
# Initialize the dictionary to store the structured data
interview_data = {}
# Group the DataFrame by Date, Start Time, and Slot for organization
for _, row in df.iterrows():
date = str(row['Date'])
start_time = str(row['Start Time'])
slot = int(row['Slot']) if not pd.isna(row['Slot']) else 0
# Returns the number of interviewees in the slot; returns 0 if empty
interviewee_amount = len(str(row['Interviewee Name']).split()) if str(row['Interviewee Name']) != "nan" else 0
# Check if the slot is available for an interviewee to attend
available_slots = interviewee_amount != slot
if available_slots:
# Initialize nested structure if not present
if date not in interview_data:
interview_data[date] = {}
# Add the start time and duration if not present
if start_time not in interview_data[date]:
interview_data[date][start_time] = {
'Meeting Duration': row['Meeting Duration'],
}
return interview_data # Successfully read the database
except Timeout:
# File is locked; wait and retry
retries += 1
print(f"File is locked, retrying ({retries}/{max_retries})...")
time.sleep(retry_interval)
# If max retries are exceeded, raise an error
raise RuntimeError("Unable to access the database after multiple attempts due to a file lock.")
# Example usage of the ReadDatabase function
if __name__ == "__main__":
try:
data = ReadDatabase()
print(json.dumps(data, indent=4))
except RuntimeError as e:
print(e)