added managers apis

This commit is contained in:
OwusuBlessing
2024-09-10 01:00:08 +01:00
parent 0d8ad2381b
commit 286ff0e61e
7 changed files with 371 additions and 213 deletions
+115 -42
View File
@@ -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