from flask import Blueprint, render_template, request, redirect, url_for, flash, current_app from flask_login import login_required, current_user from utils import get_db_connection import os settings_bp = Blueprint('settings', __name__) @settings_bp.route('/settings', methods=['GET', 'POST']) @login_required def settings(): if request.method == 'POST': # --- Handle Client Secret Upload --- if 'client_secret' in request.files: file = request.files['client_secret'] if file and file.filename: if file.filename.endswith('.json'): try: save_path = os.path.join(current_app.root_path, 'client_secret.json') file.save(save_path) flash('Client Secret uploaded successfully!', 'success') except Exception as e: flash(f'Error saving file: {e}', 'danger') else: flash('Invalid file type. Please upload a JSON file.', 'danger') # --- Handle NeetPrep Toggle --- neetprep_enabled = 1 if request.form.get('neetprep_enabled') else 0 # --- Handle V2 Default Toggle --- v2_default = 1 if request.form.get('v2_default') else 0 # --- Handle Magnifier Toggle --- magnifier_enabled = 1 if request.form.get('magnifier_enabled') else 0 # --- Handle Classifier Model Setting --- classifier_model = request.form.get('classifier_model', 'gemini') if classifier_model not in ['gemini', 'nova', 'gemma']: classifier_model = 'gemini' # --- Handle DPI Setting --- dpi_input = request.form.get('dpi') if not dpi_input: dpi = 300 else: try: dpi = int(dpi_input) if not (72 <= dpi <= 900): flash('Invalid DPI value. Please enter a number between 72 and 900.', 'danger') return redirect(url_for('settings.settings')) except (ValueError, TypeError): flash('Invalid DPI value. Please enter a valid number.', 'danger') return redirect(url_for('settings.settings')) # --- Handle Color RM DPI Setting --- color_rm_dpi_input = request.form.get('color_rm_dpi') if not color_rm_dpi_input: color_rm_dpi = 200 else: try: color_rm_dpi = int(color_rm_dpi_input) if not (72 <= color_rm_dpi <= 600): flash('Invalid Color Removal DPI value. Please enter a number between 72 and 600.', 'danger') return redirect(url_for('settings.settings')) except (ValueError, TypeError): flash('Invalid Color Removal DPI value. Please enter a valid number.', 'danger') return redirect(url_for('settings.settings')) # --- Update Database --- conn = get_db_connection() conn.execute('UPDATE users SET neetprep_enabled = ?, v2_default = ?, magnifier_enabled = ?, dpi = ?, color_rm_dpi = ?, classifier_model = ? WHERE id = ?', (neetprep_enabled, v2_default, magnifier_enabled, dpi, color_rm_dpi, classifier_model, current_user.id)) conn.commit() conn.close() # --- Update current_user object for the session --- current_user.neetprep_enabled = neetprep_enabled current_user.v2_default = v2_default current_user.magnifier_enabled = magnifier_enabled current_user.dpi = dpi current_user.color_rm_dpi = color_rm_dpi current_user.classifier_model = classifier_model flash('Settings saved successfully!', 'success') return redirect(url_for('settings.settings')) client_secret_exists = os.path.exists(os.path.join(current_app.root_path, 'client_secret.json')) drive_redirect_uri = url_for('drive.oauth2callback', _external=True) return render_template('settings.html', client_secret_exists=client_secret_exists, drive_redirect_uri=drive_redirect_uri)