|
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 |
|
|
|
|
|
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 |
|
)''') |
|
|
|
|
|
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}") |
|
return "Email sent successfully!" |
|
except Exception as e: |
|
return f"Failed to send email: {e}" |
|
|
|
|
|
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() |
|
|
|
|
|
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}" |
|
|
|
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." |
|
|
|
|
|
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." |
|
|
|
|
|
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." |
|
|
|
|
|
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!" |
|
|
|
|
|
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(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}" |
|
|
|
|
|
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() |
|
|
|
|
|
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() |
|
|