Spaces:
Paused
Paused
File size: 4,466 Bytes
2ae57cb d8acd61 2ae57cb 2445440 2ae57cb 2445440 2ae57cb 2445440 2ae57cb 2445440 2ae57cb 2445440 2ae57cb 2445440 2ae57cb 2445440 2ae57cb d8acd61 3c4bd31 d8acd61 3c4bd31 d8acd61 2ae57cb d8acd61 2ae57cb d8acd61 2ae57cb d8acd61 2ae57cb |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 |
from flask import Blueprint, render_template, redirect, url_for, flash, request, jsonify
from flask_login import login_user, logout_user, login_required, current_user
from werkzeug.utils import secure_filename
import os
import json
from datetime import datetime
from backend.form.AuthForms import LoginForm, SignupForm
from backend.models.user import User
from backend.models.database import db
auth_bp = Blueprint('auth', __name__)
def handle_resume_upload(file):
"""
Handle a resume upload by saving the file to a temporary location and
returning an empty feature dictionary. This function no longer attempts
to parse the resume contents; it simply stores the file so that it can
be referenced later (e.g. for downloading or inspection) and returns
a placeholder features object. A tuple of (features_dict, error_message,
filepath) is returned. If an error occurs, ``features_dict`` will be
``None`` and ``error_message`` will contain a description of the error.
"""
# Validate that a file was provided
if not file or file.filename == '':
return None, "No file uploaded", None
try:
# Generate a safe filename and determine the target directory. Use
# ``/tmp/resumes`` so that the directory is writable within Hugging
# Face Spaces. Creating the directory with ``exist_ok=True`` ensures
# that it is available without raising an error if it already exists.
filename = secure_filename(file.filename)
temp_dir = os.path.join('/tmp', 'resumes')
os.makedirs(temp_dir, exist_ok=True)
filepath = os.path.join(temp_dir, filename)
# Save the uploaded file to the temporary location. If this fails
# (e.g. due to permissions issues) the exception will be caught below.
file.save(filepath)
# Resume parsing has been removed from this project. To maintain
# compatibility with the rest of the application, return an empty
# dictionary of features. Downstream code will interpret an empty
# dictionary as "no extracted features", which still allows the
# interview flow to proceed.
features = {}
return features, None, filepath
except Exception as e:
# Log the error and propagate it to the caller. Returning None for
# ``features`` signals that the upload failed.
print(f"Error in handle_resume_upload: {e}")
return None, str(e), None
@auth_bp.route('/login', methods=['GET', 'POST'])
def login():
form = LoginForm()
# When the form is submitted and passes validation, attempt to authenticate
# the user. If the email/password pair is valid, log them in and provide
# a success flash message so the user has feedback. Without this message
# the application silently redirects to the home page, which can be
# confusing. If authentication fails, flash an error message.
if form.validate_on_submit():
user = User.query.filter_by(email=form.email.data).first()
if user and user.check_password(form.password.data):
login_user(user)
# ✅ Provide a success message so users know the login worked
flash('You have been logged in successfully!', 'success')
return redirect(url_for('index'))
else:
flash('Invalid credentials', 'danger')
return render_template('login.html', form=form)
@auth_bp.route('/signup', methods=['GET', 'POST'])
def signup():
form = SignupForm()
if form.validate_on_submit():
existing_user = User.query.filter_by(email=form.email.data).first()
if existing_user:
flash('Email already registered.', 'warning')
else:
user = User(
username=form.username.data,
email=form.email.data,
role=form.role.data
)
user.set_password(form.password.data)
db.session.add(user)
db.session.commit()
# Log the user in and redirect to profile completion
login_user(user)
flash('Account created successfully! Welcome to Codingo.', 'success')
return redirect(url_for('index'))
return render_template('signup.html', form=form)
@auth_bp.route('/logout')
@login_required
def logout():
logout_user()
flash('You have been logged out successfully.', 'info')
return redirect(url_for('auth.login')) |