Brian045 commited on
Commit
cf5b48d
·
verified ·
1 Parent(s): 73414c7

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +53 -34
app.py CHANGED
@@ -1,7 +1,7 @@
1
  import gradio as gr
2
  import pandas as pd
3
  import os
4
- from translator_utils import process_rows, download_dataset, LOCAL_FILENAME
5
 
6
  def load_data():
7
  """Load the dataset safely."""
@@ -12,7 +12,6 @@ def load_data():
12
  return pd.DataFrame()
13
  try:
14
  df = pd.read_csv(LOCAL_FILENAME)
15
- # Ensure translation columns exist
16
  if 'Judul_Inggris' not in df.columns:
17
  df['Judul_Inggris'] = ""
18
  if 'Isi_Inggris' not in df.columns:
@@ -26,10 +25,12 @@ def get_pending_data(full_df):
26
  """Filter for rows that are NOT fully translated."""
27
  if full_df.empty:
28
  return full_df
29
- # A row is pending if either Judul_Inggris or Isi_Inggris is empty
30
  mask = (full_df['Judul_Inggris'].str.strip() == "") | (full_df['Isi_Inggris'].str.strip() == "")
31
- # Add a 'Select' column for checkbox, initialized to False
32
  df_view = full_df[mask].copy()
 
 
 
33
  df_view.insert(0, "Select", False)
34
  return df_view
35
 
@@ -40,39 +41,52 @@ def get_history_data(full_df, date_filter=""):
40
  mask = (full_df['Judul_Inggris'].str.strip() != "") & (full_df['Isi_Inggris'].str.strip() != "")
41
  df_view = full_df[mask].copy()
42
 
 
 
 
43
  if date_filter:
44
  df_view = df_view[df_view['Tanggal'].str.contains(date_filter, case=False, na=False)]
45
-
 
 
46
  return df_view
47
 
48
  def on_translate_selected(df_data, token, progress=gr.Progress()):
49
- """
50
- Callback when user clicks 'Translate Selected'.
51
- df_data is the dataframe from the component (with checkboxes).
52
- """
53
- # Filter rows where 'Select' is True
54
- # Gradio Dataframe sends back a pandas DataFrame
55
  selected_rows = df_data[df_data["Select"] == True]
56
 
57
  if selected_rows.empty:
58
  return gr.DataFrame(), gr.DataFrame(), "No rows selected!"
59
 
60
- # We need the ORIGINAL indices.
61
- # Since we filtered the view, the index of the dataframe should still be the original index
62
- # IF we didn't reset_index.
63
- # Let's check. Gradio might reset it or treat it as data.
64
- # To be safe, we rely on the fact that we passed the dataframe with original index?
65
- # Actually Gradio usually converts index to 0..n.
66
- # We should have preserved the original index as a column or rely on matching content?
67
- # Better approach: We passed the DF. Gradio returns the modified DF.
68
- # If the index is preserved, we are good.
69
- # Let's try to trust the index.
70
-
71
- indices = selected_rows.index.tolist()
72
 
73
- # Call backend
74
  updated_df, msg = process_rows(indices, token=token, progress=progress)
75
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
76
  # Refresh views
77
  pending = get_pending_data(updated_df)
78
  history = get_history_data(updated_df)
@@ -87,34 +101,35 @@ with gr.Blocks(title="Auto AI News Translator") as app:
87
  gr.Markdown("# Auto AI News Translator")
88
  gr.Markdown("Translate news from Indonesian to English (with Chunking). Select rows to translate.")
89
 
90
- # Store full data state if needed, but we read from disk to be single-source-of-truth safe
91
- # token input
92
  hf_token = gr.Textbox(label="HF Token (Optional for Persistence)", placeholder="hf_...", type="password")
93
  status_output = gr.Textbox(label="Status", value="Ready", interactive=False)
94
 
95
  with gr.Tabs():
96
  with gr.TabItem("Translate Pending"):
97
  gr.Markdown("Select rows to translate and click Submit.")
98
- # We use wrap=True for long text
99
- # We use interactive=True to allow checking the 'Select' box
100
  pending_df_comp = gr.DataFrame(
101
  value=get_pending_data(load_data()),
102
  label="Pending Translations",
103
  interactive=True,
104
  wrap=True,
105
- datatype=["bool"] + ["str"] * 6 # approximate types
106
  )
107
  translate_btn = gr.Button("Translate Selected Rows", variant="primary")
108
 
109
- with gr.TabItem("History"):
 
110
  date_filter = gr.Textbox(label="Filter by Date (YYYY-MM-DD)")
 
111
  history_df_comp = gr.DataFrame(
112
  value=get_history_data(load_data()),
113
  label="Translation History",
114
- interactive=False,
115
- wrap=True
 
116
  )
117
- date_filter.change(fn=filter_history, inputs=[date_filter], outputs=[history_df_comp])
 
 
118
 
119
  translate_btn.click(
120
  fn=on_translate_selected,
@@ -122,7 +137,11 @@ with gr.Blocks(title="Auto AI News Translator") as app:
122
  outputs=[pending_df_comp, history_df_comp, status_output]
123
  )
124
 
125
- # Auto refresh on load? (Handled by initial value)
 
 
 
 
126
 
127
  if __name__ == "__main__":
128
  app.launch()
 
1
  import gradio as gr
2
  import pandas as pd
3
  import os
4
+ from translator_utils import process_rows, revert_rows, download_dataset, LOCAL_FILENAME
5
 
6
  def load_data():
7
  """Load the dataset safely."""
 
12
  return pd.DataFrame()
13
  try:
14
  df = pd.read_csv(LOCAL_FILENAME)
 
15
  if 'Judul_Inggris' not in df.columns:
16
  df['Judul_Inggris'] = ""
17
  if 'Isi_Inggris' not in df.columns:
 
25
  """Filter for rows that are NOT fully translated."""
26
  if full_df.empty:
27
  return full_df
 
28
  mask = (full_df['Judul_Inggris'].str.strip() == "") | (full_df['Isi_Inggris'].str.strip() == "")
29
+
30
  df_view = full_df[mask].copy()
31
+ df_view.reset_index(inplace=True)
32
+ df_view.rename(columns={'index': 'ID'}, inplace=True)
33
+
34
  df_view.insert(0, "Select", False)
35
  return df_view
36
 
 
41
  mask = (full_df['Judul_Inggris'].str.strip() != "") & (full_df['Isi_Inggris'].str.strip() != "")
42
  df_view = full_df[mask].copy()
43
 
44
+ df_view.reset_index(inplace=True)
45
+ df_view.rename(columns={'index': 'ID'}, inplace=True)
46
+
47
  if date_filter:
48
  df_view = df_view[df_view['Tanggal'].str.contains(date_filter, case=False, na=False)]
49
+
50
+ # Add 'Select' column for Revert functionality
51
+ df_view.insert(0, "Select", False)
52
  return df_view
53
 
54
  def on_translate_selected(df_data, token, progress=gr.Progress()):
55
+ """Callback when user clicks 'Translate Selected'."""
 
 
 
 
 
56
  selected_rows = df_data[df_data["Select"] == True]
57
 
58
  if selected_rows.empty:
59
  return gr.DataFrame(), gr.DataFrame(), "No rows selected!"
60
 
61
+ try:
62
+ indices = selected_rows['ID'].tolist()
63
+ indices = [int(i) for i in indices]
64
+ except KeyError:
65
+ return gr.DataFrame(), gr.DataFrame(), "Error: ID column missing."
 
 
 
 
 
 
 
66
 
 
67
  updated_df, msg = process_rows(indices, token=token, progress=progress)
68
 
69
+ pending = get_pending_data(updated_df)
70
+ history = get_history_data(updated_df)
71
+
72
+ return pending, history, msg
73
+
74
+ def on_revert_selected(df_data, token, progress=gr.Progress()):
75
+ """Callback when user clicks 'Revert Selected'."""
76
+ selected_rows = df_data[df_data["Select"] == True]
77
+
78
+ if selected_rows.empty:
79
+ return gr.DataFrame(), gr.DataFrame(), "No rows selected!"
80
+
81
+ try:
82
+ indices = selected_rows['ID'].tolist()
83
+ indices = [int(i) for i in indices]
84
+ except KeyError:
85
+ return gr.DataFrame(), gr.DataFrame(), "Error: ID column missing."
86
+
87
+ # Call revert
88
+ updated_df, msg = revert_rows(indices, token=token, progress=progress)
89
+
90
  # Refresh views
91
  pending = get_pending_data(updated_df)
92
  history = get_history_data(updated_df)
 
101
  gr.Markdown("# Auto AI News Translator")
102
  gr.Markdown("Translate news from Indonesian to English (with Chunking). Select rows to translate.")
103
 
 
 
104
  hf_token = gr.Textbox(label="HF Token (Optional for Persistence)", placeholder="hf_...", type="password")
105
  status_output = gr.Textbox(label="Status", value="Ready", interactive=False)
106
 
107
  with gr.Tabs():
108
  with gr.TabItem("Translate Pending"):
109
  gr.Markdown("Select rows to translate and click Submit.")
 
 
110
  pending_df_comp = gr.DataFrame(
111
  value=get_pending_data(load_data()),
112
  label="Pending Translations",
113
  interactive=True,
114
  wrap=True,
115
+ datatype=["bool", "number"] + ["str"] * 6
116
  )
117
  translate_btn = gr.Button("Translate Selected Rows", variant="primary")
118
 
119
+ with gr.TabItem("History (Revert Supported)"):
120
+ gr.Markdown("Select rows to delete translation and move back to Pending.")
121
  date_filter = gr.Textbox(label="Filter by Date (YYYY-MM-DD)")
122
+ # History now has checkbox
123
  history_df_comp = gr.DataFrame(
124
  value=get_history_data(load_data()),
125
  label="Translation History",
126
+ interactive=True,
127
+ wrap=True,
128
+ datatype=["bool", "number"] + ["str"] * 6
129
  )
130
+ with gr.Row():
131
+ date_filter.change(fn=filter_history, inputs=[date_filter], outputs=[history_df_comp])
132
+ revert_btn = gr.Button("Revert Selected (Delete & Move to Pending)", variant="stop")
133
 
134
  translate_btn.click(
135
  fn=on_translate_selected,
 
137
  outputs=[pending_df_comp, history_df_comp, status_output]
138
  )
139
 
140
+ revert_btn.click(
141
+ fn=on_revert_selected,
142
+ inputs=[history_df_comp, hf_token],
143
+ outputs=[pending_df_comp, history_df_comp, status_output]
144
+ )
145
 
146
  if __name__ == "__main__":
147
  app.launch()