From 402f8e07a875faedbd693c0674e34f047df30f4c Mon Sep 17 00:00:00 2001 From: Alejandro Vazquez Date: Fri, 27 Mar 2026 14:52:16 -0300 Subject: [PATCH] feat(api): fix lint --- app/__init__.py | 86 ++++++------- app/routes/__init__.py | 6 + app/routes/main.py | 13 +- app/templates/base.html | 29 ++++- app/templates/dashboard.html | 14 +-- app/templates/partials/language_switcher.html | 27 +++++ babel.cfg | 3 + config/config.py | 8 +- requirements.txt | 2 + translations/en/LC_MESSAGES/messages.po | 114 ++++++++++++++++++ translations/es/LC_MESSAGES/messages.po | 114 ++++++++++++++++++ 11 files changed, 361 insertions(+), 55 deletions(-) create mode 100644 app/templates/partials/language_switcher.html create mode 100644 babel.cfg create mode 100644 translations/en/LC_MESSAGES/messages.po create mode 100644 translations/es/LC_MESSAGES/messages.po diff --git a/app/__init__.py b/app/__init__.py index b1db117..77bcf12 100644 --- a/app/__init__.py +++ b/app/__init__.py @@ -1,65 +1,65 @@ -from flask import Flask +from flask import Flask, request from flask_sqlalchemy import SQLAlchemy -from flask_login import LoginManager from flask_migrate import Migrate +from flask_login import LoginManager from flask_cors import CORS -from dotenv import load_dotenv +from flask_babel import Babel, gettext as _ from config.config import Config -import os - -load_dotenv() - +# Initialize extensions db = SQLAlchemy() -login_manager = LoginManager() migrate = Migrate() +login_manager = LoginManager() +cors = CORS() +babel = Babel() -def create_app(): +def create_app(config_class=Config): app = Flask(__name__) + app.config.from_object(config_class) - # Configuration - app.config.from_object(Config) - - # Initialize extensions + # Initialize extensions with app db.init_app(app) - login_manager.init_app(app) migrate.init_app(app, db) - CORS(app) + login_manager.init_app(app) + cors.init_app(app) # Login manager configuration login_manager.login_view = 'auth.login' - login_manager.login_message = 'Please log in to access this page.' - - @login_manager.user_loader - def load_user(user_id): - from app.models.user import User - return User.query.get(int(user_id)) + login_manager.login_message = 'Por favor inicia sesión para acceder a esta página.' + login_manager.login_message_category = 'info' # Register blueprints - from app.routes.auth import auth_bp - from app.routes.main import main_bp - from app.routes.classrooms import classrooms_bp - from app.routes.schedule import schedule_bp + from app.routes import auth_bp, classrooms_bp, main_bp, schedule_bp - app.register_blueprint(auth_bp) - app.register_blueprint(main_bp) - app.register_blueprint(classrooms_bp, url_prefix='/classrooms') - app.register_blueprint(schedule_bp, url_prefix='/schedule') + app.register_blueprint(auth_bp, url_prefix="/") + app.register_blueprint(classrooms_bp, url_prefix="/classrooms") + app.register_blueprint(main_bp, url_prefix="/") + app.register_blueprint(schedule_bp, url_prefix="/schedule") - # Create database tables - with app.app_context(): - db.create_all() +# Babel language selector + @app.context_processor + def inject_conf_vars(): + return dict( + languages=app.config['LANGUAGES'], + current_lang=request.session.get('language', request.accept_languages.best_match(app.config['LANGUAGES']) or app.config['BABEL_DEFAULT_LOCALE']) + ) + + # Language selector function + def get_locale(): + # 1. Check if language is explicitly set in URL parameters + if request.args.get('lang'): + lang = request.args.get('lang') + if lang in app.config['LANGUAGES']: + return lang - # Create default admin user if not exists - from app.models.user import User - if not User.query.filter_by(email='admin@edu-space.com').first(): - admin = User( - email='admin@edu-space.com', - name='System Administrator', - role='admin' - ) - admin.set_password('admin123') # Change this in production - db.session.add(admin) - db.session.commit() + # 2. Check if language is stored in session + if 'language' in request.session: + return request.session['language'] + + # 3. Check browser language preference + return request.accept_languages.best_match(app.config['LANGUAGES']) or app.config['BABEL_DEFAULT_LOCALE'] + + # Configure Babel + babel.init_app(app, locale_selector=get_locale) return app \ No newline at end of file diff --git a/app/routes/__init__.py b/app/routes/__init__.py index e69de29..eb93dba 100644 --- a/app/routes/__init__.py +++ b/app/routes/__init__.py @@ -0,0 +1,6 @@ +from .auth import auth_bp +from .classrooms import classrooms_bp +from .main import main_bp +from .schedule import schedule_bp + +__all__ = ['auth_bp', 'classrooms_bp', 'main_bp', 'schedule_bp'] \ No newline at end of file diff --git a/app/routes/main.py b/app/routes/main.py index 46f6d8a..0425e50 100644 --- a/app/routes/main.py +++ b/app/routes/main.py @@ -1,4 +1,4 @@ -from flask import Blueprint, render_template, jsonify +from flask import Blueprint, render_template, jsonify, redirect, url_for, session, request from flask_login import login_required, current_user from app.models.reservation import Reservation from app.models.classroom import Classroom @@ -6,6 +6,7 @@ from app.models.subject import Subject from app.models.subject import Commission from datetime import datetime, timedelta from sqlalchemy import func +from flask_babel import gettext as _ main_bp = Blueprint('main', __name__) @@ -105,4 +106,12 @@ def dashboard_stats_api(): 'today_reservations': today_reservations, 'week_reservations': week_reservations, 'monthly_data': list(reversed(monthly_data)) - }) \ No newline at end of file + }) + +@main_bp.route('/set_language/') +def set_language(language=None): + if language not in ['en', 'es']: + language = 'en' + + session['language'] = language + return redirect(request.referrer or url_for('main.dashboard')) \ No newline at end of file diff --git a/app/templates/base.html b/app/templates/base.html index e25758b..ba97f6a 100644 --- a/app/templates/base.html +++ b/app/templates/base.html @@ -1,9 +1,9 @@ - + - {% block title %}Edu-Space Admin{% endblock %} + {% block title %}{% trans %}Edu-Space Admin{% endtrans %}{% endblock %} @@ -69,6 +69,31 @@ + +