awacke1 commited on
Commit
904b518
Β·
verified Β·
1 Parent(s): 5dba9db

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +160 -0
app.py ADDED
@@ -0,0 +1,160 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import streamlit as st
2
+ from azure.cosmos import CosmosClient, PartitionKey
3
+ import os
4
+ import pandas as pd
5
+
6
+ # Cosmos DB configuration
7
+ ENDPOINT = "https://acae-afd.documents.azure.com:443/"
8
+ SUBSCRIPTION_ID = "003fba60-5b3f-48f4-ab36-3ed11bc40816"
9
+ # You'll need to set these environment variables or use Azure Key Vault
10
+ DATABASE_NAME = os.environ.get("COSMOS_DATABASE_NAME")
11
+ CONTAINER_NAME = os.environ.get("COSMOS_CONTAINER_NAME")
12
+ Key = os.environ.get("Key")
13
+
14
+ def insert_record(record):
15
+ try:
16
+ response = container.create_item(body=record)
17
+ return True, response
18
+ except Exception as e:
19
+ return False, str(e)
20
+
21
+ def call_stored_procedure(record):
22
+ try:
23
+ response = container.scripts.execute_stored_procedure(
24
+ sproc="processPrompt",
25
+ params=[record],
26
+ partition_key=record['id']
27
+ )
28
+ return True, response
29
+ except Exception as e:
30
+ error_message = f"Error type: {type(e).__name__}\nError message: {str(e)}"
31
+ if hasattr(e, 'sub_status'):
32
+ error_message += f"\nSub-status: {e.sub_status}"
33
+ if hasattr(e, 'response'):
34
+ error_message += f"\nResponse: {e.response}"
35
+ return False, error_message
36
+
37
+ def fetch_all_records():
38
+ query = "SELECT * FROM c"
39
+ items = list(container.query_items(query=query, enable_cross_partition_query=True))
40
+ return pd.DataFrame(items)
41
+
42
+ def bulk_delete_records(ids):
43
+ try:
44
+ # Cosmos DB doesn't support bulk delete directly, so we'll delete items one by one
45
+ for id in ids:
46
+ container.delete_item(item=id, partition_key=id)
47
+ return True, f"Successfully deleted {len(ids)} records"
48
+ except Exception as e:
49
+ return False, f"Error deleting records: {str(e)}"
50
+
51
+ # Streamlit app
52
+ st.title("🌟 Cosmos DB Record Management")
53
+
54
+ # Login section
55
+ if 'logged_in' not in st.session_state:
56
+ st.session_state.logged_in = False
57
+
58
+ if not st.session_state.logged_in:
59
+ st.subheader("πŸ” Login")
60
+ input_key = st.text_input("Enter your key", type="password")
61
+ if st.button("πŸš€ Login"):
62
+ if input_key:
63
+ st.session_state.primary_key = input_key
64
+ st.session_state.logged_in = True
65
+ st.rerun()
66
+ else:
67
+ st.error("Please enter a valid key")
68
+ else:
69
+ # Initialize Cosmos DB client
70
+ client = CosmosClient(ENDPOINT, credential=st.session_state.primary_key)
71
+ database = client.get_database_client(DATABASE_NAME)
72
+ container = database.get_container_client(CONTAINER_NAME)
73
+
74
+ # Fetch and display all records
75
+ st.subheader("πŸ“Š All Records")
76
+ df = fetch_all_records()
77
+
78
+ # Add a checkbox column to the dataframe
79
+ df['select'] = False
80
+
81
+ # Use Streamlit's data editor
82
+ edited_df = st.data_editor(df, num_rows="dynamic", key="data_editor")
83
+
84
+ # Add delete and download buttons
85
+ col1, col2 = st.columns(2)
86
+ with col1:
87
+ if st.button("πŸ—‘οΈ Delete Selected"):
88
+ selected_ids = edited_df[edited_df['select']]['id'].tolist()
89
+ if selected_ids:
90
+ success, message = bulk_delete_records(selected_ids)
91
+ if success:
92
+ st.success(message)
93
+ else:
94
+ st.error(message)
95
+ st.rerun()
96
+ else:
97
+ st.warning("No records selected for deletion.")
98
+
99
+ with col2:
100
+ if st.download_button("πŸ“₯ Download Data", edited_df.to_csv(index=False), "cosmos_db_data.csv", "text/csv"):
101
+ st.success("Data downloaded successfully!")
102
+
103
+ # Input fields for new record
104
+ st.subheader("πŸ“ Enter New Record Details")
105
+ new_id = st.text_input("ID")
106
+ new_name = st.text_input("Name")
107
+ new_document = st.text_area("Document")
108
+ new_evaluation_text = st.text_area("Evaluation Text")
109
+ new_evaluation_score = st.number_input("Evaluation Score", min_value=0, max_value=100, step=1)
110
+
111
+ col1, col2 = st.columns(2)
112
+
113
+ # Insert Record button
114
+ with col1:
115
+ if st.button("πŸ’Ύ Insert Record"):
116
+ record = {
117
+ "id": new_id,
118
+ "name": new_name,
119
+ "document": new_document,
120
+ "evaluationText": new_evaluation_text,
121
+ "evaluationScore": new_evaluation_score
122
+ }
123
+
124
+ success, response = insert_record(record)
125
+ if success:
126
+ st.success("βœ… Record inserted successfully!")
127
+ st.json(response)
128
+ else:
129
+ st.error(f"❌ Failed to insert record: {response}")
130
+ st.rerun()
131
+
132
+ # Call Procedure button
133
+ with col2:
134
+ if st.button("πŸ”§ Call Procedure"):
135
+ record = {
136
+ "id": new_id,
137
+ "name": new_name,
138
+ "document": new_document,
139
+ "evaluationText": new_evaluation_text,
140
+ "evaluationScore": new_evaluation_score
141
+ }
142
+
143
+ success, response = call_stored_procedure(record)
144
+ if success:
145
+ st.success("βœ… Stored procedure executed successfully!")
146
+ st.json(response)
147
+ else:
148
+ st.error(f"❌ Failed to execute stored procedure: {response}")
149
+
150
+ # Logout button
151
+ if st.button("πŸšͺ Logout"):
152
+ st.session_state.logged_in = False
153
+ st.rerun()
154
+
155
+ # Display connection info
156
+ st.sidebar.subheader("πŸ”— Connection Information")
157
+ st.sidebar.text(f"Endpoint: {ENDPOINT}")
158
+ st.sidebar.text(f"Subscription ID: {SUBSCRIPTION_ID}")
159
+ st.sidebar.text(f"Database: {DATABASE_NAME}")
160
+ st.sidebar.text(f"Container: {CONTAINER_NAME}")