|
import logging |
|
import traceback |
|
from flask import Flask, render_template, request, jsonify |
|
import pandas as pd |
|
import json |
|
from joblib import load |
|
import mysql.connector |
|
from mysql.connector import Error |
|
|
|
|
|
from c45 import c45 |
|
|
|
|
|
app = Flask(__name__, static_url_path='/static') |
|
model = None |
|
model = load('/code/model_scratch_2.model') |
|
|
|
|
|
logging.basicConfig(level=logging.DEBUG) |
|
|
|
|
|
|
|
|
|
@app.route("/") |
|
def beranda(): |
|
return render_template('index.html') |
|
|
|
|
|
@app.route("/deteksi", methods=['GET', 'POST']) |
|
def apiDeteksi(): |
|
if request.method == 'POST': |
|
try: |
|
|
|
nama = request.form['Nama'] |
|
posisi_harapan = request.form['Posisi_Harapan'] |
|
usia = int(request.form['Usia']) |
|
|
|
|
|
kategori_umur_obj = request.form.get('KategoriUmur') |
|
if kategori_umur_obj is not None: |
|
kategori_umur_values = json.loads(kategori_umur_obj) |
|
else: |
|
kategori_umur_values = {} |
|
|
|
kategori_umur_values = {f"KategoriUmur[{i}]": int(request.form.get(f"KategoriUmur[{i}]")) for i in range(1, 11)} |
|
kategori_umur_dict = {f"Kategori_Umur_{i}": kategori_umur_values.get(f"KategoriUmur[{i}]", 0) for i in range(1, 11)} |
|
|
|
pendidikan = int(request.form['Pendidikan']) |
|
lama_pengalaman = int(request.form['Lama_Pengalaman']) |
|
kesesuaian_posisi_dg_skills = int(request.form['Kesesuaian_Posisi_Skill']) |
|
kesesuaian_posisi_dg_pengalaman = int(request.form['Kesesuaian_Posisi_Pengalaman']) |
|
|
|
|
|
data = {**kategori_umur_dict, |
|
"Pendidikan": pendidikan, |
|
"Lama_Pengalaman": lama_pengalaman, |
|
"Kesesuaian_Posisi_Skill": kesesuaian_posisi_dg_skills, |
|
"Kesesuaian_Posisi_Pengalaman": kesesuaian_posisi_dg_pengalaman} |
|
|
|
df_test = pd.DataFrame(data, index=[0]) |
|
|
|
|
|
if model is None: |
|
raise Exception("Model not loaded") |
|
|
|
|
|
hasil_prediksi = model.predict(df_test)[0] |
|
|
|
|
|
logging.debug(f"Prediction result: {hasil_prediksi}") |
|
|
|
|
|
if hasil_prediksi == 1: |
|
hasil_prediksi_str = 'Recommended Candidate' |
|
elif hasil_prediksi == 0: |
|
hasil_prediksi_str = 'Not Recommended Candidate' |
|
else: |
|
hasil_prediksi_str = 'Data Tidak Sesuai Dengan Format' |
|
|
|
|
|
try: |
|
connection = mysql.connector.connect(host='sql12.freesqldatabase.com', |
|
database='sql12711336', |
|
user='sql12711336', |
|
password='ufDVxditnx') |
|
if connection.is_connected(): |
|
cursor = connection.cursor(prepared=True) |
|
insert_query = ("INSERT INTO klasifikasi " |
|
"(nama, kategori_umur_1, kategori_umur_2, " |
|
"kategori_umur_3, kategori_umur_4, kategori_umur_5, kategori_umur_6, " |
|
"kategori_umur_7, kategori_umur_8, kategori_umur_9, kategori_umur_10, pendidikan, lama_pengalaman, " |
|
"kesesuaian_posisi_dg_skills, kesesuaian_posisi_dg_pengalaman, " |
|
"posisi_harapan, usia, hasil_prediksi) " |
|
"VALUES " |
|
"(%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)") |
|
|
|
cursor.execute(insert_query, (nama,) + tuple(data.values()) + (posisi_harapan, usia, hasil_prediksi_str)) |
|
connection.commit() |
|
logging.debug("Data berhasil disimpan ke database.") |
|
except Error as e: |
|
logging.error(f"Error while connecting to MySQL: {e}") |
|
finally: |
|
if connection.is_connected(): |
|
cursor.close() |
|
connection.close() |
|
logging.debug("MySQL connection is closed") |
|
|
|
|
|
return jsonify({ |
|
"prediksi": hasil_prediksi_str |
|
}) |
|
except Exception as e: |
|
logging.error(f"Error during prediction: {e}") |
|
logging.error(traceback.format_exc()) |
|
return jsonify({ |
|
"error": "Error during prediction" |
|
}) |
|
|
|
|
|
return render_template('prediksi.html') |
|
|
|
@app.route("/view_tabel", methods=['GET']) |
|
def view_tabel(): |
|
try: |
|
connection = mysql.connector.connect(host='sql12.freesqldatabase.com', |
|
database='sql12711336', |
|
user='sql12711336', |
|
password='ufDVxditnx') |
|
if connection.is_connected(): |
|
cursor = connection.cursor(dictionary=True) |
|
cursor.execute("SELECT * FROM klasifikasi ORDER BY no ASC") |
|
data_tabel = cursor.fetchall() |
|
|
|
|
|
for row in data_tabel: |
|
row['pendidikan'] = ">= S1" if row['pendidikan'] == "1" else "<S1" |
|
row['lama_pengalaman'] = ">=1 Tahun" if row['lama_pengalaman'] == "1" else "<1 Tahun" |
|
row['kesesuaian_posisi_dg_skills'] = "Skills Sesuai Posisi Harapan" if row['kesesuaian_posisi_dg_skills'] == "1" else "Skills Tidak Sesuai Posisi Harapan" |
|
row['kesesuaian_posisi_dg_pengalaman'] = "Pengalaman Sesuai Posisi Harapan" if row['kesesuaian_posisi_dg_pengalaman'] == "1" else "Pengalaman Tidak Sesuai Posisi Harapan" |
|
|
|
return render_template('view_tabel.html', data_tabel=data_tabel) |
|
except Error as e: |
|
logging.error(f"Error while connecting to MySQL: {e}") |
|
finally: |
|
if connection.is_connected(): |
|
cursor.close() |
|
connection.close() |
|
logging.debug("MySQL connection is closed") |
|
|
|
|
|
|
|
if __name__ == '__main__': |
|
|
|
try: |
|
model = load('/code/model_scratch_2.model') |
|
logging.debug("Model loaded successfully") |
|
except Exception as e: |
|
logging.error(f"Error loading model: {e}") |
|
|
|
|
|
app.run(host="0.0.0.0", port=5000, debug=True) |
|
|