Spaces:
Runtime error
Runtime error
Update app/routes.py
Browse files- app/routes.py +60 -13
app/routes.py
CHANGED
|
@@ -393,24 +393,73 @@ def allowed_file(filename):
|
|
| 393 |
return '.' in filename and filename.rsplit('.', 1)[1].lower() in allowed_extensions
|
| 394 |
|
| 395 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 396 |
@auth.route('/try-api', methods=['GET', 'POST'])
|
| 397 |
def try_api():
|
|
|
|
|
|
|
|
|
|
|
|
|
| 398 |
api_key = request.form.get('api_key')
|
| 399 |
resumes = request.files.getlist('resumes')
|
| 400 |
job_description = request.form.get('job_description')
|
| 401 |
|
| 402 |
-
# Validate form fields
|
| 403 |
if not api_key:
|
| 404 |
flash("API key is required.")
|
| 405 |
-
return redirect(url_for('auth.
|
| 406 |
if not resumes:
|
| 407 |
flash("Please upload at least one resume.")
|
| 408 |
-
return redirect(url_for('auth.
|
| 409 |
if not job_description:
|
| 410 |
flash("Job description is required.")
|
| 411 |
-
return redirect(url_for('auth.
|
| 412 |
|
| 413 |
-
# Validate API key from Supabase
|
| 414 |
res = requests.get(
|
| 415 |
f"{SUPABASE_URL}/rest/v1/users?api_key=eq.{api_key}&select=id",
|
| 416 |
headers=HEADERS
|
|
@@ -418,30 +467,28 @@ def try_api():
|
|
| 418 |
|
| 419 |
if res.status_code != 200 or not res.json():
|
| 420 |
flash("Invalid API key.")
|
| 421 |
-
return redirect(url_for('auth.
|
| 422 |
|
| 423 |
-
# Validate file types
|
| 424 |
for resume in resumes:
|
| 425 |
if not allowed_file(resume.filename):
|
| 426 |
flash(f"Invalid file type: {resume.filename}. Only PDF or DOCX allowed.")
|
| 427 |
-
return redirect(url_for('auth.
|
| 428 |
resume.filename = secure_filename(resume.filename)
|
| 429 |
|
| 430 |
-
# Run actual ranking logic
|
| 431 |
try:
|
| 432 |
ranked = rank_resumes_by_semantic_similarity(resumes, job_description)
|
| 433 |
except Exception as e:
|
| 434 |
flash(f"Error processing resumes: {str(e)}")
|
| 435 |
-
return redirect(url_for('auth.
|
| 436 |
|
| 437 |
-
|
| 438 |
-
return render_template('docs.html', response={
|
| 439 |
"job_description": job_description,
|
| 440 |
-
"ranked_resumes": ranked
|
| 441 |
})
|
| 442 |
|
| 443 |
|
| 444 |
|
|
|
|
| 445 |
@auth.route('/ping-db')
|
| 446 |
def ping_db():
|
| 447 |
try:
|
|
|
|
| 393 |
return '.' in filename and filename.rsplit('.', 1)[1].lower() in allowed_extensions
|
| 394 |
|
| 395 |
|
| 396 |
+
# @auth.route('/try-api', methods=['GET', 'POST'])
|
| 397 |
+
# def try_api():
|
| 398 |
+
# api_key = request.form.get('api_key')
|
| 399 |
+
# resumes = request.files.getlist('resumes')
|
| 400 |
+
# job_description = request.form.get('job_description')
|
| 401 |
+
|
| 402 |
+
# # Validate form fields
|
| 403 |
+
# if not api_key:
|
| 404 |
+
# flash("API key is required.")
|
| 405 |
+
# return redirect(url_for('auth.docs'))
|
| 406 |
+
# if not resumes:
|
| 407 |
+
# flash("Please upload at least one resume.")
|
| 408 |
+
# return redirect(url_for('auth.docs'))
|
| 409 |
+
# if not job_description:
|
| 410 |
+
# flash("Job description is required.")
|
| 411 |
+
# return redirect(url_for('auth.docs'))
|
| 412 |
+
|
| 413 |
+
# # Validate API key from Supabase
|
| 414 |
+
# res = requests.get(
|
| 415 |
+
# f"{SUPABASE_URL}/rest/v1/users?api_key=eq.{api_key}&select=id",
|
| 416 |
+
# headers=HEADERS
|
| 417 |
+
# )
|
| 418 |
+
|
| 419 |
+
# if res.status_code != 200 or not res.json():
|
| 420 |
+
# flash("Invalid API key.")
|
| 421 |
+
# return redirect(url_for('auth.docs'))
|
| 422 |
+
|
| 423 |
+
# # Validate file types
|
| 424 |
+
# for resume in resumes:
|
| 425 |
+
# if not allowed_file(resume.filename):
|
| 426 |
+
# flash(f"Invalid file type: {resume.filename}. Only PDF or DOCX allowed.")
|
| 427 |
+
# return redirect(url_for('auth.docs'))
|
| 428 |
+
# resume.filename = secure_filename(resume.filename)
|
| 429 |
+
|
| 430 |
+
# # Run actual ranking logic
|
| 431 |
+
# try:
|
| 432 |
+
# ranked = rank_resumes_by_semantic_similarity(resumes, job_description)
|
| 433 |
+
# except Exception as e:
|
| 434 |
+
# flash(f"Error processing resumes: {str(e)}")
|
| 435 |
+
# return redirect(url_for('auth.docs'))
|
| 436 |
+
|
| 437 |
+
# # Render results
|
| 438 |
+
# return render_template('docs.html', response={
|
| 439 |
+
# "job_description": job_description,
|
| 440 |
+
# "ranked_resumes": ranked # List of dicts with filename and score
|
| 441 |
+
# })
|
| 442 |
+
|
| 443 |
@auth.route('/try-api', methods=['GET', 'POST'])
|
| 444 |
def try_api():
|
| 445 |
+
if request.method == 'GET':
|
| 446 |
+
return render_template('try_api.html', title="Try the ResumeRanker API")
|
| 447 |
+
|
| 448 |
+
# POST logic stays the same
|
| 449 |
api_key = request.form.get('api_key')
|
| 450 |
resumes = request.files.getlist('resumes')
|
| 451 |
job_description = request.form.get('job_description')
|
| 452 |
|
|
|
|
| 453 |
if not api_key:
|
| 454 |
flash("API key is required.")
|
| 455 |
+
return redirect(url_for('auth.try_api'))
|
| 456 |
if not resumes:
|
| 457 |
flash("Please upload at least one resume.")
|
| 458 |
+
return redirect(url_for('auth.try_api'))
|
| 459 |
if not job_description:
|
| 460 |
flash("Job description is required.")
|
| 461 |
+
return redirect(url_for('auth.try_api'))
|
| 462 |
|
|
|
|
| 463 |
res = requests.get(
|
| 464 |
f"{SUPABASE_URL}/rest/v1/users?api_key=eq.{api_key}&select=id",
|
| 465 |
headers=HEADERS
|
|
|
|
| 467 |
|
| 468 |
if res.status_code != 200 or not res.json():
|
| 469 |
flash("Invalid API key.")
|
| 470 |
+
return redirect(url_for('auth.try_api'))
|
| 471 |
|
|
|
|
| 472 |
for resume in resumes:
|
| 473 |
if not allowed_file(resume.filename):
|
| 474 |
flash(f"Invalid file type: {resume.filename}. Only PDF or DOCX allowed.")
|
| 475 |
+
return redirect(url_for('auth.try_api'))
|
| 476 |
resume.filename = secure_filename(resume.filename)
|
| 477 |
|
|
|
|
| 478 |
try:
|
| 479 |
ranked = rank_resumes_by_semantic_similarity(resumes, job_description)
|
| 480 |
except Exception as e:
|
| 481 |
flash(f"Error processing resumes: {str(e)}")
|
| 482 |
+
return redirect(url_for('auth.try_api'))
|
| 483 |
|
| 484 |
+
return render_template('try_api.html', response={
|
|
|
|
| 485 |
"job_description": job_description,
|
| 486 |
+
"ranked_resumes": ranked
|
| 487 |
})
|
| 488 |
|
| 489 |
|
| 490 |
|
| 491 |
+
|
| 492 |
@auth.route('/ping-db')
|
| 493 |
def ping_db():
|
| 494 |
try:
|