cd /home/def/otb_billing || exit 1 cp backend/routes/portal_services.py backend/routes/portal_services.py.bak.$(date +%Y%m%d-%H%M%S) cat > backend/routes/portal_services.py <<'EOF' from flask import Blueprint, render_template, session, redirect, url_for, flash portal_services_bp = Blueprint("portal_services", __name__) def _portal_user_is_logged_in() -> bool: return bool( session.get("portal_user_id") or session.get("client_user_id") or session.get("portal_client_id") or session.get("client_id") or session.get("user_id") ) @portal_services_bp.route("/portal/services") def portal_services_home(): if not _portal_user_is_logged_in(): flash("Please sign in to access services.", "warning") return redirect(url_for("portal_login")) client = { "contact_name": session.get("portal_contact_name"), "company_name": session.get("portal_company_name"), "email": session.get("portal_email"), } client_name = ( client.get("contact_name") or client.get("company_name") or client.get("email") or "Client" ) services = [ { "key": "follow_me", "name": "Follow-me Tracker", "summary": "Create and manage your GPS tracking network. Free for up to 2 users.", "status": "beta", "enabled": True, "href": "/follow-me", "button_text": "Open Follow-me", }, { "key": "video_render", "name": "Video Rendering / Streaming", "summary": "Submit video rendering, conversion, and hosted streaming jobs.", "status": "coming_soon", "enabled": False, "href": "#", "button_text": "Coming Soon", }, { "key": "miner_rentals", "name": "Miner Rentals", "summary": "Rent available OTB hashpower by time or package.", "status": "coming_soon", "enabled": False, "href": "#", "button_text": "Coming Soon", }, ] return render_template( "portal/services_here.html", client=client, client_name=client_name, services=services, ) EOF python3 -m py_compile backend/routes/portal_services.py sudo systemctl restart otb_billing.service sudo systemctl status otb_billing.service --no-pager -l | sed -n '1,30p'