changes to the instace displaying

This commit is contained in:
2026-08-26 14:33:49 +02:00
parent bd50657182
commit 24b2b31e24
2 changed files with 46 additions and 23 deletions
+38 -22
View File
@@ -1617,20 +1617,21 @@ def _get_school_instance_by_subdomain(subdomain: str) -> dict | None:
client.close() client.close()
def _get_instance_for_user(username: str, display_name: str) -> dict | None: def _get_instance_for_user(username, display_name=None, user_id=None):
uname = _sanitize_text(username or "", 80) # Ensure we fall back to session if user_id isn't explicitly passed
if not uname: user_id = user_id or session.get("user_id")
return None client, col = _get_collection("instances")
client = None
try: try:
client, col = _get_collection("school_instances") query = {
return col.find_one({"owner_username": uname}, sort=[("updated_at", -1), ("created_at", -1)]) "$or": [
except PyMongoError: {"owner_username": username},
return None {"username": username},
{"owner_id": user_id}
]
}
return col.find_one(query)
finally: finally:
if client: client.close()
client.close()
def _with_public_id(doc: dict | None) -> dict | None: def _with_public_id(doc: dict | None) -> dict | None:
@@ -2204,7 +2205,7 @@ def build_module_config_string(package_list: list) -> str:
] ]
return " ".join(config_parts) return " ".join(config_parts)
def background_booking_provisioning(app_instance, prov_id, subdomain, package_list, user_id, school_name, user_email): def background_booking_provisioning(app_instance, prov_id, subdomain, package_list, user_id, school_name, user_email, username):
"""Hintergrund-Worker, der die Tenant-Bereitstellung über das Host-Watcher-Triggersystem auslöst.""" """Hintergrund-Worker, der die Tenant-Bereitstellung über das Host-Watcher-Triggersystem auslöst."""
with app_instance.app_context(): with app_instance.app_context():
req_client, req_col = _get_collection("instance_requests") req_client, req_col = _get_collection("instance_requests")
@@ -2227,7 +2228,7 @@ def background_booking_provisioning(app_instance, prov_id, subdomain, package_li
next_port = max(used_ports) + 1 if used_ports else 10002 next_port = max(used_ports) + 1 if used_ports else 10002
admin_password = generate_secure_password() admin_password = generate_secure_password()
# --- NEU: Generiere den korrekten Modul-String --- # Generiere den korrekten Modul-String
module_config_str = build_module_config_string(package_list) module_config_str = build_module_config_string(package_list)
# 3. Trigger-Datei fuer den Host-Watcher schreiben # 3. Trigger-Datei fuer den Host-Watcher schreiben
@@ -2235,22 +2236,24 @@ def background_booking_provisioning(app_instance, prov_id, subdomain, package_li
trigger_file = os.path.join(TRIGGER_DIR, f"{subdomain}.json") trigger_file = os.path.join(TRIGGER_DIR, f"{subdomain}.json")
trigger_payload = { trigger_payload = {
"action": "add", # <--- GANZ WICHTIG FÜR DEN WATCHER "action": "add",
"request_id": str(prov_id), "request_id": str(prov_id),
"slug": subdomain, "slug": subdomain,
"port": next_port, "port": next_port,
"password": admin_password, "password": admin_password,
"module_config": module_config_str # <--- ERSETZT "modules": list(...) "module_config": module_config_str
} }
with open(trigger_file, "w") as f: with open(trigger_file, "w") as f:
json.dump(trigger_payload, f) json.dump(trigger_payload, f)
print(f"[INFO] Trigger-Datei fuer Host-Watcher erstellt: {trigger_file} mit Payload: {trigger_payload}") print(f"[INFO] Trigger-Datei fuer Host-Watcher erstellt: {trigger_file} mit Payload: {trigger_payload}")
# 4. Instanz-Eintrag in der Datenbank registrieren # 4. Instanz-Eintrag in der Datenbank registrieren
domain = f"{subdomain}.invario-software.de" domain = f"{subdomain}.invario-software.de"
instance_doc = { instance_doc = {
"owner_id": user_id, "owner_id": user_id,
"owner_username": username, # <--- HIER HINZUGEFÜGT
"school_name": school_name, "school_name": school_name,
"subdomain": subdomain, "subdomain": subdomain,
"domain": domain, "domain": domain,
@@ -2513,12 +2516,13 @@ def booking_payment():
app_obj = current_app._get_current_object() app_obj = current_app._get_current_object()
user_id = session.get("user_id") user_id = session.get("user_id")
username = session.get("username") # Hole Username für Übergabe
user_email = session.get("email") or form_data.get("contact_email") user_email = session.get("email") or form_data.get("contact_email")
# Startet den asynchronen Provisioning-Thread # Startet den asynchronen Provisioning-Thread
thread = threading.Thread( thread = threading.Thread(
target=background_booking_provisioning, target=background_booking_provisioning,
args=(app_obj, prov_id, subdomain, package_list, user_id, form_data["school_name"], user_email) args=(app_obj, prov_id, subdomain, package_list, user_id, form_data["school_name"], user_email, username) # Username am Ende hinzugefügt
) )
thread.start() thread.start()
print(f"[INFO] Background Provisioning Trigger gestartet für Subdomain: {subdomain}") print(f"[INFO] Background Provisioning Trigger gestartet für Subdomain: {subdomain}")
@@ -3170,17 +3174,18 @@ def my_invoices():
def my_instance_management(): def my_instance_management():
username = _sanitize_text(session.get("username") or "", 80) username = _sanitize_text(session.get("username") or "", 80)
display_name = _sanitize_text(session.get("display_name") or username, 120) display_name = _sanitize_text(session.get("display_name") or username, 120)
user_id = session.get("user_id")
current_instance = _get_instance_for_user(username, display_name)
current_subdomain = _sanitize_text((current_instance or {}).get("subdomain") or "", 63)
suggested_subdomain = _slugify_subdomain(display_name or username)
if request.method == 'POST': if request.method == 'POST':
flash("Nutzer können Instanzen nicht selbst erstellen oder ändern. Bitte den Administrator kontaktieren.", "error") flash("Nutzer können Instanzen nicht selbst erstellen oder ändern. Bitte den Administrator kontaktieren.", "error")
return redirect(url_for("my_instance_management")) return redirect(url_for("my_instance_management"))
instance_doc = _get_instance_for_user(username, display_name) suggested_subdomain = _slugify_subdomain(display_name or username)
instance_doc = _get_instance_for_user(username, display_name, user_id)
instance_view = None instance_view = None
pending_request = None
if instance_doc: if instance_doc:
instance_view = { instance_view = {
"school_name": _sanitize_text(instance_doc.get("school_name") or display_name, 120), "school_name": _sanitize_text(instance_doc.get("school_name") or display_name, 120),
@@ -3193,10 +3198,21 @@ def my_instance_management():
"last_message": _sanitize_text(instance_doc.get("last_message") or "", 500), "last_message": _sanitize_text(instance_doc.get("last_message") or "", 500),
"updated_at": instance_doc.get("updated_at") or "", "updated_at": instance_doc.get("updated_at") or "",
} }
else:
# Wenn noch keine Instanz da ist, prüfen wir ob eine gerade erstellt wird
req_client, req_col = _get_collection("instance_requests")
try:
pending_request = req_col.find_one({
"user_id": user_id,
"provision_status": {"$in": ["pending", "in_progress"]}
})
finally:
req_client.close()
return render_template( return render_template(
"my_instance.html", "my_instance.html",
instance=instance_view, instance=instance_view,
pending_request=pending_request,
suggested_subdomain=suggested_subdomain, suggested_subdomain=suggested_subdomain,
parent_domain=INSTANCE_PARENT_DOMAIN, parent_domain=INSTANCE_PARENT_DOMAIN,
default_school_name=display_name, default_school_name=display_name,
+8 -1
View File
@@ -20,6 +20,13 @@
<p><strong>Letzte Meldung:</strong> {{ instance.last_message }}</p> <p><strong>Letzte Meldung:</strong> {{ instance.last_message }}</p>
<p><strong>Aktualisiert:</strong> {{ instance.updated_at }}</p> <p><strong>Aktualisiert:</strong> {{ instance.updated_at }}</p>
<p><strong>Zugang:</strong> <a href="https://{{ instance.domain }}" target="_blank" rel="noopener noreferrer">https://{{ instance.domain }}</a></p> <p><strong>Zugang:</strong> <a href="https://{{ instance.domain }}" target="_blank" rel="noopener noreferrer">https://{{ instance.domain }}</a></p>
{% elif pending_request %}
<div style="background-color: #f8f9fa; border-left: 4px solid #007bff; padding: 1rem; margin-top: 1rem;">
<p><strong>Ihre Instanz wird gerade eingerichtet!</strong></p>
<p>Die Subdomain <em>{{ pending_request.subdomain }}</em> wird für Sie bereitgestellt. Dies kann einen kurzen Moment dauern.</p>
<p>Bitte laden Sie diese Seite in ein paar Sekunden neu.</p>
<button onclick="window.location.reload();" style="margin-top: 10px; padding: 8px 16px; cursor: pointer;">Seite neu laden</button>
</div>
{% else %} {% else %}
<p>Für Ihr Konto ist aktuell keine Instanz zugewiesen.</p> <p>Für Ihr Konto ist aktuell keine Instanz zugewiesen.</p>
<p>Bitte wenden Sie sich an den Administrator, um eine Instanz zugewiesen zu bekommen.</p> <p>Bitte wenden Sie sich an den Administrator, um eine Instanz zugewiesen zu bekommen.</p>
@@ -38,4 +45,4 @@
.instance-card h2 { margin: 0 0 0.6rem; } .instance-card h2 { margin: 0 0 0.6rem; }
.instance-card p { margin: 0.28rem 0; } .instance-card p { margin: 0.28rem 0; }
</style> </style>
{% endblock %} {% endblock %}