Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
|
@@ -146,41 +146,31 @@ def find_jobs(file, added_kw, use_ai):
|
|
| 146 |
explanation = refine_with_ai(ranked, resume) if use_ai else ""
|
| 147 |
return table, explanation
|
| 148 |
|
| 149 |
-
# def paginate(table, page):
|
| 150 |
-
# per_page = 10
|
| 151 |
-
# start = (page-1)*per_page
|
| 152 |
-
# return table[start:start+per_page]
|
| 153 |
-
|
| 154 |
# 7️⃣ Jobs in Markdown
|
| 155 |
def jobs_to_markdown(table, page, per_page=PER_PAGE):
|
| 156 |
total = len(table)
|
| 157 |
pages = max(1, math.ceil(total / per_page))
|
| 158 |
page = max(1, min(page, pages))
|
| 159 |
-
start = (page
|
| 160 |
-
|
| 161 |
-
slice = table[start:end]
|
| 162 |
|
| 163 |
-
# Header
|
| 164 |
md = f"**Showing jobs {start+1}–{min(end,total)} of {total} (Page {page}/{pages})**\n\n"
|
| 165 |
md += "| Role | Company | Location | Posted | Score | Apply |\n"
|
| 166 |
md += "| ---- | ------- | -------- | ------ | ----- | ----- |\n"
|
| 167 |
-
|
| 168 |
-
for row in slice:
|
| 169 |
link = f"[Apply]({row['Apply']})" if row['Apply'] else ""
|
| 170 |
md += (
|
| 171 |
f"| {row['Role']} | {row['Company']} | {row['Location']} "
|
| 172 |
f"| {row['Posted']} | {row['Score']} | {link} |\n"
|
| 173 |
)
|
| 174 |
-
# # Append explanation *only* on page 1
|
| 175 |
-
# if page == 1 and explanation:
|
| 176 |
-
# md += "\n---\n**AI Explanation:**\n\n" + explanation
|
| 177 |
return md
|
| 178 |
|
| 179 |
def load_jobs_and_pages(resume, added_kw, use_ai):
|
| 180 |
-
full_table, explanation = find_jobs(resume, added_kw, use_ai)
|
| 181 |
total_pages = max(1, math.ceil(len(full_table) / PER_PAGE))
|
| 182 |
-
|
| 183 |
-
|
|
|
|
| 184 |
|
| 185 |
# 7️⃣ Gradio UI
|
| 186 |
with gr.Blocks(theme=gr.themes.Base()) as demo:
|
|
@@ -193,40 +183,26 @@ with gr.Blocks(theme=gr.themes.Base()) as demo:
|
|
| 193 |
use_ai = gr.Checkbox(label="Use AI to refine explanation", value=False)
|
| 194 |
find_btn = gr.Button("Find Jobs")
|
| 195 |
|
| 196 |
-
|
| 197 |
-
|
| 198 |
-
|
| 199 |
-
|
| 200 |
-
#
|
| 201 |
-
jobs_md = gr.Markdown()
|
| 202 |
-
expl_md = gr.Markdown()
|
| 203 |
-
page_sel = gr.Slider(minimum=1, maximum=1, step=1, value=1, label="Page")
|
| 204 |
|
| 205 |
-
# 1) On
|
|
|
|
| 206 |
find_btn.click(
|
| 207 |
fn=load_jobs_and_pages,
|
| 208 |
inputs=[resume, added, use_ai],
|
| 209 |
-
outputs=[jobs_state,
|
| 210 |
-
).then(
|
| 211 |
-
fn=lambda tbl, pg: jobs_to_markdown(tbl, pg),
|
| 212 |
-
inputs=[jobs_state, page_sel],
|
| 213 |
-
outputs=[jobs_md]
|
| 214 |
)
|
| 215 |
|
| 216 |
-
# 2) On page change
|
| 217 |
page_sel.change(
|
| 218 |
fn=lambda tbl, pg: jobs_to_markdown(tbl, pg),
|
| 219 |
inputs=[jobs_state, page_sel],
|
| 220 |
outputs=[jobs_md]
|
| 221 |
)
|
| 222 |
|
| 223 |
-
# 3) Always render explanation from state
|
| 224 |
-
expl_state.change(
|
| 225 |
-
fn=lambda expl: expl,
|
| 226 |
-
inputs=[expl_state],
|
| 227 |
-
outputs=[expl_md],
|
| 228 |
-
queue=False
|
| 229 |
-
)
|
| 230 |
-
|
| 231 |
if __name__ == "__main__":
|
| 232 |
demo.launch()
|
|
|
|
| 146 |
explanation = refine_with_ai(ranked, resume) if use_ai else ""
|
| 147 |
return table, explanation
|
| 148 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 149 |
# 7️⃣ Jobs in Markdown
|
| 150 |
def jobs_to_markdown(table, page, per_page=PER_PAGE):
|
| 151 |
total = len(table)
|
| 152 |
pages = max(1, math.ceil(total / per_page))
|
| 153 |
page = max(1, min(page, pages))
|
| 154 |
+
start, end = (page-1)*per_page, page*per_page
|
| 155 |
+
slice_ = table[start:end]
|
|
|
|
| 156 |
|
|
|
|
| 157 |
md = f"**Showing jobs {start+1}–{min(end,total)} of {total} (Page {page}/{pages})**\n\n"
|
| 158 |
md += "| Role | Company | Location | Posted | Score | Apply |\n"
|
| 159 |
md += "| ---- | ------- | -------- | ------ | ----- | ----- |\n"
|
| 160 |
+
for row in slice_:
|
|
|
|
| 161 |
link = f"[Apply]({row['Apply']})" if row['Apply'] else ""
|
| 162 |
md += (
|
| 163 |
f"| {row['Role']} | {row['Company']} | {row['Location']} "
|
| 164 |
f"| {row['Posted']} | {row['Score']} | {link} |\n"
|
| 165 |
)
|
|
|
|
|
|
|
|
|
|
| 166 |
return md
|
| 167 |
|
| 168 |
def load_jobs_and_pages(resume, added_kw, use_ai):
|
| 169 |
+
full_table, explanation = find_jobs(resume, added_kw, use_ai)
|
| 170 |
total_pages = max(1, math.ceil(len(full_table) / PER_PAGE))
|
| 171 |
+
slider_update = gr.update(value=1, maximum=total_pages)
|
| 172 |
+
first_page_md = jobs_to_markdown(full_table, 1)
|
| 173 |
+
return full_table, explanation, slider_update, first_page_md
|
| 174 |
|
| 175 |
# 7️⃣ Gradio UI
|
| 176 |
with gr.Blocks(theme=gr.themes.Base()) as demo:
|
|
|
|
| 183 |
use_ai = gr.Checkbox(label="Use AI to refine explanation", value=False)
|
| 184 |
find_btn = gr.Button("Find Jobs")
|
| 185 |
|
| 186 |
+
jobs_state = gr.State([]) # holds full table
|
| 187 |
+
page_sel = gr.Slider(1, 1, step=1, value=1, label="Page")
|
| 188 |
+
jobs_md = gr.Markdown() # shows the current page’s markdown
|
| 189 |
+
expl_md_h = gr.Markdown("### AI Explanation")
|
| 190 |
+
expl_md = gr.Markdown() # shows AI explanation
|
|
|
|
|
|
|
|
|
|
| 191 |
|
| 192 |
+
# 1) On Find Jobs:
|
| 193 |
+
# - load the jobs, explanation, slider max, and first-page markdown
|
| 194 |
find_btn.click(
|
| 195 |
fn=load_jobs_and_pages,
|
| 196 |
inputs=[resume, added, use_ai],
|
| 197 |
+
outputs=[jobs_state, expl_md, page_sel, jobs_md]
|
|
|
|
|
|
|
|
|
|
|
|
|
| 198 |
)
|
| 199 |
|
| 200 |
+
# 2) On page change, re-render only the table markdown
|
| 201 |
page_sel.change(
|
| 202 |
fn=lambda tbl, pg: jobs_to_markdown(tbl, pg),
|
| 203 |
inputs=[jobs_state, page_sel],
|
| 204 |
outputs=[jobs_md]
|
| 205 |
)
|
| 206 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 207 |
if __name__ == "__main__":
|
| 208 |
demo.launch()
|