File size: 3,225 Bytes
c001f24
 
d3d811e
c001f24
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
d3d811e
c001f24
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
c3812ef
 
 
 
c001f24
 
 
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
import os
import sys
import json
from flask import Flask
from flask_cors import CORS
from flask_socketio import SocketIO
from datetime import datetime, date
from dotenv import load_dotenv

# Load environment variables from .env file
load_dotenv()

# Ensure the current directory is in the Python path
sys.path.append(os.path.abspath(os.path.dirname(__file__)))

from database import setup_database

socketio = SocketIO()

def humanize_datetime(dt_str):
    """Converts a datetime string to a human-friendly format."""
    if not dt_str:
        return ""
    try:
        # Split the string at the decimal point to handle microseconds
        dt = datetime.fromisoformat(dt_str.split('.')[0])
        today = date.today()
        if dt.date() == today:
            return "Today"
        elif dt.date() == date.fromordinal(today.toordinal() - 1):
            return "Yesterday"
        else:
            return dt.strftime('%b %d, %Y')
    except (ValueError, TypeError):
        return dt_str # Return original string if parsing fails

def create_app():
    app = Flask(__name__)
    CORS(app)
    socketio.init_app(app, cors_allowed_origins="*")

    # Register custom Jinja2 filter
    app.jinja_env.filters['humanize'] = humanize_datetime
    app.jinja_env.filters['chr'] = chr
    app.jinja_env.filters['from_json'] = lambda x: json.loads(x) if x else []

    # Configuration
    app.config['SECRET_KEY'] = os.urandom(24)
    app.config['MAX_CONTENT_LENGTH'] = 16 * 1024 * 1024 * 4096
    app.config['UPLOAD_FOLDER'] = 'uploads'
    app.config['PROCESSED_FOLDER'] = 'processed'
    app.config['OUTPUT_FOLDER'] = 'output'
    app.config['TEMP_FOLDER'] = 'tmp'

    # Ensure instance folders exist
    for folder in [app.config['UPLOAD_FOLDER'], app.config['PROCESSED_FOLDER'], app.config['OUTPUT_FOLDER'], app.config['TEMP_FOLDER']]:
        os.makedirs(folder, exist_ok=True)

    with app.app_context():
        setup_database()

    # Setup Login Manager
    from user_auth import setup_login_manager
    setup_login_manager(app)

    # Register Blueprints
    from routes import main_bp
    from json_processor import json_bp
    from neetprep import neetprep_bp
    from classifier_routes import classifier_bp
    from dashboard import dashboard_bp
    from image_routes import image_bp
    from auth_routes import auth_bp
    from settings_routes import settings_bp
    from subjective_routes import subjective_bp
    from camera_routes import camera_bp
    from drive_routes import drive_bp
    from qtab_routes import qtab_bp

    app.register_blueprint(main_bp)
    app.register_blueprint(json_bp)
    app.register_blueprint(neetprep_bp)
    app.register_blueprint(classifier_bp)
    app.register_blueprint(dashboard_bp)
    app.register_blueprint(image_bp)
    app.register_blueprint(auth_bp)
    app.register_blueprint(settings_bp)
    app.register_blueprint(subjective_bp)
    app.register_blueprint(camera_bp)
    app.register_blueprint(drive_bp)
    app.register_blueprint(qtab_bp)

    # Initialize socketio handlers for camera routes (after app creation to avoid circular import)
    from camera_routes import init_socketio_handlers
    init_socketio_handlers(socketio)

    return app

app = create_app()