Spaces:
Runtime error
Runtime error
| from pathlib import Path | |
| from fastapi import APIRouter, HTTPException, UploadFile, File, Depends | |
| from typing import List, Optional | |
| from pydantic import BaseModel | |
| from datetime import datetime | |
| import os | |
| import email | |
| from email import policy | |
| from email.parser import BytesParser | |
| import dateutil.parser | |
| import io | |
| from app.services.classify_prompt import classify_email_with_prompt | |
| from app.services.email_reader import parse_email_bytes, read_emails_from_directory, parse_email | |
| from app.services.duplicate_checker import check_duplicate | |
| from app.models.email_model import EmailData | |
| from app.models.request_type_model import RequestTypeModel | |
| from app.services.retrieve_email_process import process_single_email | |
| from config import settings | |
| router = APIRouter() | |
| # Define the directory where attachments will be saved | |
| SAVE_DIR = Path(settings.settings.DATA_DIRECTORY_ATTACHMENTS_PATH) | |
| SAVE_FILE_PATH = SAVE_DIR / settings.settings.ALLOWED_PRIORITY_RULES_FILENAME | |
| if not SAVE_DIR.exists(): | |
| SAVE_DIR.mkdir(parents=True, exist_ok=True) | |
| print(f"Directory created: {SAVE_DIR}") | |
| else: | |
| print(f"Directory already exists: {SAVE_DIR}") | |
| async def process_email_files(files: List[UploadFile] = File(...)): | |
| """Processes multiple email files uploaded from form data.""" | |
| results = [] | |
| for file in files: | |
| try: | |
| file_content = await file.read() | |
| email_result = await process_single_email(file_content, file.filename) | |
| if email_result: | |
| email_resp = EmailData( | |
| sender=email_result["sender"], | |
| subject=email_result["subject"], | |
| request_type=email_result["request_type"], | |
| sub_request_type=email_result["sub_request_type"], | |
| confidence_score=email_result["confidence_score"], | |
| duplicate_flag=email_result["duplicate_flag"], | |
| all_extracted_numbers=email_result["extracted_numbers_list"] | |
| ) | |
| results.append(email_resp) | |
| except Exception as e: | |
| print(f"Error processing {file.filename}: {e}") | |
| return results | |
| async def process_email_directory(): | |
| """Processes email files from a directory specified in an environment variable.""" | |
| # directory_path = settings.settings.directory_path | |
| directory_path = Path(settings.settings.DATA_DIRECTORY_EMAILS_PATH) | |
| if not directory_path: | |
| raise HTTPException(status_code=400, detail="EMAIL_DIRECTORY_PATH environment variable not set.") | |
| if not os.path.exists(directory_path) or not os.path.isdir(directory_path): | |
| raise HTTPException(status_code=400, detail=f"Invalid directory path- {directory_path}") | |
| results = [] | |
| email_files = [] | |
| for file in os.listdir(directory_path): | |
| if file.endswith(".eml") or file.endswith(".msg") or file.endswith(".txt"): | |
| email_files.append(os.path.join(directory_path, file)) | |
| for file_path in email_files: | |
| try: | |
| with open(file_path, "rb") as f: | |
| file_content = f.read() | |
| filename = os.path.basename(file_path) | |
| email_result = await process_single_email(file_content, filename) | |
| if email_result: | |
| email_resp = EmailData( | |
| sender=email_result["sender"], | |
| subject=email_result["subject"], | |
| request_type=email_result["request_type"], | |
| sub_request_type=email_result["sub_request_type"], | |
| confidence_score=email_result["confidence_score"], | |
| duplicate_flag=email_result["duplicate_flag"], | |
| all_extracted_numbers=email_result["extracted_numbers_list"] | |
| ) | |
| results.append(email_resp) | |
| except Exception as e: | |
| print(f"Error processing {file_path}: {e}") | |
| return results | |
| async def upload_rules(file: UploadFile = File(...)): | |
| # Validate filename | |
| if file.filename != settings.settings.ALLOWED_PRIORITY_RULES_FILENAME: | |
| raise HTTPException( | |
| status_code=400, | |
| detail=f"Invalid file name. Please use the appropriate file name: {settings.settings.ALLOWED_PRIORITY_RULES_FILENAME}" | |
| ) | |
| # Check if file is a JSON | |
| if file.content_type != "application/json": | |
| raise HTTPException(status_code=400, detail="Only JSON files are allowed.") | |
| # Save file to the specified location | |
| try: | |
| file_content = await file.read() | |
| with open(SAVE_FILE_PATH, "wb") as f: | |
| f.write(file_content) | |
| except Exception as e: | |
| raise HTTPException(status_code=500, detail=f"Error saving file: {e}") | |
| return {"message": "Rules JSON uploaded successfully."} | |