from flask import request, render_template, Blueprint, session, current_app, jsonify, flash, redirect from flask_security import roles_required, roles_accepted from flask_wtf.csrf import generate_csrf from common.models.document import Catalog from common.models.user import Tenant from common.utils.database import Database from common.utils.nginx_utils import prefixed_url_for from .basic_forms import SessionDefaultsForm basic_bp = Blueprint('basic_bp', __name__) @basic_bp.before_request def log_before_request(): current_app.logger.debug(f'Before request: {request.path} =====================================') @basic_bp.after_request def log_after_request(response): return response @basic_bp.route('/', methods=['GET', ]) def index(): return render_template('index.html') @basic_bp.route('/confirm_email_ok', methods=['GET', ]) def confirm_email_ok(): return render_template('basic/confirm_email_ok.html') @basic_bp.route('/confirm_email_fail', methods=['GET', ]) def confirm_email_fail(): return render_template('basic/confirm_email_fail.html') @basic_bp.route('/session_defaults', methods=['GET', 'POST']) @roles_accepted('Super User', 'Tenant Admin') def session_defaults(): try: # Get tenant session tenant_id = session.get('tenant').get('id') tenant_db = Database(tenant_id) tenant_session = tenant_db.get_session() try: form = SessionDefaultsForm() if form.validate_on_submit(): session['default_language'] = form.default_language.data if form.catalog.data: catalog_id = int(form.catalog.data) catalog = tenant_session.query(Catalog).get(catalog_id) if catalog: session['catalog_id'] = catalog.id session['catalog_name'] = catalog.name else: session.pop('catalog_id', None) session.pop('catalog_name', None) flash('Session defaults updated successfully', 'success') return redirect(prefixed_url_for('basic_bp.index')) return render_template('basic/session_defaults.html', form=form) finally: tenant_session.close() except Exception as e: current_app.logger.error(f"Error in session_defaults: {str(e)}") flash('Error accessing catalog data. Please ensure your session is valid.', 'danger') return redirect(prefixed_url_for('security_bp.login')) @basic_bp.route('/set_user_timezone', methods=['POST']) def set_user_timezone(): data = request.get_json() timezone = data.get('timezone') if timezone: session['admin_user_timezone'] = timezone return jsonify({'status': 'success', 'timezone': timezone}), 200 else: return jsonify({'status': 'error', 'message': 'Timezone not provided'}), 400 @basic_bp.route('/health', methods=['GET']) def health(): return jsonify({'status': 'ok'}), 200 @basic_bp.route('/check_csrf', methods=['GET']) def check_csrf(): csrf_token = generate_csrf() return jsonify({ 'csrf_token_in_session': session.get('csrf_token'), 'generated_csrf_token': csrf_token, 'session_id': session.sid if hasattr(session, 'sid') else None, 'session_data': dict(session) })