ibraheem007's picture
Update components/auth.py
008f6c1 verified
import streamlit as st
import uuid
from datetime import datetime
from sqlalchemy.exc import IntegrityError
from db.connection import get_db
from db.models import User
from components.session_manager import set_auth_cookie, clear_auth_cookie
def render_auth_page():
"""Render the authentication page with login and signup forms"""
# Check for existing auth cookie first
if st.session_state.get("authenticated", False):
st.rerun()
return
st.title("🧠 TailorED - AI-Powered Educational Content Generator")
st.info("πŸ’‘ **Tip**: For the best experience, keep this browser tab open while using TailorED. You may need to log in again if you refresh the page.")
st.markdown("---")
# Initialize session state for auth
if "auth_page" not in st.session_state:
st.session_state.auth_page = "login"
# Toggle between login and signup
col1, col2 = st.columns(2)
with col1:
if st.button("πŸ” Login", use_container_width=True,
type="primary" if st.session_state.auth_page == "login" else "secondary"):
st.session_state.auth_page = "login"
st.rerun()
with col2:
if st.button("πŸ“ Sign Up", use_container_width=True,
type="primary" if st.session_state.auth_page == "signup" else "secondary"):
st.session_state.auth_page = "signup"
st.rerun()
st.markdown("---")
# Render the appropriate form
if st.session_state.auth_page == "login":
render_login_form()
else:
render_signup_form()
def render_login_form():
"""Render the login form"""
st.header("πŸ” Login to Your Account")
with st.form("login_form"):
username = st.text_input("πŸ‘€ Username", placeholder="Enter your username")
password = st.text_input("πŸ”’ Password", type="password", placeholder="Enter your password")
if st.form_submit_button("πŸš€ Login", use_container_width=True, type="primary"):
if not username or not password:
st.error("❌ Please fill in all fields")
return
user = authenticate_user(username, password)
if user:
# Successful login
st.session_state.user_id = str(user.id)
st.session_state.username = user.username
st.session_state.fullname = user.fullname
st.session_state.authenticated = True
st.session_state.current_page = "generator"
# Set authentication cookie
set_auth_cookie({
"user_id": str(user.id),
"username": user.username,
"fullname": user.fullname
})
# Update last login
update_last_login(user.id)
st.success(f"βœ… Welcome back, {user.fullname}!")
st.rerun()
else:
st.error("❌ Invalid username or password")
def render_signup_form():
"""Render the signup form"""
st.header("πŸ“ Create New Account")
with st.form("signup_form"):
fullname = st.text_input("πŸ‘€ Full Name", placeholder="Enter your full name")
username = st.text_input("πŸ‘₯ Username", placeholder="Choose a username")
password = st.text_input("πŸ”’ Password", type="password", placeholder="Create a password")
confirm_password = st.text_input("βœ… Confirm Password", type="password", placeholder="Confirm your password")
if st.form_submit_button("🎯 Create Account", use_container_width=True, type="primary"):
# Validation
if not all([fullname, username, password, confirm_password]):
st.error("❌ Please fill in all fields")
return
if password != confirm_password:
st.error("❌ Passwords do not match")
return
if len(password) < 6:
st.error("❌ Password must be at least 6 characters long")
return
if len(username) < 3:
st.error("❌ Username must be at least 3 characters long")
return
# Check if username exists
if check_username_exists(username):
st.error("❌ Username already exists. Please choose another one.")
return
# Create new user
user_id = create_user(fullname, username, password)
if user_id:
st.session_state.user_id = user_id
st.session_state.username = username
st.session_state.fullname = fullname
st.session_state.authenticated = True
st.session_state.current_page = "generator"
# Set authentication cookie
set_auth_cookie({
"user_id": user_id,
"username": username,
"fullname": fullname
})
st.success(f"βœ… Account created successfully! Welcome, {fullname}!")
st.rerun()
else:
st.error("❌ Failed to create account. Please try again.")
def authenticate_user(username, password):
"""Authenticate user with username and password"""
with next(get_db()) as db:
try:
user = db.query(User).filter_by(username=username).first()
if user and user.check_password(password):
return user
return None
except Exception as e:
st.error(f"❌ Authentication error: {e}")
return None
def check_username_exists(username):
"""Check if username already exists"""
with next(get_db()) as db:
try:
user = db.query(User).filter_by(username=username).first()
return user is not None
except Exception as e:
st.error(f"❌ Error checking username: {e}")
return True # Return True to prevent creation on error
def create_user(fullname, username, password):
"""Create a new user account"""
with next(get_db()) as db:
try:
user = User()
user.id = uuid.uuid4()
user.fullname = fullname.strip()
user.username = username.strip().lower()
user.set_password(password)
user.created_at = datetime.utcnow()
db.add(user)
db.commit()
print(f"βœ… Created new user: {username}")
return str(user.id)
except IntegrityError:
db.rollback()
st.error("❌ Username already exists. Please choose another one.")
return None
except Exception as e:
db.rollback()
st.error(f"❌ Error creating user: {e}")
return None
def update_last_login(user_id):
"""Update user's last login timestamp"""
with next(get_db()) as db:
try:
user = db.query(User).filter_by(id=user_id).first()
if user:
user.last_login = datetime.utcnow()
db.commit()
except Exception as e:
print(f"⚠️ Error updating last login: {e}")
def logout():
"""Logout user and clear session"""
clear_auth_cookie()
# Clear all session state
for key in list(st.session_state.keys()):
del st.session_state[key]
# Re-initialize with default auth state
st.session_state.authenticated = False
st.session_state.current_page = "auth"
st.rerun()
def require_auth():
"""Check if user is authenticated, redirect to auth if not"""
if not st.session_state.get("authenticated", False):
st.session_state.current_page = "auth"
st.rerun()