Spaces:
Runtime error
Runtime error
File size: 5,713 Bytes
fe6855c f404c1e fe6855c f404c1e 122ab6b f404c1e 0e9da69 f404c1e fe6855c f404c1e fe6855c a2c1dd8 122ab6b fe6855c 122ab6b fe6855c 102b81e fe6855c f404c1e 32af903 f404c1e 32af903 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 |
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}")
@router.post("/process-emails-upload/", response_model=List[EmailData])
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
@router.post("/process-email-directory/", response_model=List[EmailData])
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
@router.post("/upload-priority-rules/",
description="""
Upload a JSON file containing the priority rules for request type identification and numerical extraction.
**Sample JSON file structure:**
```json
{
"priority_rules": {
"is_prioritization_extraction": true,
"request_type_identification": {
"order": ["email_content", "document_content"],
"fallback": "document_content"
},
"numerical_field_extraction": {
"preferred_source": ["attachments"],
"fallback": "email_body"
},
"banking_numeric_keys": [
"loan_amount",
"balance",
"interest_rate"
.......
],
"classification_key_considerations": [
"Any key consideration can add here",
"key 2.",
"key 3",
"....."
]
}
}"
"""
)
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."}
|