You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
148 lines
4.6 KiB
148 lines
4.6 KiB
import streamlit as st |
|
import streamlit_authenticator as stauth |
|
import yaml |
|
from yaml.loader import SafeLoader |
|
from streamlit_authenticator import LoginError |
|
from time import sleep |
|
|
|
from colorprinter.print_color import * |
|
from _arango import ArangoDB |
|
|
|
|
|
def get_settings(): |
|
""" |
|
Function to get the settings from the ArangoDB using the new API. |
|
""" |
|
if "username" not in st.session_state: |
|
return {} |
|
|
|
# Create ArangoDB instance with user's database |
|
arango = ArangoDB(db_name=st.session_state["username"]) |
|
|
|
# Use the get_settings method from the new API |
|
settings = arango.get_settings() |
|
|
|
if settings: |
|
st.session_state["settings"] = settings |
|
else: |
|
# Initialize default settings if none exist |
|
default_settings = {'current_collection': None, 'current_page': None} |
|
arango.initialize_settings(default_settings) |
|
st.session_state["settings"] = default_settings |
|
|
|
return st.session_state["settings"] |
|
|
|
|
|
st.set_page_config(page_title="Science Assistant Fish", page_icon="🐟") |
|
|
|
with open("streamlit_users.yaml") as file: |
|
config = yaml.load(file, Loader=SafeLoader) |
|
|
|
authenticator = stauth.Authenticate( |
|
config["credentials"], |
|
config["cookie"]["name"], |
|
config["cookie"]["key"], |
|
config["cookie"]["expiry_days"], |
|
) |
|
|
|
try: |
|
authenticator.login() |
|
except LoginError as e: |
|
st.error(e) |
|
|
|
if st.session_state["authentication_status"]: |
|
# Set username in session state |
|
st.session_state["username"] = st.session_state["username"] |
|
|
|
sleep(0.1) |
|
# Retry mechanism for importing get_settings |
|
for _ in range(3): |
|
try: |
|
get_settings() |
|
except Exception as e: |
|
sleep(0.3) |
|
print_red(f"Error getting settings: {e}") |
|
print("Retrying to get settings...") |
|
|
|
# Retry mechanism for importing pages |
|
for _ in range(3): |
|
try: |
|
from streamlit_pages import ( |
|
Article_Collections, |
|
Bot_Chat, |
|
Projects, |
|
Settings, |
|
RSS_Feeds, |
|
Research, |
|
Search_Papers |
|
) |
|
break |
|
except ImportError as e: |
|
# Write the full error traceback |
|
sleep(0.3) |
|
print_red(e) |
|
print("Retrying to import pages...") |
|
|
|
st.session_state["settings"] = get_settings() |
|
if isinstance(st.session_state["settings"], dict) and "current_page" in st.session_state["settings"]: |
|
st.session_state["current_page"] = st.session_state["settings"]["current_page"] |
|
else: |
|
if "current_page" not in st.session_state: |
|
st.session_state["current_page"] = None |
|
|
|
if "not_downloaded" not in st.session_state: |
|
st.session_state["not_downloaded"] = {} |
|
|
|
# Pages |
|
bot_chat = st.Page(Bot_Chat) |
|
projects = st.Page(Projects) |
|
article_collections = st.Page(Article_Collections) |
|
settings = st.Page(Settings) |
|
rss_feeds = st.Page(RSS_Feeds) |
|
research = st.Page(Research) |
|
search_papers = st.Page(Search_Papers) |
|
|
|
sleep(0.1) |
|
pg = st.navigation([bot_chat, projects, article_collections, research, search_papers, rss_feeds, settings]) |
|
sleep(0.1) |
|
pg.run() |
|
# try: #TODO Use this when in production |
|
# pg.run() |
|
# except Exception as e: |
|
# print_red(e) |
|
# st.error("An error occurred. The site will be reloaded.") |
|
# import traceback |
|
# from datetime import datetime |
|
# from time import sleep |
|
|
|
# traceback_string = traceback.format_exc() |
|
# traceback.print_exc() |
|
# arango = ArangoDB(db_name="base") |
|
# timestamp = datetime.now().strftime("%Y%m%d-%H%M%S") |
|
# print_rainbow(st.session_state.to_dict()) |
|
# session_state = st.session_state.to_dict() |
|
# if 'bot' in session_state: |
|
# del session_state['bot'] |
|
# arango.insert_document( |
|
# collection_name="error_logs", |
|
# document={ |
|
# "error": traceback_string, |
|
# "_key": timestamp, |
|
# "session_state": session_state, |
|
# }, |
|
# overwrite=True |
|
# ) |
|
# with st.status(":red[An error occurred. The site will be reloaded.]"): |
|
# for i in range(5): |
|
# sleep(1) |
|
# st.write(f"Reloading in {5-i} seconds...") |
|
# st.rerun() |
|
with st.sidebar: |
|
st.write("---") |
|
authenticator.logout() |
|
|
|
|
|
elif st.session_state["authentication_status"] is False: |
|
st.error("Username/password is incorrect") |
|
elif st.session_state["authentication_status"] is None: |
|
st.warning("Please enter your username and password")
|
|
|