omarkashif's picture
Update app.py
3a0dd1c verified
import gradio as gr
import csv
from datetime import date
from huggingface_hub import HfApi, HfFolder, hf_hub_download, upload_file
import os
class AttendanceTracker:
def __init__(self, dataset_id, repo_id):
self.courses = ["AI", "DS", "ML","DA Gray","DA Black","DA White","DS6","DS7 Blue","DS7 Green"]
self.dataset_id = dataset_id
self.repo_id = repo_id
self.token = HfFolder.get_token()
def load_original_attendance_list(self, course):
# Download the CSV file using hf_hub_download
local_file_path = hf_hub_download(repo_id=self.dataset_id, filename=f"{course}.csv", repo_type="dataset", use_auth_token=self.token)
return local_file_path
def get_new_column_name(self, existing_header, current_date):
# Determine if the current date is already in the header and generate a new column name if needed
if current_date not in existing_header:
return current_date
# Create a new column name with a suffix
base_name = current_date
suffix = 1
new_column_name = f"{base_name}({suffix})"
while new_column_name in existing_header:
suffix += 1
new_column_name = f"{base_name}({suffix})"
return new_column_name
def mark_attendance(self, attendance_file, course):
local_file_path = self.load_original_attendance_list(course)
# Load existing data from CSV
existing_data = {}
with open(local_file_path, "r") as f:
reader = csv.reader(f)
header = next(reader)
for row in reader:
if row:
name = row[0].strip() # Preserve original case and remove any leading/trailing spaces
existing_data[name.lower()] = row # Store the entire row with the original case
# Debug: Print existing names
print("Existing Names:", existing_data.keys())
# Read the new attendance file
new_attendance_list = []
with open(attendance_file.name, "r") as f:
reader = csv.reader(f)
for row in reader:
if row:
combined_name = f"{row[0].strip()} {row[1].strip()}".lower().lstrip().rstrip() # Combine first and last name and make it lowercase for comparison
new_attendance_list.append(combined_name)
# Debug: Print new attendance names
print("New Attendance Names:", new_attendance_list)
# Get current date and prepare the new column name
current_date = date.today().strftime("%d-%m-%Y")
new_column_name = self.get_new_column_name(header, current_date)
# Prepare updated data including the new date column
updated_rows = []
updated_header = header[:]
if new_column_name not in updated_header:
updated_header.append(new_column_name)
for name_lower, row in existing_data.items():
# Append new status for the new column
status = "Present" if name_lower in new_attendance_list else "Absent"
row.append(status)
updated_rows.append(row)
# Save the updated attendance list locally
with open(local_file_path, "w", newline="") as f:
writer = csv.writer(f)
writer.writerow(updated_header)
writer.writerows(updated_rows)
# Upload the updated file back to the Hugging Face dataset
upload_file(
path_or_fileobj=local_file_path,
path_in_repo=f"{course}.csv",
repo_id=self.repo_id,
repo_type="dataset",
token=self.token
)
return f"Attendance marked successfully for {course}!"
dataset_id = "omarkashif/attendace-ML"
repo_id = "omarkashif/attendace-ML"
tracker = AttendanceTracker(dataset_id, repo_id)
def upload_and_mark(file, course):
return tracker.mark_attendance(file, course)
iface = gr.Interface(
fn=upload_and_mark,
inputs=[gr.File(label="Upload Attendance File (CSV)"), gr.Dropdown(choices=["AI", "DS", "ML","DA Gray","DA Black","DA White","DS6","DS7 Blue","DS7 Green"], label="Select Course")],
outputs=gr.Textbox(label="Status"),
title="Attendance Tracker",
description="Upload a CSV file of today's attendance to update the attendance file for the selected course."
)
iface.launch()