awacke1 commited on
Commit
f6fc946
Β·
verified Β·
1 Parent(s): e76b868

Create app.py

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