123 lines
3.6 KiB
Plaintext
123 lines
3.6 KiB
Plaintext
|
|
from flask import Flask
|
||
|
|
from flask_bootstrap import Bootstrap5
|
||
|
|
from flask_mail import Mail
|
||
|
|
from flask_login import LoginManager
|
||
|
|
from flask_wtf.csrf import CSRFProtect
|
||
|
|
from dotenv import load_dotenv
|
||
|
|
import os
|
||
|
|
import secrets
|
||
|
|
import logging
|
||
|
|
|
||
|
|
# Importações de configurações
|
||
|
|
from models.entities.base import Base, engine
|
||
|
|
from routes.main import main_bp
|
||
|
|
from routes.admin import admin_bp
|
||
|
|
from routes.auth import auth_bp
|
||
|
|
from routes.militante import militante_bp
|
||
|
|
from routes.pagamento import pagamento_bp
|
||
|
|
from routes.relatorio import relatorio_bp
|
||
|
|
from routes.cota import cota_bp
|
||
|
|
|
||
|
|
# Configuração do logger
|
||
|
|
logging.basicConfig(level=logging.INFO)
|
||
|
|
logger = logging.getLogger(__name__)
|
||
|
|
|
||
|
|
# Carregar variáveis de ambiente
|
||
|
|
load_dotenv()
|
||
|
|
|
||
|
|
def create_app():
|
||
|
|
"""Factory para criação da aplicação Flask"""
|
||
|
|
app = Flask(__name__)
|
||
|
|
|
||
|
|
# Configuração secreta
|
||
|
|
app.secret_key = os.getenv('SECRET_KEY', secrets.token_hex(16))
|
||
|
|
|
||
|
|
# Configuração de Bootstrap
|
||
|
|
bootstrap = Bootstrap5(app)
|
||
|
|
|
||
|
|
# Registrar blueprints
|
||
|
|
app.register_blueprint(main_bp)
|
||
|
|
app.register_blueprint(admin_bp)
|
||
|
|
app.register_blueprint(auth_bp)
|
||
|
|
app.register_blueprint(militante_bp)
|
||
|
|
app.register_blueprint(pagamento_bp)
|
||
|
|
app.register_blueprint(relatorio_bp)
|
||
|
|
app.register_blueprint(cota_bp)
|
||
|
|
|
||
|
|
# Configurar proteção CSRF
|
||
|
|
csrf = CSRFProtect()
|
||
|
|
csrf.init_app(app)
|
||
|
|
app.config['WTF_CSRF_CHECK_DEFAULT'] = False
|
||
|
|
app.config['WTF_CSRF_HEADERS'] = ['X-CSRFToken']
|
||
|
|
|
||
|
|
# Configurar Flask-Login
|
||
|
|
login_manager = LoginManager()
|
||
|
|
login_manager.init_app(app)
|
||
|
|
login_manager.login_view = 'auth.login'
|
||
|
|
|
||
|
|
# Função para carregar usuário no login_manager
|
||
|
|
from models.entities.usuario import Usuario
|
||
|
|
from services.database_service import DatabaseService
|
||
|
|
from sqlalchemy.orm import joinedload
|
||
|
|
|
||
|
|
@login_manager.user_loader
|
||
|
|
def load_user(user_id):
|
||
|
|
"""Carrega o usuário pelo ID"""
|
||
|
|
db = DatabaseService.get_db_connection()
|
||
|
|
try:
|
||
|
|
user = db.query(Usuario).options(
|
||
|
|
joinedload(Usuario.roles)
|
||
|
|
).get(user_id)
|
||
|
|
return user
|
||
|
|
finally:
|
||
|
|
db.close()
|
||
|
|
|
||
|
|
# Adicionar filtros Jinja2
|
||
|
|
@app.template_filter('bitwise_and')
|
||
|
|
def bitwise_and(value1, value2):
|
||
|
|
"""Filtro para operação bit a bit AND"""
|
||
|
|
return value1 & value2
|
||
|
|
|
||
|
|
# Configurar Flask-Mail
|
||
|
|
app.config['MAIL_SERVER'] = os.getenv('MAIL_SERVER', 'smtp.gmail.com')
|
||
|
|
app.config['MAIL_PORT'] = int(os.getenv('MAIL_PORT', 587))
|
||
|
|
app.config['MAIL_USE_TLS'] = os.getenv('MAIL_USE_TLS', 'True').lower() == 'true'
|
||
|
|
app.config['MAIL_USERNAME'] = os.getenv('MAIL_USERNAME')
|
||
|
|
app.config['MAIL_PASSWORD'] = os.getenv('MAIL_PASSWORD')
|
||
|
|
app.config['MAIL_DEFAULT_SENDER'] = os.getenv('MAIL_DEFAULT_SENDER')
|
||
|
|
|
||
|
|
# Inicializar Mail
|
||
|
|
mail = Mail(app)
|
||
|
|
|
||
|
|
return app
|
||
|
|
|
||
|
|
def init_system():
|
||
|
|
"""Inicializa o sistema com banco de dados e usuários padrão"""
|
||
|
|
from functions.database import init_database
|
||
|
|
|
||
|
|
# Inicializar banco de dados
|
||
|
|
logger.info("Inicializando banco de dados...")
|
||
|
|
init_database()
|
||
|
|
|
||
|
|
# Outros procedimentos de inicialização podem ser adicionados aqui
|
||
|
|
|
||
|
|
def main():
|
||
|
|
"""Inicializa e retorna a aplicação Flask"""
|
||
|
|
return create_app()
|
||
|
|
|
||
|
|
# Criar a aplicação
|
||
|
|
app = main()
|
||
|
|
|
||
|
|
if __name__ == '__main__':
|
||
|
|
import sys
|
||
|
|
|
||
|
|
# Verificar se é para inicializar o sistema
|
||
|
|
if '--init' in sys.argv:
|
||
|
|
init_system()
|
||
|
|
else:
|
||
|
|
# Executar a aplicação
|
||
|
|
app.run(
|
||
|
|
host='0.0.0.0',
|
||
|
|
port=5000,
|
||
|
|
debug=os.getenv('FLASK_ENV') == 'development'
|
||
|
|
)
|