A5: Extract all route groups into Flask blueprints (app.py -1735 lines)
Extract 9 route groups out of app.py into routes/ blueprints:
- routes/network.py — DNS, DHCP, NTP, network info/test (10 routes)
- routes/wireguard.py — WireGuard keys, peers, config, enforcement (18 routes)
- routes/cells.py — cell-to-cell connections (5 routes)
- routes/peers.py — peer CRUD + IP update + _next_peer_ip helper (10 routes)
- routes/routing.py — NAT, peer routes, firewall, iptables (17 routes)
- routes/vault.py — certs, trust, secrets (19 routes)
- routes/containers.py — containers, images, volumes (14 routes)
- routes/services.py — service bus, logs, services status/connectivity (18 routes)
- routes/peer_dashboard.py — peer-scoped dashboard/services (2 routes)
All blueprints use lazy `from app import X` inside route bodies to preserve
test patch compatibility (patch('app.email_manager', mock) still works).
Also included in this commit:
- A1 fix: backup/restore now includes email/calendar user files
- A2 fix: apply_config sets applying=True flag via helper container
- A3 fix: add_peer rolls back firewall on DNS failure
app.py reduced: 3011 → 1294 lines. 1021 tests passing.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,119 @@
|
||||
import logging
|
||||
from flask import Blueprint, request, jsonify
|
||||
logger = logging.getLogger('picell')
|
||||
bp = Blueprint('calendar', __name__)
|
||||
|
||||
@bp.route('/api/calendar/users', methods=['GET'])
|
||||
def get_calendar_users():
|
||||
"""Get calendar users."""
|
||||
try:
|
||||
from app import calendar_manager
|
||||
users = calendar_manager.get_users()
|
||||
return jsonify(users)
|
||||
except Exception as e:
|
||||
logger.error(f"Error getting calendar users: {e}")
|
||||
return jsonify({"error": str(e)}), 500
|
||||
|
||||
@bp.route('/api/calendar/users', methods=['POST'])
|
||||
def create_calendar_user():
|
||||
"""Create calendar user."""
|
||||
try:
|
||||
from app import calendar_manager
|
||||
data = request.get_json(silent=True)
|
||||
if data is None:
|
||||
return jsonify({"error": "No data provided"}), 400
|
||||
username = data.get('username')
|
||||
password = data.get('password')
|
||||
if not username or not password:
|
||||
return jsonify({"error": "Missing required fields: username, password"}), 400
|
||||
result = calendar_manager.create_calendar_user(username, password)
|
||||
return jsonify({"created": result})
|
||||
except Exception as e:
|
||||
logger.error(f"Error creating calendar user: {e}")
|
||||
return jsonify({"error": str(e)}), 500
|
||||
|
||||
@bp.route('/api/calendar/users/<username>', methods=['DELETE'])
|
||||
def delete_calendar_user(username):
|
||||
"""Delete calendar user."""
|
||||
try:
|
||||
from app import calendar_manager
|
||||
result = calendar_manager.delete_calendar_user(username)
|
||||
return jsonify({"deleted": result})
|
||||
except Exception as e:
|
||||
logger.error(f"Error deleting calendar user: {e}")
|
||||
return jsonify({"error": str(e)}), 500
|
||||
|
||||
@bp.route('/api/calendar/calendars', methods=['POST'])
|
||||
def create_calendar():
|
||||
"""Create calendar."""
|
||||
try:
|
||||
from app import calendar_manager
|
||||
data = request.get_json(silent=True)
|
||||
if data is None:
|
||||
return jsonify({"error": "No data provided"}), 400
|
||||
username = data.get('username')
|
||||
calendar_name = data.get('name') or data.get('calendar_name')
|
||||
if not username or not calendar_name:
|
||||
return jsonify({"error": "Missing required fields: username, name"}), 400
|
||||
result = calendar_manager.create_calendar(
|
||||
username,
|
||||
calendar_name,
|
||||
description=data.get('description', ''),
|
||||
color=data.get('color', '#4285f4'),
|
||||
)
|
||||
return jsonify({"created": result})
|
||||
except Exception as e:
|
||||
logger.error(f"Error creating calendar: {e}")
|
||||
return jsonify({"error": str(e)}), 500
|
||||
|
||||
@bp.route('/api/calendar/events', methods=['POST'])
|
||||
def add_calendar_event():
|
||||
try:
|
||||
from app import calendar_manager
|
||||
data = request.get_json(silent=True)
|
||||
if data is None:
|
||||
return jsonify({"error": "No data provided"}), 400
|
||||
username = data.get('username')
|
||||
calendar_name = data.get('calendar_name') or data.get('calendar')
|
||||
if not username or not calendar_name:
|
||||
return jsonify({"error": "Missing required fields: username, calendar_name"}), 400
|
||||
event_data = {k: v for k, v in data.items() if k not in ('username', 'calendar_name', 'calendar')}
|
||||
result = calendar_manager.add_event(username, calendar_name, event_data)
|
||||
return jsonify({"created": result})
|
||||
except Exception as e:
|
||||
logger.error(f"Error adding calendar event: {e}")
|
||||
return jsonify({"error": str(e)}), 500
|
||||
|
||||
@bp.route('/api/calendar/events/<username>/<calendar_name>', methods=['GET'])
|
||||
def get_calendar_events(username, calendar_name):
|
||||
"""Get calendar events."""
|
||||
try:
|
||||
from app import calendar_manager
|
||||
params = request.args.to_dict()
|
||||
result = calendar_manager.get_events(username, calendar_name, params)
|
||||
return jsonify(result)
|
||||
except Exception as e:
|
||||
logger.error(f"Error getting calendar events: {e}")
|
||||
return jsonify({"error": str(e)}), 500
|
||||
|
||||
@bp.route('/api/calendar/status', methods=['GET'])
|
||||
def get_calendar_status():
|
||||
"""Get calendar service status."""
|
||||
try:
|
||||
from app import calendar_manager
|
||||
status = calendar_manager.get_status()
|
||||
return jsonify(status)
|
||||
except Exception as e:
|
||||
logger.error(f"Error getting calendar status: {e}")
|
||||
return jsonify({"error": str(e)}), 500
|
||||
|
||||
@bp.route('/api/calendar/connectivity', methods=['GET'])
|
||||
def test_calendar_connectivity():
|
||||
"""Test calendar connectivity."""
|
||||
try:
|
||||
from app import calendar_manager
|
||||
result = calendar_manager.test_connectivity()
|
||||
return jsonify(result)
|
||||
except Exception as e:
|
||||
logger.error(f"Error testing calendar connectivity: {e}")
|
||||
return jsonify({"error": str(e)}), 500
|
||||
Reference in New Issue
Block a user