Bayhaqy commited on
Commit
f84580d
·
verified ·
1 Parent(s): 693d05a

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +71 -47
app.py CHANGED
@@ -1,18 +1,33 @@
1
  import gradio as gr
2
  import pandas as pd
3
 
4
- # In-memory data store
5
  df = pd.DataFrame(columns=["USERNAME", "COUNTRYCODE", "SBUCODE", "BRANDCODE", "CONCEPTCODE", "CHANNEL"])
 
6
 
7
- def login(username, password):
8
- if username == "admin" and password == "admin":
9
- return gr.update(visible=False), gr.update(visible=True), True, show_data()
10
- else:
11
- return gr.update(visible=True, value="Invalid credentials"), gr.update(visible=False), False, pd.DataFrame()
12
-
13
  def to_upper(df):
14
  return df.applymap(lambda x: str(x).upper() if pd.notnull(x) else x)
15
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
16
  def bulk_create_or_update(bulk_df):
17
  global df
18
  bulk_df = pd.DataFrame(bulk_df).dropna(how='all')
@@ -21,66 +36,63 @@ def bulk_create_or_update(bulk_df):
21
 
22
  bulk_df = to_upper(bulk_df)
23
 
24
- # Hanya ambil kolom penting
25
  bulk_df = bulk_df[["USERNAME", "COUNTRYCODE", "SBUCODE", "BRANDCODE", "CONCEPTCODE", "CHANNEL"]]
26
 
27
- # Buat index gabungan
28
  merge_keys = ["USERNAME", "COUNTRYCODE", "SBUCODE", "BRANDCODE", "CONCEPTCODE", "CHANNEL"]
29
 
30
- # 1. Remove exact duplicates (same row exists in both)
31
  df_merge = pd.merge(bulk_df, df, on=merge_keys, how='inner')
32
  bulk_df = pd.concat([bulk_df, df_merge]).drop_duplicates(keep=False)
33
 
34
- # 2. Pisahkan insert dan update
35
  existing_usernames = df["USERNAME"].unique()
36
  bulk_existing = bulk_df[bulk_df["USERNAME"].isin(existing_usernames)]
37
  bulk_new = bulk_df[~bulk_df["USERNAME"].isin(existing_usernames)]
38
 
39
- # Update: overwrite rows with same USERNAME
40
  for _, row in bulk_existing.iterrows():
41
  df.loc[df["USERNAME"] == row["USERNAME"], ["COUNTRYCODE", "SBUCODE", "BRANDCODE", "CONCEPTCODE", "CHANNEL"]] = \
42
  row[["COUNTRYCODE", "SBUCODE", "BRANDCODE", "CONCEPTCODE", "CHANNEL"]].values
43
 
44
- # Insert: append rows
45
  df_new = pd.DataFrame(bulk_new)
46
  df = pd.concat([df, df_new], ignore_index=True)
47
 
48
  return show_data()
49
 
 
50
  def delete_entry(index):
51
  global df
52
  try:
53
  idx = int(index)
54
  if 0 <= idx < len(df):
55
  df = df.drop(idx).reset_index(drop=True)
56
- return gr.Textbox.update(value="Deleted."), show_data()
57
  else:
58
- return gr.Textbox.update(value="Index out of range."), show_data()
59
  except:
60
- return gr.Textbox.update(value="Invalid index."), show_data()
61
-
62
- def update_entry(index, username, countrycode, sbucode, brandcode, conceptcode, channel):
63
- global df
64
- try:
65
- idx = int(index)
66
- if 0 <= idx < len(df):
67
- df.at[idx, "USERNAME"] = username.upper()
68
- df.at[idx, "COUNTRYCODE"] = countrycode.upper()
69
- df.at[idx, "SBUCODE"] = sbucode.upper()
70
- df.at[idx, "BRANDCODE"] = brandcode.upper()
71
- df.at[idx, "CONCEPTCODE"] = conceptcode.upper()
72
- df.at[idx, "CHANNEL"] = channel.upper()
73
- return show_data()
74
- else:
75
- return gr.Textbox.update(value=f"Index {index} out of range"), show_data()
76
- except Exception as e:
77
- return gr.Textbox.update(value=f"Error: {e}"), show_data()
78
-
79
- def show_data():
80
- display_df = df.copy()
81
- display_df.index.name = 'Index'
82
- return display_df.reset_index()
83
-
 
84
  with gr.Blocks() as app:
85
  logged_in = gr.State(False)
86
 
@@ -92,33 +104,45 @@ with gr.Blocks() as app:
92
  login_error = gr.Textbox(visible=False, interactive=False, show_label=False)
93
 
94
  with gr.Column(visible=False) as main_section:
95
- gr.Markdown("## Bulk CRUD App (Auto Uppercase + Smart Merge)")
96
 
97
  with gr.Tab("Bulk Create/Update"):
98
  bulk_df = gr.Dataframe(
99
  headers=["USERNAME", "COUNTRYCODE", "SBUCODE", "BRANDCODE", "CONCEPTCODE", "CHANNEL"],
100
  row_count=5,
101
  col_count=(6, "fixed"),
102
- label="Paste or type data (seperti Excel)"
103
  )
104
  bulk_btn = gr.Button("Submit Bulk Data")
105
  bulk_table = gr.Dataframe(label="Resulting Data", interactive=False)
106
 
107
- with gr.Tab("Manual Delete"):
 
 
 
 
108
  del_index = gr.Textbox(label="Index to Delete")
109
  del_btn = gr.Button("Delete")
110
  del_status = gr.Textbox(visible=True, interactive=False, show_label=False)
111
  del_table = gr.Dataframe(label="Data", interactive=False)
112
 
113
- with gr.Tab("View Data"):
114
- view_btn = gr.Button("Refresh Table")
115
- view_table = gr.Dataframe(label="All Data", interactive=False)
 
 
 
 
 
116
 
117
  login_btn.click(fn=login, inputs=[login_user, login_pass],
118
- outputs=[login_error, main_section, logged_in, view_table])
119
-
120
  bulk_btn.click(fn=bulk_create_or_update, inputs=bulk_df, outputs=bulk_table)
121
  del_btn.click(fn=delete_entry, inputs=del_index, outputs=[del_status, del_table])
122
  view_btn.click(fn=show_data, outputs=view_table)
123
 
 
 
 
124
  app.launch()
 
1
  import gradio as gr
2
  import pandas as pd
3
 
4
+ # === In-memory data ===
5
  df = pd.DataFrame(columns=["USERNAME", "COUNTRYCODE", "SBUCODE", "BRANDCODE", "CONCEPTCODE", "CHANNEL"])
6
+ users_df = pd.DataFrame([{"USERNAME": "ADMIN", "PASSWORD": "ADMIN"}]) # default admin login
7
 
8
+ # === Utility Functions ===
 
 
 
 
 
9
  def to_upper(df):
10
  return df.applymap(lambda x: str(x).upper() if pd.notnull(x) else x)
11
 
12
+ def show_data():
13
+ display_df = df.copy()
14
+ display_df.index.name = 'Index'
15
+ return display_df.reset_index()
16
+
17
+ def show_users():
18
+ return users_df.copy()
19
+
20
+ # === Login ===
21
+ def login(username, password):
22
+ username = username.strip().upper()
23
+ password = password.strip()
24
+ matched = users_df[(users_df["USERNAME"] == username) & (users_df["PASSWORD"] == password)]
25
+ if not matched.empty:
26
+ return "", gr.update(visible=False), gr.update(visible=True), True, show_data()
27
+ else:
28
+ return "Invalid credentials", gr.update(visible=True), gr.update(visible=False), False, pd.DataFrame()
29
+
30
+ # === Bulk Create / Update ===
31
  def bulk_create_or_update(bulk_df):
32
  global df
33
  bulk_df = pd.DataFrame(bulk_df).dropna(how='all')
 
36
 
37
  bulk_df = to_upper(bulk_df)
38
 
 
39
  bulk_df = bulk_df[["USERNAME", "COUNTRYCODE", "SBUCODE", "BRANDCODE", "CONCEPTCODE", "CHANNEL"]]
40
 
 
41
  merge_keys = ["USERNAME", "COUNTRYCODE", "SBUCODE", "BRANDCODE", "CONCEPTCODE", "CHANNEL"]
42
 
43
+ # Remove exact duplicates
44
  df_merge = pd.merge(bulk_df, df, on=merge_keys, how='inner')
45
  bulk_df = pd.concat([bulk_df, df_merge]).drop_duplicates(keep=False)
46
 
 
47
  existing_usernames = df["USERNAME"].unique()
48
  bulk_existing = bulk_df[bulk_df["USERNAME"].isin(existing_usernames)]
49
  bulk_new = bulk_df[~bulk_df["USERNAME"].isin(existing_usernames)]
50
 
 
51
  for _, row in bulk_existing.iterrows():
52
  df.loc[df["USERNAME"] == row["USERNAME"], ["COUNTRYCODE", "SBUCODE", "BRANDCODE", "CONCEPTCODE", "CHANNEL"]] = \
53
  row[["COUNTRYCODE", "SBUCODE", "BRANDCODE", "CONCEPTCODE", "CHANNEL"]].values
54
 
 
55
  df_new = pd.DataFrame(bulk_new)
56
  df = pd.concat([df, df_new], ignore_index=True)
57
 
58
  return show_data()
59
 
60
+ # === Delete Entry ===
61
  def delete_entry(index):
62
  global df
63
  try:
64
  idx = int(index)
65
  if 0 <= idx < len(df):
66
  df = df.drop(idx).reset_index(drop=True)
67
+ return "Deleted.", show_data()
68
  else:
69
+ return "Index out of range.", show_data()
70
  except:
71
+ return "Invalid index.", show_data()
72
+
73
+ # === User Management ===
74
+ def add_user(new_username, new_password):
75
+ global users_df
76
+ new_username = new_username.strip().upper()
77
+ new_password = new_password.strip()
78
+ if not new_username or not new_password:
79
+ return "Username/password tidak boleh kosong.", show_users()
80
+
81
+ if new_username in users_df["USERNAME"].values:
82
+ return "Username sudah ada.", show_users()
83
+
84
+ users_df = pd.concat([users_df, pd.DataFrame([{"USERNAME": new_username, "PASSWORD": new_password}])], ignore_index=True)
85
+ return f"User {new_username} ditambahkan.", show_users()
86
+
87
+ def delete_user(del_username):
88
+ global users_df
89
+ del_username = del_username.strip().upper()
90
+ if del_username == "ADMIN":
91
+ return "User ADMIN tidak bisa dihapus.", show_users()
92
+ users_df = users_df[users_df["USERNAME"] != del_username].reset_index(drop=True)
93
+ return f"User {del_username} dihapus.", show_users()
94
+
95
+ # === UI ===
96
  with gr.Blocks() as app:
97
  logged_in = gr.State(False)
98
 
 
104
  login_error = gr.Textbox(visible=False, interactive=False, show_label=False)
105
 
106
  with gr.Column(visible=False) as main_section:
107
+ gr.Markdown("## Input Data User Brand Performance")
108
 
109
  with gr.Tab("Bulk Create/Update"):
110
  bulk_df = gr.Dataframe(
111
  headers=["USERNAME", "COUNTRYCODE", "SBUCODE", "BRANDCODE", "CONCEPTCODE", "CHANNEL"],
112
  row_count=5,
113
  col_count=(6, "fixed"),
114
+ label="Paste or type data"
115
  )
116
  bulk_btn = gr.Button("Submit Bulk Data")
117
  bulk_table = gr.Dataframe(label="Resulting Data", interactive=False)
118
 
119
+
120
+ with gr.Tab("List Data"):
121
+ view_btn = gr.Button("Refresh Table")
122
+ view_table = gr.Dataframe(label="All Data", interactive=False)
123
+
124
  del_index = gr.Textbox(label="Index to Delete")
125
  del_btn = gr.Button("Delete")
126
  del_status = gr.Textbox(visible=True, interactive=False, show_label=False)
127
  del_table = gr.Dataframe(label="Data", interactive=False)
128
 
129
+ with gr.Tab("User Management"):
130
+ new_username = gr.Textbox(label="New Username")
131
+ new_password = gr.Textbox(label="New Password")
132
+ add_user_btn = gr.Button("Add User")
133
+ del_user = gr.Textbox(label="Username to Delete")
134
+ del_user_btn = gr.Button("Delete User")
135
+ user_status = gr.Textbox(visible=True, interactive=False, show_label=False)
136
+ user_table = gr.Dataframe(label="User List", interactive=False)
137
 
138
  login_btn.click(fn=login, inputs=[login_user, login_pass],
139
+ outputs=[login_error, login_section, main_section, logged_in, view_table])
140
+
141
  bulk_btn.click(fn=bulk_create_or_update, inputs=bulk_df, outputs=bulk_table)
142
  del_btn.click(fn=delete_entry, inputs=del_index, outputs=[del_status, del_table])
143
  view_btn.click(fn=show_data, outputs=view_table)
144
 
145
+ add_user_btn.click(fn=add_user, inputs=[new_username, new_password], outputs=[user_status, user_table])
146
+ del_user_btn.click(fn=delete_user, inputs=del_user, outputs=[user_status, user_table])
147
+
148
  app.launch()