WebashalarForML's picture
Update app.py
0922542 verified
import os
import json
from flask import Flask, request, render_template, redirect, url_for, session, flash, send_from_directory, send_file
from werkzeug.utils import secure_filename
from utils.file_to_text import extract_text_based_on_format, preprocess_text
from utils.anoter_to_json import process_uploaded_json
from utils.json_to_spacy import convert_json_to_spacy
from utils.model import train_model
import zipfile
import shutil
app = Flask(__name__)
app.secret_key = 'your_secret_key'
os.umask(0o000)
# Folder paths
app.config['UPLOAD_FOLDER'] = 'uploads/'
app.config['JSON_FOLDER'] = 'JSON/'
app.config['DATA_FOLDER'] = 'data/'
app.config['MODELS_FOLDER'] = 'Models/'
app.config['MAIN_FOLDER'] = os.getcwd()
# Creating Folders if not exists
os.makedirs(app.config['UPLOAD_FOLDER'], exist_ok=True)
os.makedirs(app.config['JSON_FOLDER'], exist_ok=True)
os.makedirs(app.config['DATA_FOLDER'], exist_ok=True)
os.makedirs(app.config['MODELS_FOLDER'], exist_ok=True)
# Verify and check once again if the folders are created or not
if not os.path.exists(app.config['UPLOAD_FOLDER']):
os.makedirs(app.config['UPLOAD_FOLDER'])
if not os.path.exists(app.config['JSON_FOLDER']):
os.makedirs(app.config['JSON_FOLDER'])
if not os.path.exists(app.config['DATA_FOLDER']):
os.makedirs(app.config['DATA_FOLDER'])
if not os.path.exists(app.config['MODELS_FOLDER']):
os.makedirs(app.config['MODELS_FOLDER'])
# Create the empty file
file_path = os.path.join(app.config['DATA_FOLDER'], 'resume_text.txt')
with open(file_path, 'w') as file:
pass
# Allowed file extensions
ALLOWED_EXTENSIONS = {'pdf', 'docx', 'rsf', 'odt', 'png', 'jpg', 'jpeg', 'json'}
# Function to check file extensions
def allowed_file(filename):
return '.' in filename and filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS
# HTML render routes (modify to fit your structure)
@app.route('/')
def index():
return render_template('upload.html')
@app.route('/guide')
def guide():
return render_template('guide.html')
@app.route('/ner_preview', methods=['GET'])
def ner_preview():
return render_template('anoter.html')
@app.route('/json', methods=['GET'])
def json_file():
return render_template('savejson.html')
@app.route('/spacy', methods=['GET'])
def spacy_file():
return render_template('saveSpacy.html')
@app.route('/text_preview', methods=['GET'])
def text_preview():
try:
resume_file_path = os.path.join(app.config['DATA_FOLDER'], 'resume_text.txt')
if not os.path.exists(resume_file_path):
flash('Resume text not found', 'error')
return redirect(url_for('index'))
with open(resume_file_path, 'r') as f:
text = f.read()
return render_template('text.html', text=text)
except Exception as e:
flash(f"Error loading text preview: {str(e)}", 'error')
return redirect(url_for('index'))
# API for uploading Resume files
@app.route('/upload',methods=['GET', 'POST'])
def upload_file():
try:
if 'file' not in request.files:
flash('No file part', 'error')
return redirect(request.url)
file = request.files['file']
if file.filename == '':
flash('No selected file', 'error')
return redirect(request.url)
if file and allowed_file(file.filename):
filename = secure_filename(file.filename)
file_path = os.path.join(app.config['UPLOAD_FOLDER'], filename)
file.save(file_path)
# Handle text extraction for non-JSON files
if not filename.lower().endswith('.json'):
return process_other_files(file_path, filename)
flash('File type not allowed', 'error')
except Exception as e:
flash(f"Error: {str(e)}", 'error')
return redirect(request.url)
# Process non-JSON files, extract text and save to 'resume_text.txt'
def process_other_files(file_path, filename):
try:
extracted_text, _ = extract_text_based_on_format(file_path)
cleaned_text = preprocess_text(extracted_text)
os.makedirs(app.config['DATA_FOLDER'], exist_ok=True)
resume_file_path = os.path.join(app.config['DATA_FOLDER'], 'resume_text.txt')
with open(resume_file_path, 'w', encoding='utf-8') as f:
f.write(cleaned_text)
session['uploaded_file'] = filename
return render_template('text.html', text=cleaned_text)
except Exception as e:
flash(f"Error processing file {filename}: {str(e)}", 'error')
return redirect(request.referrer)
# API to handle the text editing and saving
@app.route('/edit_text', methods=['POST'])
def edit_text():
try:
# Get the edited text from the form
edited_text = request.form['edited_text']
# Save the edited text back to 'resume_text.txt'
resume_file_path = os.path.join(app.config['DATA_FOLDER'], 'resume_text.txt')
with open(resume_file_path, 'w', encoding='utf-8') as f:
f.write(edited_text)
flash('Text edited successfully', 'success')
# Pass the edited text back to the template
return render_template('text.html', text=edited_text)
except Exception as e:
flash(f"Error saving edited text: {str(e)}", 'error')
return redirect(request.referrer)
# API for downloading the 'resume_text.txt' file
@app.route('/download', methods=['GET'])
def download_file():
try:
return send_from_directory(app.config['DATA_FOLDER'], 'resume_text.txt', as_attachment=True)
except Exception as e:
flash(f"Error downloading file: {str(e)}", 'error')
return redirect(request.referrer)
@app.route('/save_and_download', methods=['POST'])
def save_and_download():
try:
# Get the edited text from the form
edited_text = request.form['edited_text']
# Save the edited text back to 'resume_text.txt'
resume_file_path = os.path.join(app.config['DATA_FOLDER'], 'resume_text.txt')
with open(resume_file_path, 'w', encoding='utf-8') as f:
f.write(edited_text)
# flash('Text edited successfully', 'success')
print(f"Saved instace: {app.config['DATA_FOLDER']}/resume_text.txt")
# Now send the file as a download
return send_from_directory(app.config['DATA_FOLDER'], 'resume_text.txt', as_attachment=True)
except Exception as e:
flash(f"Error saving and downloading file: {str(e)}", 'error')
return redirect(request.referrer)
# API for uploading and processing JSON files
@app.route('/upload_json', methods=['POST'])
def upload_json_file():
try:
if 'file' not in request.files:
flash('No file part', 'error')
return redirect(request.url)
file = request.files['file']
if file.filename == '':
flash('No selected file', 'error')
return redirect(request.url)
if file and file.filename.lower().endswith('.json'):
filename = secure_filename(file.filename)
json_path = os.path.join(app.config['JSON_FOLDER'], filename)
os.makedirs(app.config['JSON_FOLDER'], exist_ok=True)
file.save(json_path)
session['uploaded_json'] = filename
flash(f'JSON file {filename} uploaded successfully')
print(f"Saved instace for JSon: {app.config['JSON_FOLDER']}/{filename}")
else:
flash('File type not allowed', 'error')
except Exception as e:
flash(f"Error: {str(e)}", 'error')
return redirect(request.referrer)
# Process uploaded JSON file and save formatted data
@app.route('/process_json', methods=['GET'])
def process_json_file():
try:
json_folder = app.config['JSON_FOLDER']
json_files = os.listdir(json_folder)
if not json_files:
flash('No JSON files found in the folder', 'error')
return redirect(request.referrer)
filename = json_files[0] # Modify logic if needed to handle multiple files
json_path = os.path.join(json_folder, filename)
if not os.path.exists(json_path):
flash(f'JSON file {filename} not found', 'error')
return redirect(request.referrer)
process_uploaded_json(json_path)
os.makedirs(app.config['DATA_FOLDER'], exist_ok=True)
processed_file_path = os.path.join(app.config['DATA_FOLDER'], f'Processed_{filename}')
flash(f'JSON file {filename} processed successfully')
except Exception as e:
flash(f"Error processing JSON file: {str(e)}", 'error')
return redirect(request.referrer)
# API for removing uploaded JSON files
@app.route('/remove_json', methods=['POST'])
def remove_all_json_files():
try:
json_folder = app.config['JSON_FOLDER']
for filename in os.listdir(json_folder):
file_path = os.path.join(json_folder, filename)
if os.path.isfile(file_path):
os.remove(file_path)
session.pop('uploaded_json', None)
flash('All JSON files removed successfully')
except Exception as e:
flash(f"Error removing files: {str(e)}", 'error')
return redirect(request.referrer)
# API for removing non-JSON files
@app.route('/remove', methods=['POST'])
def remove_file():
try:
upload_folder = app.config['UPLOAD_FOLDER']
# Check if the folder exists
if os.path.exists(upload_folder):
# Loop through all files in the upload folder and remove them
for filename in os.listdir(upload_folder):
file_path = os.path.join(upload_folder, filename)
# Check if it is a file and remove it
if os.path.isfile(file_path):
os.remove(file_path)
# Clear session data related to uploaded files
session.pop('uploaded_file', None)
flash('All files removed successfully')
else:
flash(f"Upload folder does not exist", 'error')
except Exception as e:
flash(f"Error removing files: {str(e)}", 'error')
return redirect(url_for('index'))
@app.route('/to_sapcy', methods=['POST'])
def to_sapcy():
try:
# Path to the JSON file
json_file_path = 'data/Json_Data.json'
# Convert the JSON file to a .spacy file
spacy_file_path = 'data/Spacy_data.spacy'
# Call the conversion function
convert_json_to_spacy(json_file_path, spacy_file_path)
flash('Model training data converted successfully', 'success')
except Exception as e:
flash(f"Error during conversion: {str(e)}", 'error')
return redirect(request.referrer)
@app.route('/train_model_endpoint', methods=['POST'])
def train_model_endpoint():
try:
# Get the number of epochs and model version from the request
epochs = int(request.form.get('epochs', 10)) # Default to 10 if not provided
version = request.form.get('model_version', 'v1') # Default to 'v1' if not provided
# Call the training function with user-defined parameters
model_path = f"./Models/ner_model_{version}"
train_model(epochs, model_path)
print(f"Saved instace for Model: app//Models/ner_model_{version}")
flash('Model training completed successfully', 'success')
except Exception as e:
flash(f"Error during training: {str(e)}", 'error')
return redirect(url_for('index'))
# API for removing all files from specific folders
@app.route('/remove_files', methods=['POST'])
def remove_files():
try:
# Define folders to clear
folders_to_clear = [app.config['UPLOAD_FOLDER'], app.config['JSON_FOLDER'], app.config['MODELS_FOLDER'] ]
for folder_path in folders_to_clear:
# Remove all files from the specified folder
for filename in os.listdir(folder_path):
file_path = os.path.join(folder_path, filename)
if os.path.isfile(file_path):
os.remove(file_path)
# Clear session variables related to the removed folders
session.pop('uploaded_file', None)
session.pop('uploaded_json', None)
flash('All files removed from folder successfully')
except Exception as e:
flash(f"Error removing files: {str(e)}", 'error')
return redirect(url_for('index'))
# API for downloading the latest trained model
'''
@app.route('/download_model', methods=['GET'])
def download_latest_model():
try:
models_dir = app.config['MODELS_FOLDER']
model_files = os.listdir(models_dir)
if not model_files:
flash('No model files found', 'error')
return redirect(request.referrer)
# Sort model files and get the latest one
latest_model_file = sorted(model_files, reverse=True)[0]
# Full path to the latest model file
model_path = os.path.join(models_dir, latest_model_file)
if not os.path.exists(model_path):
flash('Model file not found on the server', 'error')
return redirect(request.referrer)
# Create a zip file with the model
zip_filename = os.path.join(models_dir, f"{latest_model_file}.zip")
with zipfile.ZipFile(zip_filename, 'w') as zipf:
zipf.write(model_path, os.path.basename(model_path))
# Send the zip file as a download
return send_file(zip_filename, as_attachment=True)
except Exception as e:
flash(f"Error while downloading the model: {str(e)}", 'error')
return redirect(request.referrer)
'''
@app.route('/download_model', methods=['GET'])
def download_latest_model():
try:
models_dir = app.config['MODELS_FOLDER']
model_files = os.listdir(models_dir)
if not model_files:
flash('No model files found', 'error')
return redirect(request.referrer)
# Sort model files and get the latest one
latest_model_file = sorted(model_files, reverse=True)[0]
# Full path to the latest model file
model_path = os.path.join(models_dir, latest_model_file)
if not os.path.exists(model_path):
flash('Model file not found on the server', 'error')
return redirect(request.referrer)
# Create a zip file with the model
zip_filename = os.path.join(models_dir, f"{latest_model_file}.zip")
# Create a zip file that includes the whole directory structure of the model
with zipfile.ZipFile(zip_filename, 'w', zipfile.ZIP_DEFLATED) as zipf:
# If the model is a directory, zip the whole directory
if os.path.isdir(model_path):
for foldername, subfolders, filenames in os.walk(model_path):
for filename in filenames:
file_path = os.path.join(foldername, filename)
# Write the file, preserving the directory structure
zipf.write(file_path, os.path.relpath(file_path, models_dir))
else:
# If it's just a single file, zip it
zipf.write(model_path, os.path.basename(model_path))
# Send the zip file as a download
return send_file(zip_filename, as_attachment=True)
except Exception as e:
flash(f"Error while downloading the model: {str(e)}", 'error')
return redirect(request.referrer)
# Route to serve uploaded files
@app.route('/<foldername>/zip', methods=['GET'])
def zip_folder(foldername):
# Construct the folder path
folder_path = os.path.join(app.config['MAIN_FOLDER'], foldername)
# Check if the folder exists
if not os.path.exists(folder_path) or not os.path.isdir(folder_path):
abort(404, description="Folder not found")
# Define the zip file name and path
zip_filename = f"{foldername}.zip"
zip_path = os.path.join(app.config['MAIN_FOLDER'], zip_filename)
# Create a zip file of the folder
shutil.make_archive(zip_path[:-4], 'zip', folder_path)
# Send the zipped file to the client
return send_from_directory(app.config['MAIN_FOLDER'], zip_filename, as_attachment=True)
@app.route('/upload_data_file', methods=['GET', 'POST'])
def upload_data_file():
try:
if request.method == 'POST':
if 'file' not in request.files:
flash('No file part', 'error')
return redirect(request.url)
file = request.files['file']
if file.filename == '':
flash('No selected file', 'error')
return redirect(request.url)
filename = secure_filename(file.filename)
file_path = os.path.join(app.config['DATA_FOLDER'], filename)
file.save(file_path)
flash(f'File {filename} uploaded/overwritten successfully!', 'success')
return redirect(url_for('show_data_files'))
except Exception as e:
flash(f"Error: {str(e)}", 'error')
return redirect(request.referrer)
@app.route('/data_files', methods=['GET'])
def show_data_files():
try:
files = os.listdir(app.config['DATA_FOLDER'])
return render_template('data_files.html', files=files)
except Exception as e:
flash(f"Error retrieving files: {str(e)}", 'error')
return redirect(url_for('index'))
@app.route('/download/<filename>', methods=['GET'])
def download_files(filename):
try:
file_path = os.path.join(app.config['DATA_FOLDER'], filename)
return send_file(file_path, as_attachment=True)
except Exception as e:
flash(f"Error downloading {filename}: {str(e)}", 'error')
return redirect(url_for('show_data_files'))
if __name__ == '__main__':
app.run(debug=True)