from pathlib import Path from flask import Blueprint, request, redirect, flash, session import auth import config_utils _PAGE = Path(__file__).parent.name bp = Blueprint(_PAGE, __name__) @bp.route('/action/actions/pending_save', methods=['POST']) @auth.require_level('administrator') def pending_save(): session['apply_changes_immediately'] = 'apply_changes_immediately' in request.form flash('Preference saved.', 'success') return redirect(f'/{_PAGE}') @bp.route('/action/actions/pending_apply', methods=['POST']) @auth.require_level('administrator') def pending_apply(): pending = config_utils.get_dashboard_pending() if not pending: flash('No pending changes to apply.', 'info') return redirect(f'/{_PAGE}') config_utils.flush_pending_to_queue() if any(cmd != 'fix problems' for _, _, cmd, _ in pending): flash('Changes queued.', 'success') return redirect(f'/{_PAGE}') @bp.route('/action/actions/history_revert', methods=['POST']) @auth.require_level('administrator') def history_revert(): selected_uuids = request.form.getlist('selected_uuids') if not selected_uuids: flash('No items selected.', 'info') return redirect(f'/{_PAGE}') if len(selected_uuids) != 1: flash('Please select exactly one change to revert.', 'error') return redirect(f'/{_PAGE}') behavior = request.form.get('revert_behavior', 'revert_subsequent') errors, succeeded, failed = config_utils.revert_group_chain(selected_uuids[0]) for msg in errors: flash(msg, 'error') if succeeded: s = 's' if succeeded != 1 else '' if behavior == 'restore_state': flash(f'Config restored to selected state ({succeeded} change{s} reverted).', 'success') else: flash(f'{succeeded} change{s} reverted.', 'success') return redirect(f'/{_PAGE}') @bp.route('/action/actions/history_clear', methods=['POST']) @auth.require_level('manager') def history_clear(): selected_uuids = request.form.getlist('selected_uuids') if not selected_uuids: flash('No items selected.', 'info') return redirect(f'/{_PAGE}') count = 0 conn = config_utils._db() try: for uid in selected_uuids: conn.execute('DELETE FROM changes WHERE group_id=?', (uid,)) result = conn.execute('DELETE FROM groups WHERE uuid=?', (uid,)) count += result.rowcount conn.commit() finally: conn.close() plural = 's' if count != 1 else '' flash(f'{count} history record{plural} cleared.', 'success') return redirect(f'/{_PAGE}') @bp.route('/action/actions/pending_dismiss', methods=['POST']) @auth.require_level('manager') def pending_dismiss(): pending = config_utils.get_dashboard_pending() dismissible = [(u, t, c, usr) for u, t, c, usr in pending if c != 'fix problems'] if not dismissible: flash('No pending changes to dismiss.', 'info') return redirect(f'/{_PAGE}') keep = [(u, t, c, usr) for u, t, c, usr in pending if c == 'fix problems'] with open(config_utils.DASHBOARD_PENDING, 'w') as f: for u, t, c, usr in keep: f.write(f'{u} {t} [{c}] ({usr})\n') flash('Pending changes dismissed.', 'success') return redirect(f'/{_PAGE}')