File size: 4,783 Bytes
644ca8a
4d95901
57ebff8
b30c308
 
 
2faaefc
bf5ebfe
644ca8a
4d95901
b30c308
644ca8a
b30c308
4d95901
b30c308
644ca8a
b30c308
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
56db977
b30c308
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
bf5ebfe
b30c308
 
 
 
 
 
 
 
 
 
 
 
 
 
bf5ebfe
 
b30c308
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
57ebff8
b30c308
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
126
127
128
129
import os
import streamlit as st
from azure.cosmos import CosmosClient, PartitionKey
from azure.storage.blob import BlobServiceClient
from azure.cosmos.exceptions import CosmosResourceNotFoundError
import requests
import glob

# Environment Variables
COSMOS_CONNECTION_STRING = os.getenv('COSMOS_CONNECTION_STRING')
BLOB_STORAGE_CONNECTION_STRING = os.getenv('BLOB_STORAGE_CONNECTION_STRING')

# Initialize Azure Clients
cosmos_client = CosmosClient.from_connection_string(COSMOS_CONNECTION_STRING)
blob_service = BlobServiceClient.from_connection_string(BLOB_STORAGE_CONNECTION_STRING)

@st.cache(allow_output_mutation=True)
def get_cosmos_client():
    return cosmos_client

def get_database_client(db_name):
    cosmos_client = get_cosmos_client()
    return cosmos_client.get_database_client(db_name)

def get_container_client(db_name, container_name):
    database_client = get_database_client(db_name)
    return database_client.get_container_client(container_name)

def list_databases():
    cosmos_client = get_cosmos_client()
    return list(cosmos_client.list_databases())

def list_containers(db_name):
    database_client = get_database_client(db_name)
    return list(database_client.list_containers())

def list_items(db_name, container_name):
    container_client = get_container_client(db_name, container_name)
    return list(container_client.read_all_items())

def create_item(db_name, container_name, item_data):
    container_client = get_container_client(db_name, container_name)
    container_client.create_item(body=item_data)

def update_item(db_name, container_name, item_id, new_data):
    container_client = get_container_client(db_name, container_name)
    try:
        item = container_client.read_item(item_id, partition_key=item_id)
        for key in new_data:
            item[key] = new_data[key]
        container_client.replace_item(item_id, item)
    except CosmosResourceNotFoundError:
        st.error("Item not found for update")

def delete_item(db_name, container_name, item_id):
    container_client = get_container_client(db_name, container_name)
    try:
        container_client.delete_item(item_id, partition_key=item_id)
    except CosmosResourceNotFoundError:
        st.error("Item not found for deletion")

def display_cosmos_db_structure():
    # Existing function logic here

def manage_png_images():
    # Get database and container names
    db_properties = next(cosmos_client.list_databases(), None)
    if not db_properties:
        st.error("No database found.")
        return

    db_name = db_properties['id']
    database_client = get_database_client(db_name)
    container_properties = next(database_client.list_containers(), None)
    if not container_properties:
        st.error("No container found.")
        return

    container_name = container_properties['id']
    container_client = get_container_client(db_name, container_name)

    # List existing items
    existing_items = list_items(db_name, container_name)
    existing_ids = {item['id']: item for item in existing_items}

    # Display existing items
    st.subheader("Existing PNG Images")
    for item_id, item in existing_ids.items():
        st.markdown(f"**{item_id}**: {item.get('file_name', 'No file name')}")
        if st.button(f"🗑️ Delete {item_id}", key=f"delete_{item_id}"):
            delete_item(db_name, container_name, item_id)
            st.success(f"Deleted Item: {item_id}")

    # Add or Update PNG files
    st.subheader("Add or Update PNG Images")
    png_files = glob.glob('*.png')
    for file_name in png_files:
        item_id = os.path.splitext(file_name)[0]
        item_data = {"id": item_id, "file_name": file_name}
        if item_id not in existing_ids:
            if st.button(f"➕ Add {item_id}", key=f"add_{item_id}"):
                create_item(db_name, container_name, item_data)
                st.success(f"Added Item: {item_id}")
        else:
            if st.button(f"✏️ Update {item_id}", key=f"update_{item_id}"):
                update_item(db_name, container_name, item_id, {"file_name": file_name})
                st.success(f"Updated Item: {item_id}")


def list_blobs_in_container(container_name):
    container_client = blob_service.get_container_client(container_name)
    return list(container_client.list_blobs())

# UI Elements
if st.button('Show Cosmos DB Structure'):
    display_cosmos_db_structure()

if st.button('Manage PNG Images'):
    manage_png_images()

# Listing Blobs in a Container
blob_container = st.text_input('Enter Blob Container Name')
if st.button('List Blobs in Container'):
    blobs = list_blobs_in_container(blob_container)
    for blob in blobs:
        st.write(blob.name)

# Remaining UI for Azure Blob Storage and Azure Functions as in the original code