File size: 4,298 Bytes
ef0081c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
130
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)