Spaces:
Runtime error
Runtime error
Update app/routes.py
Browse files- app/routes.py +22 -9
app/routes.py
CHANGED
|
@@ -14,6 +14,7 @@ from .supabase_config import SUPABASE_URL, SUPABASE_API_KEY
|
|
| 14 |
import secrets
|
| 15 |
import os
|
| 16 |
import requests
|
|
|
|
| 17 |
api = Blueprint('api', __name__)
|
| 18 |
|
| 19 |
SUPABASE_URL = os.getenv("SUPABASE_URL")
|
|
@@ -318,18 +319,25 @@ def docs():
|
|
| 318 |
|
| 319 |
|
| 320 |
allowed_extensions = {'pdf', 'docx'}
|
|
|
|
| 321 |
def allowed_file(filename):
|
| 322 |
return '.' in filename and filename.rsplit('.', 1)[1].lower() in allowed_extensions
|
| 323 |
|
| 324 |
-
|
| 325 |
@auth.route('/try-api', methods=['POST'])
|
| 326 |
def try_api():
|
| 327 |
api_key = request.form.get('api_key')
|
| 328 |
resumes = request.files.getlist('resumes')
|
| 329 |
job_description = request.form.get('job_description')
|
| 330 |
|
| 331 |
-
|
| 332 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 333 |
return redirect(url_for('auth.docs'))
|
| 334 |
|
| 335 |
# Validate API key from Supabase
|
|
@@ -342,23 +350,28 @@ def try_api():
|
|
| 342 |
flash("Invalid API key.")
|
| 343 |
return redirect(url_for('auth.docs'))
|
| 344 |
|
| 345 |
-
#
|
| 346 |
for resume in resumes:
|
| 347 |
if not allowed_file(resume.filename):
|
| 348 |
-
flash("Only PDF or DOCX
|
| 349 |
return redirect(url_for('auth.docs'))
|
|
|
|
| 350 |
|
| 351 |
-
#
|
| 352 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 353 |
|
|
|
|
| 354 |
return render_template('docs.html', response={
|
| 355 |
"job_description": job_description,
|
| 356 |
-
"ranked_resumes": ranked
|
| 357 |
})
|
| 358 |
|
| 359 |
|
| 360 |
|
| 361 |
-
|
| 362 |
@auth.route('/ping-db')
|
| 363 |
def ping_db():
|
| 364 |
try:
|
|
|
|
| 14 |
import secrets
|
| 15 |
import os
|
| 16 |
import requests
|
| 17 |
+
|
| 18 |
api = Blueprint('api', __name__)
|
| 19 |
|
| 20 |
SUPABASE_URL = os.getenv("SUPABASE_URL")
|
|
|
|
| 319 |
|
| 320 |
|
| 321 |
allowed_extensions = {'pdf', 'docx'}
|
| 322 |
+
|
| 323 |
def allowed_file(filename):
|
| 324 |
return '.' in filename and filename.rsplit('.', 1)[1].lower() in allowed_extensions
|
| 325 |
|
|
|
|
| 326 |
@auth.route('/try-api', methods=['POST'])
|
| 327 |
def try_api():
|
| 328 |
api_key = request.form.get('api_key')
|
| 329 |
resumes = request.files.getlist('resumes')
|
| 330 |
job_description = request.form.get('job_description')
|
| 331 |
|
| 332 |
+
# Validate form fields
|
| 333 |
+
if not api_key:
|
| 334 |
+
flash("API key is required.")
|
| 335 |
+
return redirect(url_for('auth.docs'))
|
| 336 |
+
if not resumes:
|
| 337 |
+
flash("Please upload at least one resume.")
|
| 338 |
+
return redirect(url_for('auth.docs'))
|
| 339 |
+
if not job_description:
|
| 340 |
+
flash("Job description is required.")
|
| 341 |
return redirect(url_for('auth.docs'))
|
| 342 |
|
| 343 |
# Validate API key from Supabase
|
|
|
|
| 350 |
flash("Invalid API key.")
|
| 351 |
return redirect(url_for('auth.docs'))
|
| 352 |
|
| 353 |
+
# Validate file types
|
| 354 |
for resume in resumes:
|
| 355 |
if not allowed_file(resume.filename):
|
| 356 |
+
flash(f"Invalid file type: {resume.filename}. Only PDF or DOCX allowed.")
|
| 357 |
return redirect(url_for('auth.docs'))
|
| 358 |
+
resume.filename = secure_filename(resume.filename)
|
| 359 |
|
| 360 |
+
# Run actual ranking logic
|
| 361 |
+
try:
|
| 362 |
+
ranked = rank_resumes_by_semantic_similarity(resumes, job_description)
|
| 363 |
+
except Exception as e:
|
| 364 |
+
flash(f"Error processing resumes: {str(e)}")
|
| 365 |
+
return redirect(url_for('auth.docs'))
|
| 366 |
|
| 367 |
+
# Render results
|
| 368 |
return render_template('docs.html', response={
|
| 369 |
"job_description": job_description,
|
| 370 |
+
"ranked_resumes": ranked # List of dicts with filename and score
|
| 371 |
})
|
| 372 |
|
| 373 |
|
| 374 |
|
|
|
|
| 375 |
@auth.route('/ping-db')
|
| 376 |
def ping_db():
|
| 377 |
try:
|