Spaces:
Sleeping
Sleeping
import gradio as gr | |
import smtplib | |
from email.mime.text import MIMEText | |
from email.mime.multipart import MIMEMultipart | |
import sqlite3 | |
from datetime import datetime | |
import pandas as pd | |
from werkzeug.security import generate_password_hash, check_password_hash | |
import random | |
import string | |
# Database setup | |
conn = sqlite3.connect("attendance.db", check_same_thread=False) | |
cursor = conn.cursor() | |
cursor.execute('''CREATE TABLE IF NOT EXISTS users ( | |
id INTEGER PRIMARY KEY, | |
email TEXT UNIQUE, | |
password TEXT, | |
verified INTEGER DEFAULT 0 | |
)''') | |
cursor.execute('''CREATE TABLE IF NOT EXISTS attendance ( | |
id INTEGER PRIMARY KEY, | |
email TEXT, | |
date TEXT, | |
status TEXT | |
)''') | |
# Helper Functions | |
def generate_random_password(): | |
return ''.join(random.choices(string.ascii_letters + string.digits, k=8)) | |
def send_email(to_email, subject, body): | |
try: | |
print(f"Sending email to {to_email}: {subject}\n{body}") # Mock email sending | |
return "Email sent successfully!" | |
except Exception as e: | |
return f"Failed to send email: {e}" | |
# User Registration | |
user_verification_tokens = {} | |
def register_user(email): | |
random_password = generate_random_password() | |
hashed_password = generate_password_hash(random_password) | |
try: | |
cursor.execute("INSERT INTO users (email, password) VALUES (?, ?)", (email, hashed_password)) | |
conn.commit() | |
# Generate verification link | |
verification_token = ''.join(random.choices(string.ascii_letters + string.digits, k=16)) | |
user_verification_tokens[email] = verification_token | |
verification_link = f"http://localhost/verify/{verification_token}" # Replace with actual host | |
send_email(email, "Verify Your Account", f"Click here to verify your account: {verification_link}\nYour temporary password: {random_password}") | |
return "Registration successful! Check your email to verify your account." | |
except sqlite3.IntegrityError: | |
return "Email already registered." | |
# Verify User | |
def verify_user(token): | |
for email, stored_token in user_verification_tokens.items(): | |
if stored_token == token: | |
cursor.execute("UPDATE users SET verified = 1 WHERE email = ?", (email,)) | |
conn.commit() | |
return "Account verified! Please log in and change your password." | |
return "Invalid verification token." | |
# Change Password | |
def change_password(email, old_password, new_password): | |
cursor.execute("SELECT password FROM users WHERE email = ?", (email,)) | |
result = cursor.fetchone() | |
if result and check_password_hash(result[0], old_password): | |
hashed_new_password = generate_password_hash(new_password) | |
cursor.execute("UPDATE users SET password = ? WHERE email = ?", (hashed_new_password, email)) | |
conn.commit() | |
return "Password changed successfully!" | |
return "Incorrect old password." | |
# Log Attendance | |
def log_attendance(email, status): | |
date = datetime.now().strftime("%Y-%m-%d") | |
cursor.execute("INSERT INTO attendance (email, date, status) VALUES (?, ?, ?)", (email, date, status)) | |
conn.commit() | |
return "Attendance logged!" | |
# Generate Monthly Fees Report | |
def calculate_fees(email): | |
current_month = datetime.now().strftime("%Y-%m") | |
cursor.execute("SELECT COUNT(*) FROM attendance WHERE email = ? AND status = 'Present' AND date LIKE ?", (email, f"{current_month}%")) | |
count_present = cursor.fetchone()[0] | |
total_fees = count_present * 66.67 | |
# Send email with fees details | |
send_email(email, "Monthly Fees", f"You attended {count_present} classes. Your total fees for the month: ${total_fees:.2f}") | |
return f"Fees calculated and email sent: ${total_fees:.2f}" | |
# Gradio Interface | |
def login(email, password): | |
cursor.execute("SELECT password, verified FROM users WHERE email = ?", (email,)) | |
result = cursor.fetchone() | |
if result and check_password_hash(result[0], password): | |
if result[1] == 1: | |
return f"Welcome {email}!", gr.update(visible=True), email | |
else: | |
return "Account not verified. Check your email.", gr.update(visible=False), None | |
return "Invalid credentials.", gr.update(visible=False), None | |
with gr.Blocks() as app: | |
email_state = gr.State() | |
# Login Page | |
with gr.Row(): | |
gr.Markdown("# Attendance Tracker") | |
with gr.Row(): | |
email = gr.Textbox(label="Email") | |
password = gr.Textbox(label="Password", type="password") | |
login_button = gr.Button("Login") | |
login_message = gr.Textbox(label="Message", interactive=False) | |
attendance_section = gr.Group(visible=False) | |
with attendance_section: | |
with gr.Row(): | |
gr.Markdown("### Log Attendance") | |
email_display = gr.Textbox(label="Email", interactive=False) | |
status = gr.Radio(["Present", "Absent"], label="Status") | |
log_button = gr.Button("Log Attendance") | |
attendance_message = gr.Textbox(label="Message", interactive=False) | |
login_button.click(login, inputs=[email, password], outputs=[login_message, attendance_section, email_state]) | |
log_button.click(log_attendance, inputs=[email_state, status], outputs=[attendance_message]) | |
app.launch() | |