AzureCosmosDBUI / app.py
awacke1's picture
Update app.py
32115ec verified
raw
history blame
5.22 kB
import streamlit as st
from azure.cosmos import CosmosClient, exceptions
import os
import pandas as pd
import traceback
import requests
import shutil
import zipfile
from github import Github
from git import Repo
from datetime import datetime
import base64
import json
st.set_page_config(layout="wide")
# ... (keep all the existing imports and configurations)
# New functions for dynamic sidebar
def get_databases(client):
return [db['id'] for db in client.list_databases()]
def get_containers(database):
return [container['id'] for container in database.list_containers()]
def get_documents(container, limit=1000):
query = "SELECT * FROM c"
items = list(container.query_items(query=query, enable_cross_partition_query=True, max_item_count=limit))
return items
# Modify the main app
def main():
st.title("🌟 Cosmos DB and GitHub Integration")
# Initialize session state
if 'logged_in' not in st.session_state:
st.session_state.logged_in = False
if 'selected_records' not in st.session_state:
st.session_state.selected_records = []
if 'client' not in st.session_state:
st.session_state.client = None
if 'selected_database' not in st.session_state:
st.session_state.selected_database = None
if 'selected_container' not in st.session_state:
st.session_state.selected_container = None
# Login section
if not st.session_state.logged_in:
st.subheader("πŸ” Login")
input_key = st.text_input("Enter your Cosmos DB key", type="password")
if st.button("πŸš€ Login"):
if input_key:
st.session_state.primary_key = input_key
st.session_state.logged_in = True
st.rerun()
else:
st.error("Invalid key. Please check your input.")
else:
# Initialize Cosmos DB client
try:
if st.session_state.client is None:
st.session_state.client = CosmosClient(ENDPOINT, credential=st.session_state.primary_key)
# Sidebar for database, container, and document selection
st.sidebar.title("πŸ—„οΈ Cosmos DB Navigator")
databases = get_databases(st.session_state.client)
selected_db = st.sidebar.selectbox("πŸ—ƒοΈ Select Database", databases)
if selected_db != st.session_state.selected_database:
st.session_state.selected_database = selected_db
st.session_state.selected_container = None
st.rerun()
if st.session_state.selected_database:
database = st.session_state.client.get_database_client(st.session_state.selected_database)
containers = get_containers(database)
selected_container = st.sidebar.selectbox("πŸ“ Select Container", containers)
if selected_container != st.session_state.selected_container:
st.session_state.selected_container = selected_container
st.rerun()
if st.session_state.selected_container:
container = database.get_container_client(st.session_state.selected_container)
limit_to_1000 = st.sidebar.checkbox("πŸ”’ Limit to top 1000 documents", value=True)
documents = get_documents(container, limit=1000 if limit_to_1000 else None)
if documents:
document_ids = [doc.get('id', 'Unknown') for doc in documents]
selected_document = st.sidebar.selectbox("πŸ“„ Select Document", document_ids)
if selected_document:
st.subheader(f"πŸ“„ Document Details: {selected_document}")
selected_doc = next((doc for doc in documents if doc.get('id') == selected_document), None)
if selected_doc:
st.json(selected_doc)
else:
st.sidebar.info("No documents found in this container.")
# Main content area
st.subheader(f"πŸ“Š Container: {st.session_state.selected_container}")
if st.session_state.selected_container:
df = pd.DataFrame(documents)
st.dataframe(df)
# ... (keep the rest of your existing code for GitHub operations, etc.)
except exceptions.CosmosHttpResponseError as e:
st.error(f"Failed to connect to Cosmos DB. HTTP error: {str(e)}. Status code: {e.status_code}")
except Exception as e:
st.error(f"An unexpected error occurred: {str(e)}")
# Logout button
if st.session_state.logged_in and st.sidebar.button("πŸšͺ Logout"):
st.session_state.logged_in = False
st.session_state.selected_records.clear()
st.session_state.client = None
st.session_state.selected_database = None
st.session_state.selected_container = None
st.rerun()
if __name__ == "__main__":
main()