added managers apis
This commit is contained in:
+115
-42
@@ -2,7 +2,7 @@ import os
|
||||
from flask import Blueprint, request, jsonify, current_app
|
||||
from werkzeug.utils import secure_filename
|
||||
from src.services.sop_generator import (SopPersonalAssessment,SopGeneratorExecutive)
|
||||
from src.services.document_parser import DocumentParser
|
||||
from src.services.sop_document_parser import DocumentParser
|
||||
|
||||
from src.utils.utils import delete_all_files_in_directory
|
||||
from src.utils.document_loader import load_document
|
||||
@@ -384,64 +384,137 @@ def generate_sops_from_questionnaire():
|
||||
|
||||
|
||||
|
||||
@sops_bp.route('/executive/get_roles_doc', methods=['POST'])
|
||||
def generate_sops_from_questionnaire():
|
||||
@sops_bp.route('/executive/get_roles_for_reference_managers', methods=['POST'])
|
||||
def get_roles_for_reference_managers():
|
||||
try:
|
||||
# Retrieve form data
|
||||
reference_roles = request.get_json().get('reference_roles') # List of reference roles in JSON format
|
||||
document = request.files.get('document') # The uploaded document
|
||||
reference_roles_text = request.form.get('reference_roles') # Reference roles sent as text
|
||||
file = request.files.get('document') # The uploaded document
|
||||
|
||||
if not reference_roles or not document:
|
||||
if not reference_roles_text or not file:
|
||||
return jsonify({"error": "Missing data", "message": "Reference roles or document not provided."}), 400
|
||||
|
||||
if file.filename == '':
|
||||
return jsonify({"error": "No selected file", "message": "A file was not selected for upload. Please select a valid file."}), 400
|
||||
|
||||
# Use extractor to extract roles from the document
|
||||
extractor = DocumentParser()
|
||||
extracted_data = extractor.extract_departments_and_managers_workers([document])
|
||||
# Convert reference_roles_text to JSON (list)
|
||||
try:
|
||||
reference_roles = json.loads(reference_roles_text) # Convert text to JSON (list)
|
||||
except json.JSONDecodeError:
|
||||
return jsonify({"error": "Invalid format", "message": "The reference roles should be in a valid JSON format."}), 400
|
||||
|
||||
if not extracted_data:
|
||||
return jsonify({"error": "Extraction error", "message": "No roles were extracted from the document."}), 400
|
||||
if file and allowed_file(file.filename):
|
||||
filename = secure_filename(file.filename)
|
||||
upload_folder = current_app.config['UPLOAD_FOLDER']
|
||||
file_path = os.path.join(upload_folder, filename)
|
||||
|
||||
file.save(file_path)
|
||||
docs = load_document(file_path)
|
||||
|
||||
# Extract all managers with their name, title (position), and classification (role: PRP or SRP)
|
||||
extracted_managers = []
|
||||
for department in extracted_data['departments']:
|
||||
extracted_managers.extend([{
|
||||
'name': manager['name'],
|
||||
'position': manager.get('position', 'Unknown Position'), # Assuming title is the position
|
||||
'role': manager.get('classification', 'Unknown Role') # PRP or SRP classification
|
||||
} for manager in department['managers']])
|
||||
# Use extractor to extract roles from the document
|
||||
extractor = DocumentParser()
|
||||
roles_comparison_with_doc = extractor.extract_roles_with_reference_managers(docs=docs, reference_roles=reference_roles)
|
||||
|
||||
# Prepare assigned, unassigned, and unavailable managers
|
||||
assigned_managers = [manager for manager in extracted_managers if manager['name'] in reference_roles]
|
||||
unassigned_managers = [{'name': role, 'position': 'Reference Role', 'role': 'N/A'} for role in reference_roles if role not in [manager['name'] for manager in extracted_managers]]
|
||||
unavailable_managers = [manager for manager in extracted_managers if manager['name'] not in reference_roles]
|
||||
if not roles_comparison_with_doc:
|
||||
return jsonify({"error": "Processing error", "message": "No roles found matching the reference roles."}), 404
|
||||
|
||||
# Return the results with detailed manager information
|
||||
return jsonify({
|
||||
"assigned_roles": assigned_managers,
|
||||
"unassigned_roles": unassigned_managers,
|
||||
"unavailable_roles": unavailable_managers
|
||||
}), 200
|
||||
return jsonify({"roles_info": roles_comparison_with_doc, "message": "Roles comparison successfully generated."}), 200
|
||||
|
||||
except Exception as e:
|
||||
return jsonify({"error": "Processing error", "message": f"An error occurred while processing the request: {str(e)}"}), 500
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
assigned_roles = [role for role in reference_roles if role in extracted_roles]
|
||||
unassigned_roles = [role for role in reference_roles if role not in extracted_roles]
|
||||
unavailable_roles = [role for role in extracted_roles if role not in reference_roles]
|
||||
|
||||
# Return the results
|
||||
return jsonify({
|
||||
"assigned_roles": assigned_roles,
|
||||
"unassigned_roles": unassigned_roles,
|
||||
"unavailable_roles": unavailable_roles
|
||||
}), 200
|
||||
|
||||
|
||||
|
||||
@sops_bp.route('/manager/get_roles_for_reference_workers', methods=['POST'])
|
||||
def get_roles_for_reference_workers():
|
||||
try:
|
||||
# Retrieve form data
|
||||
reference_roles_text = request.form.get('reference_roles') # Reference roles sent as text
|
||||
file = request.files.get('document') # The uploaded document
|
||||
|
||||
if not reference_roles_text or not file:
|
||||
return jsonify({"error": "Missing data", "message": "Reference roles or document not provided."}), 400
|
||||
|
||||
if file.filename == '':
|
||||
return jsonify({"error": "No selected file", "message": "A file was not selected for upload. Please select a valid file."}), 400
|
||||
|
||||
# Convert reference_roles_text to JSON (list)
|
||||
try:
|
||||
reference_roles = json.loads(reference_roles_text) # Convert text to JSON (list)
|
||||
except json.JSONDecodeError:
|
||||
return jsonify({"error": "Invalid format", "message": "The reference roles should be in a valid JSON format."}), 400
|
||||
|
||||
if file and allowed_file(file.filename):
|
||||
filename = secure_filename(file.filename)
|
||||
upload_folder = current_app.config['UPLOAD_FOLDER']
|
||||
file_path = os.path.join(upload_folder, filename)
|
||||
|
||||
file.save(file_path)
|
||||
docs = load_document(file_path)
|
||||
|
||||
# Use extractor to extract roles from the document
|
||||
extractor = DocumentParser()
|
||||
roles_comparison_with_doc = extractor.extract_roles_with_reference_workers(docs=docs, reference_roles=reference_roles)
|
||||
|
||||
if not roles_comparison_with_doc:
|
||||
return jsonify({"error": "Processing error", "message": "No roles found matching the reference roles."}), 404
|
||||
|
||||
return jsonify({"roles_info": roles_comparison_with_doc, "message": "Roles comparison successfully generated."}), 200
|
||||
|
||||
except Exception as e:
|
||||
return jsonify({"error": "Processing error", "message": f"An error occurred while processing the request: {str(e)}"}), 500
|
||||
|
||||
|
||||
@sops_bp.route('/manager/generate_sop_workers_doc', methods=['POST'])
|
||||
def generate_sop_workers_doc():
|
||||
try:
|
||||
# Check if the document is provided
|
||||
if 'document' not in request.files:
|
||||
return jsonify({"error": "No file part", "message": "Please upload a file with the key 'document'."}), 400
|
||||
|
||||
file = request.files['document']
|
||||
|
||||
# Check if the file is selected
|
||||
if file.filename == '':
|
||||
return jsonify({"error": "No selected file", "message": "A file was not selected for upload. Please select a valid file."}), 400
|
||||
|
||||
# Check if the file type is allowed
|
||||
if file and allowed_file(file.filename):
|
||||
filename = secure_filename(file.filename)
|
||||
upload_folder = current_app.config['UPLOAD_FOLDER']
|
||||
file_path = os.path.join(upload_folder, filename)
|
||||
file.save(file_path)
|
||||
else:
|
||||
return jsonify({"error": "File type not allowed", "message": "The uploaded file type is not allowed. Please upload a PDF, DOC, or DOCX file."}), 400
|
||||
|
||||
# Get workers information from the form data (passed as JSON text)
|
||||
workers_info_text = request.form.get('workers_info')
|
||||
if not workers_info_text:
|
||||
return jsonify({"error": "Missing data", "message": "Workers info is required in the form data."}), 400
|
||||
|
||||
# Load workers information as a list of dictionaries
|
||||
try:
|
||||
workers_list = json.loads(workers_info_text)
|
||||
except json.JSONDecodeError:
|
||||
return jsonify({"error": "Invalid data format", "message": "Workers info should be a valid JSON array."}), 400
|
||||
|
||||
# Now load the document
|
||||
docs = load_document(file_path)
|
||||
|
||||
# Generate SOPs for workers by department using SopGeneratorExecutive
|
||||
sop_generator = DocumentParser()
|
||||
result = sop_generator.extract_sops_for_workers_by_department(docs, workers_list)
|
||||
|
||||
# Clean up the file
|
||||
delete_all_files_in_directory(upload_folder)
|
||||
|
||||
if not result:
|
||||
return jsonify({"error": "Processing error", "message": "Failed to generate SOPs for workers."}), 500
|
||||
|
||||
return jsonify({"sops": result, "message": "SOPs successfully generated for workers."}), 200
|
||||
|
||||
except Exception as e:
|
||||
delete_all_files_in_directory(upload_folder)
|
||||
return jsonify({"error": "Processing error", "message": f"An error occurred while processing the document: {str(e)}"}), 500
|
||||
|
||||
Reference in New Issue
Block a user