Spaces:
Running
Running
| 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() |