File size: 4,189 Bytes
97132db
af5935b
fad436e
 
 
97132db
fad436e
 
97132db
fad436e
 
97132db
fad436e
 
 
 
c676e89
fad436e
 
1acf205
fad436e
 
 
d2b54c3
97132db
 
d2b54c3
97132db
 
135b203
97132db
fad436e
97132db
fad436e
97132db
 
 
d2b54c3
97132db
fad436e
97132db
 
 
fad436e
97132db
 
 
f8f385d
 
d2b54c3
fad436e
97132db
d2b54c3
b2d1824
97132db
fad436e
57952eb
fad436e
230d404
 
fad436e
57952eb
230d404
57952eb
fad436e
 
824f4e9
fad436e
 
57952eb
fad436e
 
 
 
 
57952eb
fad436e
 
 
57952eb
fad436e
 
 
 
97132db
 
fad436e
 
 
 
 
97132db
fad436e
 
 
 
 
 
 
 
 
 
 
 
 
97132db
 
fad436e
 
 
 
 
 
 
 
 
 
 
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
import os
import logging
from flask import Flask, render_template, request, redirect, url_for, flash, session, send_from_directory
from utility.utils import process_image_pipeline
from dotenv import load_dotenv

# Load environment variables
load_dotenv()

# Configure logging
logging.basicConfig(level=logging.INFO, handlers=[logging.StreamHandler()])

app = Flask(__name__)
app.secret_key = os.getenv('SECRET_KEY', 'default_secret_key')
app.config['UPLOAD_FOLDER'] = 'static/uploads/'
app.config['RESULT_FOLDER'] = 'static/results/'

os.makedirs(app.config['UPLOAD_FOLDER'], exist_ok=True)
os.makedirs(app.config['RESULT_FOLDER'], exist_ok=True)

@app.template_filter('basename')
def basename_filter(path):
    return os.path.basename(path)

@app.route('/')
def index():
    uploaded_files = session.get('uploaded_files', [])
    return render_template('index.html', uploaded_files=uploaded_files)

@app.route('/upload', methods=['POST'])
def upload_file():
    logging.info("Request: /upload received")
    if 'files' not in request.files:
        logging.warning("Upload: No file part in request")
        flash('No file part')
        return redirect(request.url)

    files = request.files.getlist('files')  
    if not files or all(file.filename == '' for file in files):
        logging.warning("Upload: No files selected")
        flash('No selected files')
        return redirect(request.url)

    uploaded_files = []
    for file in files:
        if file:
            filename = file.filename
            file_path = os.path.join(app.config['UPLOAD_FOLDER'], filename)
            file.save(file_path)
            uploaded_files.append(filename)
            logging.info(f"Upload: Successfully saved {filename}")

    session['uploaded_files'] = uploaded_files  
    return process_file()

@app.route('/process', methods=['GET', 'POST'])
def process_file():
    logging.info("Request: /process started")
    uploaded_files = session.get('uploaded_files', [])
    if not uploaded_files:
        logging.warning("Process: No files in session")
        flash('No files selected for processing')
        return redirect(url_for('index'))

    file_paths = [os.path.join(app.config['UPLOAD_FOLDER'], f) for f in uploaded_files]
    
    try:
        logging.info(f"Process: Sending {len(file_paths)} files to pipeline")
        processed_data = process_image_pipeline(file_paths)
        
        # Format images for result.html
        processed_Img = {f: os.path.join(app.config['UPLOAD_FOLDER'], f) for f in uploaded_files}

        session['processed_data'] = processed_data
        session['processed_Img'] = processed_Img

        logging.info("Process: Pipeline completed successfully")
        flash('Data processed successfully')
        return redirect(url_for('result'))
    except Exception as e:
        logging.exception(f"Process: Critical failure: {e}")
        flash(f'Processing error: {str(e)}')
        return redirect(url_for('index'))

@app.route('/result')
def result():
    data = session.get('processed_data', {})
    Img = session.get('processed_Img', {})
    if not data:
        return redirect(url_for('index'))
    return render_template('result.html', data=data, Img=Img)

@app.route('/reset_upload')
def reset_upload():
    uploaded_files = session.get('uploaded_files', [])
    for f in uploaded_files:
        path = os.path.join(app.config['UPLOAD_FOLDER'], f)
        if os.path.exists(path):
            os.remove(path)
    
    session.pop('uploaded_files', None)
    session.pop('processed_data', None)
    session.pop('processed_Img', None)
    flash('System reset successful.')
    return redirect(url_for('index'))

if __name__ == '__main__':
    from utility.utils import get_ocr, get_ner
    logging.info("Core: Pre-initializing engines (this may take a minute)...")
    # Trigger lazy load at startup to avoid reloader issues and request timeouts
    try:
        get_ocr()
        get_ner()
        logging.info("Core: Engines pre-initialized successfully.")
    except Exception as e:
        logging.error(f"Core: Failed to pre-initialize engines: {e}")

    app.run(debug=True, use_reloader=False, port=int(os.getenv('PORT', 5000)))