Spaces:
Runtime error
Runtime error
| import sqlite3 | |
| import os | |
| from werkzeug.security import generate_password_hash, check_password_hash | |
| # Path to the SQLite database file in persistent storage | |
| DB_PATH = "/data/users.db" | |
| def get_db_connection(): | |
| """Establishes a connection to the SQLite database.""" | |
| os.makedirs(os.path.dirname(DB_PATH), exist_ok=True) | |
| conn = sqlite3.connect(DB_PATH) | |
| conn.row_factory = sqlite3.Row | |
| return conn | |
| def create_user_table(): | |
| """Creates the users table if it doesn't already exist.""" | |
| conn = get_db_connection() | |
| cursor = conn.cursor() | |
| cursor.execute(''' | |
| CREATE TABLE IF NOT EXISTS users ( | |
| id INTEGER PRIMARY KEY AUTOINCREMENT, | |
| email TEXT UNIQUE NOT NULL, | |
| enrollment_no TEXT UNIQUE, | |
| password_hash TEXT NOT NULL, | |
| role TEXT NOT NULL CHECK(role IN ('student', 'faculty')), | |
| enrolled_by INTEGER, | |
| FOREIGN KEY(enrolled_by) REFERENCES users(id) | |
| ) | |
| ''') | |
| conn.commit() | |
| # Add a default faculty user if one doesn't exist for initial setup | |
| cursor.execute("SELECT * FROM users WHERE role = 'faculty'") | |
| if cursor.fetchone() is None: | |
| print("Creating default faculty user...") | |
| cursor.execute(''' | |
| INSERT INTO users (email, password_hash, role) | |
| VALUES (?,?,?) | |
| ''', ('faculty@ggits.net', generate_password_hash('ggits@123'), 'faculty')) | |
| conn.commit() | |
| print("Default faculty user created: faculty@ggits.net / ggits@123") | |
| conn.close() | |
| def add_student(email, enrollment_no, password, faculty_id): | |
| """Adds a new student to the database, enrolled by a faculty member.""" | |
| if not email.endswith('@ggits.net'): | |
| return "Error: Email must be a @ggits.net address." | |
| conn = get_db_connection() | |
| cursor = conn.cursor() | |
| try: | |
| cursor.execute(''' | |
| INSERT INTO users (email, enrollment_no, password_hash, role, enrolled_by) | |
| VALUES (?,?,?,?,?) | |
| ''', (email, enrollment_no, generate_password_hash(password), 'student', faculty_id)) | |
| conn.commit() | |
| return f"Student {email} enrolled successfully." | |
| except sqlite3.IntegrityError as e: | |
| if 'email' in str(e): | |
| return "Error: A user with this email already exists." | |
| if 'enrollment_no' in str(e): | |
| return "Error: A user with this enrollment number already exists." | |
| return "Error: Could not add student due to a database constraint." | |
| finally: | |
| conn.close() | |
| def verify_user(identifier, password): | |
| """ | |
| Verifies a user's credentials. The identifier can be an email or enrollment number. | |
| Returns the user's data if successful, otherwise None. | |
| """ | |
| conn = get_db_connection() | |
| cursor = conn.cursor() | |
| # Check if identifier is email or enrollment number | |
| if '@' in identifier: | |
| cursor.execute("SELECT * FROM users WHERE email =?", (identifier,)) | |
| else: | |
| cursor.execute("SELECT * FROM users WHERE enrollment_no =?", (identifier,)) | |
| user = cursor.fetchone() | |
| conn.close() | |
| if user and check_password_hash(user['password_hash'], password): | |
| return dict(user) | |
| return None | |