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()