import sqlite3 from datetime import datetime def get_conn(): return sqlite3.connect("attendance.db") def init_db(): conn = get_conn() cursor = conn.cursor() cursor.execute("""CREATE TABLE IF NOT EXISTS users ( id INTEGER PRIMARY KEY, name TEXT, email TEXT UNIQUE, password TEXT, role TEXT, class_id TEXT, device_id TEXT )""") cursor.execute("""CREATE TABLE IF NOT EXISTS sessions ( id INTEGER PRIMARY KEY, class_id TEXT, date TEXT, is_open INTEGER )""") cursor.execute("""CREATE TABLE IF NOT EXISTS attendance_logs ( id INTEGER PRIMARY KEY, session_id INTEGER, student_email TEXT, timestamp TEXT )""") conn.commit() conn.close() def add_student(name, email, password, class_id): conn = get_conn() cursor = conn.cursor() try: cursor.execute("INSERT INTO users (name, email, password, role, class_id) VALUES (?, ?, ?, 'student', ?)", (name, email, password, class_id)) conn.commit() except sqlite3.IntegrityError: return "Email already exists." finally: conn.close() return "Student added successfully." def get_user_role(email): conn = get_conn() cursor = conn.cursor() cursor.execute("SELECT role FROM users WHERE email=?", (email,)) row = cursor.fetchone() conn.close() return row[0] if row else None def get_sessions(class_id): conn = get_conn() cursor = conn.cursor() cursor.execute("SELECT id, date, is_open FROM sessions WHERE class_id=? ORDER BY date DESC", (class_id,)) rows = cursor.fetchall() conn.close() return rows def toggle_session(class_id, is_open): date = datetime.now().strftime("%Y-%m-%d %H:%M") conn = get_conn() cursor = conn.cursor() cursor.execute("INSERT INTO sessions (class_id, date, is_open) VALUES (?, ?, ?)", (class_id, date, int(is_open))) conn.commit() conn.close() return f"Session {'opened' if is_open else 'closed'} for {class_id} on {date}" def get_open_session(class_id): conn = get_conn() cursor = conn.cursor() cursor.execute("SELECT id FROM sessions WHERE class_id=? AND is_open=1 ORDER BY date DESC LIMIT 1", (class_id,)) row = cursor.fetchone() conn.close() return row[0] if row else None def has_marked_attendance(student_email, session_id): conn = get_conn() cursor = conn.cursor() cursor.execute("SELECT COUNT(*) FROM attendance_logs WHERE student_email=? AND session_id=?", (student_email, session_id)) count = cursor.fetchone()[0] conn.close() return count > 0 def mark_attendance(student_email, session_id): timestamp = datetime.now().strftime("%Y-%m-%d %H:%M") conn = get_conn() cursor = conn.cursor() cursor.execute("INSERT INTO attendance_logs (student_email, session_id, timestamp) VALUES (?, ?, ?)", (student_email, session_id, timestamp)) conn.commit() conn.close() return "Attendance marked successfully." def get_attendance_summary(student_email): conn = get_conn() cursor = conn.cursor() cursor.execute(""" SELECT s.date, s.class_id FROM attendance_logs a JOIN sessions s ON a.session_id = s.id WHERE a.student_email=? ORDER BY s.date DESC LIMIT 10 """, (student_email,)) records = cursor.fetchall() conn.close() return "\n".join([f"{row[0]} - {row[1]}" for row in records]) if records else "No attendance records yet."