import os from pathlib import Path from flask import Blueprint, request, redirect, flash, session from auth import require_level from config_utils import (flush_pending_to_queue, get_dashboard_pending, revert_snapshot_to_config, queued_msg, SNAPSHOTS_DIR, DASHBOARD_PENDING) _PAGE = Path(__file__).parent.name bp = Blueprint(_PAGE, __name__) @bp.route('/action/actions/pending_save', methods=['POST']) @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']) @require_level('administrator') def pending_apply(): pending = get_dashboard_pending() if not pending: flash('No pending changes to apply.', 'info') return redirect(f'/{_PAGE}') 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']) @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}') succeeded, failed = 0, 0 for uuid in selected_uuids: msg, ok = revert_snapshot_to_config(uuid) if ok: succeeded += 1 else: flash(msg, 'error') failed += 1 if succeeded: plural = 's' if succeeded != 1 else '' flash(f'{succeeded} change{plural} reverted.', 'success') return redirect(f'/{_PAGE}') @bp.route('/action/actions/history_clear', methods=['POST']) @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 for fname in os.listdir(SNAPSHOTS_DIR): if not fname.endswith('.json'): continue if any(fname.endswith(f'-{uuid}.json') for uuid in selected_uuids): fpath = os.path.join(SNAPSHOTS_DIR, fname) if os.path.isfile(fpath): os.remove(fpath) count += 1 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']) @require_level('manager') def pending_dismiss(): pending = 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(DASHBOARD_PENDING, 'w') as f: for u, t, c, usr in keep: f.write(f'{u} {t} [{c}] ({usr})\n') plural = 's' if len(dismissible) != 1 else '' flash(f'{len(dismissible)} pending change{plural} dismissed.', 'success') return redirect(f'/{_PAGE}')