Spaces:
Running
Running
File size: 5,224 Bytes
ff78816 32115ec ff78816 f8257f5 ff78816 f8257f5 ff78816 f8257f5 ff78816 f8257f5 ff78816 f8257f5 ff78816 32115ec ff78816 32115ec ff78816 32115ec f8257f5 32115ec ff78816 32115ec ff78816 32115ec f8257f5 32115ec f8257f5 32115ec f8257f5 32115ec ff78816 f8257f5 32115ec f8257f5 32115ec f8257f5 32115ec |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 |
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() |