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'))