medibot / user_management.py
abidkh's picture
Final app version before submission.
73d90ba
import streamlit as st
from datetime import datetime
# Import database functions directly here.
# user_management.py is now responsible for handling its own database interactions.
# It should NOT import anything from app.py
# Assuming these functions are defined in database.py
try:
from database import register_user, user_exists, check_user_credentials, save_user_history, get_user_history
except ImportError:
st.error("Could not import database functions in user_management.py. Please ensure database.py exists and contains required functions.")
# Define dummy functions to allow the app to run without a real database.py for now
def get_user_history(user_id):
st.warning("Database function 'get_user_history' not implemented. History will not be persistent.")
return []
def register_user(user_id, full_name, dob, email, password):
st.warning("Database function 'register_user' not implemented. User registration will not be persistent.")
return True # Simulate success
def user_exists(user_id):
st.warning("Database function 'user_exists' not implemented. User existence check will not work.")
return False # Simulate user not existing
def check_user_credentials(user_id, password):
st.warning("Database function 'check_user_credentials' not implemented. Login will not work.")
return False # Simulate login failure
def save_user_history(user_id, symptoms, predicted_diseases):
st.warning("Database function 'save_user_history' not implemented. History saving will not be persistent.")
pass
def render_user_management_sidebar(session_state):
"""
Handles user registration and login forms in the sidebar.
Receives the Streamlit session_state object to manage user login status.
"""
st.sidebar.header("User Management πŸ§‘β€βš•οΈ")
# Check if a user is currently logged in via session_state
if session_state.get("user_id"):
st.sidebar.write(f"Welcome, {session_state.user_id}!")
if st.sidebar.button("Logout", key="logout_button_sidebar"): # Unique key for sidebar button
session_state.user_id = None
session_state.logged_in_user = None # Clear this too upon logout
st.success("Logged out successfully!")
st.rerun() # Rerun to update UI immediately
else:
# Toggle between sign-in and register forms
form_type = st.sidebar.selectbox("Choose Action", ["Sign In", "Register"], key="form_type_sidebar")
if form_type == "Sign In":
with st.sidebar.form("login_form_sidebar"): # Unique form key
st.markdown("### Sign In")
login_user_id = st.text_input("User ID", key="login_user_id_input_sidebar") # Unique widget key
login_password = st.text_input("Password", type="password", key="login_password_input_sidebar") # Unique widget key
submit_login = st.form_submit_button("Sign In")
if submit_login:
if not login_user_id or not login_password:
st.sidebar.error("Please enter both User ID and Password.")
else:
with st.spinner("Signing in..."): # Spinner for login
if check_user_credentials(login_user_id, login_password):
session_state.user_id = login_user_id
session_state.logged_in_user = login_user_id # Set logged_in_user in session state
st.sidebar.success("Signed in successfully!")
st.rerun() # Rerun to update UI with logged-in state
else:
st.sidebar.error("Invalid User ID or Password.")
else: # Register
with st.sidebar.form("register_form_sidebar"): # Unique form key
st.markdown("### Register")
reg_user_id = st.text_input("Choose a unique User ID", key="reg_user_id_input_sidebar") # Unique widget key
full_name = st.text_input("Full Name", key="reg_full_name_input_sidebar") # Unique widget key
dob = st.date_input("Date of Birth", min_value=datetime(1900, 1, 1), max_value=datetime.today(), key="reg_dob_input_sidebar") # Unique widget key
email = st.text_input("Email (optional)", key="reg_email_input_sidebar") # Unique widget key
reg_password = st.text_input("Password", type="password", key="reg_password_input_sidebar") # Unique widget key
submit_register = st.form_submit_button("Register")
if submit_register:
if not reg_user_id or not reg_password or not full_name:
st.sidebar.error("User ID, Full Name, and Password are required.")
else:
with st.spinner("Checking User ID..."): # Spinner for user_exists check
if user_exists(reg_user_id):
st.sidebar.error("User ID already taken. Please choose another.")
else:
with st.spinner("Registering user..."): # Spinner for registration
# Pass dob as a datetime.date object; database function should handle conversion if needed
if register_user(reg_user_id, full_name, dob, email or None, reg_password):
session_state.user_id = reg_user_id
session_state.logged_in_user = reg_user_id # Set logged_in_user in session state
st.sidebar.success("Registered successfully! You are now logged in.")
st.rerun() # Rerun to update UI with logged-in state
else:
st.sidebar.error("Registration failed. Please try again.")
def save_history_to_db_if_logged_in(user_id: str, symptoms: str, predicted_diseases: str):
"""
Saves user interaction history to the database.
This function is called from app.py when a user is logged in.
It directly calls the database function to save data.
"""
# This function assumes user_id is already validated (i.e., user is logged in)
with st.spinner("Saving history..."): # Spinner for saving history
save_user_history(user_id, symptoms, predicted_diseases)