Spaces:
Running
Running
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() |