Spaces:
Sleeping
Sleeping
import gradio as gr | |
import psycopg2 | |
import pandas as pd | |
DB_CONNECTION_STRING = "postgresql://aws-0-eu-central-1.pooler.supabase.com:6543/postgres" | |
DB_USER = "postgres.fokjwzocbnlqjeifhrop" | |
DB_PASSWORD = "72hj9eKQw5GBMHPn" | |
# Connect to the PostgreSQL database | |
def connect_db(): | |
try: | |
conn = psycopg2.connect( | |
dbname="postgres", | |
user=DB_USER, | |
password=DB_PASSWORD, | |
host=DB_CONNECTION_STRING.split("//")[1].split(":")[0], | |
port=DB_CONNECTION_STRING.split(":")[-1].split("/")[0] | |
) | |
return conn | |
except Exception as e: | |
print("Error connecting to database:", e) | |
return None | |
# Function to create HTML clickable links | |
def make_clickable_wallet_number(df): | |
df['wallet_number'] = df['wallet_number'].apply( | |
lambda x: f'<a href="#" onclick="navigator.clipboard.writeText(\'{x}\'); alert(\'Copied: {x}\')">{x}</a>' | |
) | |
return gr.Dataframe(value=df, interactive=False, datatype="html") | |
# Function to retrieve withdrawal requests | |
def get_withdrawal_requests(filter_status=None): | |
conn = connect_db() | |
if conn is None: | |
return pd.DataFrame() | |
query = """ | |
SELECT wr.request_id, wr.username, wr.amount, wr.status, wr.created_at, wr.completed_at, uw.wallet_number | |
FROM withdrawal_requests wr | |
JOIN user_wallet uw ON wr.wallet_id = uw.id | |
""" | |
if filter_status == "completed": | |
query += " WHERE wr.status = 'completed'" | |
elif filter_status == "incomplete": | |
query += " WHERE wr.status = 'incomplete'" | |
df = pd.read_sql(query, conn) | |
conn.close() | |
return df | |
# Function to update the status of selected requests | |
def update_request_status(selected_ids, new_status): | |
conn = connect_db() | |
if conn is None: | |
return "Error: Could not connect to the database." | |
try: | |
with conn.cursor() as cursor: | |
completed_at_fn = "NOW()" if new_status == "completed" else "NULL" | |
update_query = f""" | |
UPDATE withdrawal_requests | |
SET status = %s, completed_at = {completed_at_fn} WHERE request_id = ANY(%s) | |
""" | |
cursor.execute(update_query, (new_status, "{" + selected_ids + "}")) | |
conn.commit() | |
return f"Updated {len(selected_ids.split(","))} requests to {new_status}." | |
except Exception as e: | |
conn.rollback() | |
return f"Error: {e}" | |
finally: | |
conn.close() | |
# Gradio interface functions | |
def view_requests(filter_option): | |
status_filter = None | |
if filter_option == "Completed Requests": | |
status_filter = "completed" | |
elif filter_option == "Incomplete Requests": | |
status_filter = "incomplete" | |
df = get_withdrawal_requests(filter_status=status_filter) | |
df = make_clickable_wallet_number(df) | |
return df | |
def change_status(selected_ids, new_status): | |
message = update_request_status(selected_ids, new_status) | |
return message | |
# Gradio UI | |
with gr.Blocks() as app: | |
gr.Markdown("# Withdrawal Requests Management") | |
filter_option = gr.Radio( | |
choices=["All Requests", "Completed Requests", "Incomplete Requests"], | |
label="Filter Requests", | |
value="All Requests" | |
) | |
requests_table = gr.Dataframe( | |
label="Withdrawal Requests", | |
interactive=True | |
) | |
refresh_button = gr.Button("Refresh") | |
refresh_button.click( | |
view_requests, inputs=filter_option, outputs=requests_table | |
) | |
selected_ids = gr.Textbox(label="Selected Request IDs (comma-separated)", interactive=True) | |
current_status = gr.Radio( | |
choices=["incomplete", "completed"], | |
label="Set Selected Requests to", | |
value="incomplete" | |
) | |
update_button = gr.Button("Update Status") | |
# Add a Textbox to display the status message | |
status_message = gr.Textbox(label="Status Message", interactive=False) | |
# Updated button click with the correct output | |
update_button.click( | |
change_status, inputs=[selected_ids, current_status], outputs=status_message | |
) | |
# Initial load | |
requests_table.value = view_requests("All Requests") | |
# Run the app | |
app.launch(share=True) |