waterdb / admin.py
github-actions[bot]
Deploy from GitHub Actions
95805de
import streamlit as st
from config import AppConfig
from pages import log_page_visit
class AuthManager:
def __init__(self, config: AppConfig):
self.config = config
def check_admin_access(self) -> bool:
"""Check if admin access is granted"""
if not self.config.ADMIN_PASSWORD:
return False
return st.session_state.get("admin_authenticated", False)
def is_logged_in(self) -> bool:
"""Check if user is logged in"""
return st.session_state.get("logged_in", False) and st.session_state.get(
"admin_authenticated", False
)
def authenticate(self, username: str, password: str) -> bool:
"""Authenticate user credentials"""
return (
username == "admin"
and password == self.config.ADMIN_PASSWORD
and bool(self.config.ADMIN_PASSWORD)
)
@log_page_visit(page_name="Login")
def login(auth_manager: AuthManager):
"""Handle admin login with proper configuration and state management"""
st.title("Login")
# Redirect if already authenticated
if auth_manager.check_admin_access():
st.success("Already logged in!")
return
with st.form("login_form"):
username = st.text_input("Username")
password = st.text_input("Password", type="password")
submit = st.form_submit_button("Log in")
if submit:
if auth_manager.authenticate(username, password):
st.session_state.update(
{"logged_in": True, "admin_authenticated": True}
)
st.success("Login successful!")
st.rerun()
else:
if not auth_manager.config.ADMIN_PASSWORD:
st.error("Admin access is not configured")
else:
st.error("Invalid username or password")
def logout():
"""Handle admin logout"""
if st.button("Log out"):
st.session_state.update({"logged_in": False, "admin_authenticated": False})
st.rerun()
# Create page objects with auth manager dependency
def create_admin_pages(config: AppConfig):
auth_manager = AuthManager(config)
return {
"login": st.Page(
lambda: login(auth_manager),
title="Log in",
url_path="/login",
icon=":material/login:",
),
"logout": st.Page(logout, title="Log out", icon=":material/logout:"),
}