diff --git a/Website/main.py b/Website/main.py index b39582b..88e8688 100644 --- a/Website/main.py +++ b/Website/main.py @@ -1617,20 +1617,21 @@ def _get_school_instance_by_subdomain(subdomain: str) -> dict | None: client.close() -def _get_instance_for_user(username: str, display_name: str) -> dict | None: - uname = _sanitize_text(username or "", 80) - if not uname: - return None - - client = None +def _get_instance_for_user(username, display_name=None, user_id=None): + # Ensure we fall back to session if user_id isn't explicitly passed + user_id = user_id or session.get("user_id") + client, col = _get_collection("instances") try: - client, col = _get_collection("school_instances") - return col.find_one({"owner_username": uname}, sort=[("updated_at", -1), ("created_at", -1)]) - except PyMongoError: - return None + query = { + "$or": [ + {"owner_username": username}, + {"username": username}, + {"owner_id": user_id} + ] + } + return col.find_one(query) finally: - if client: - client.close() + client.close() 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) -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.""" with app_instance.app_context(): 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 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) # 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_payload = { - "action": "add", # <--- GANZ WICHTIG FÜR DEN WATCHER + "action": "add", "request_id": str(prov_id), "slug": subdomain, "port": next_port, "password": admin_password, - "module_config": module_config_str # <--- ERSETZT "modules": list(...) + "module_config": module_config_str } with open(trigger_file, "w") as f: json.dump(trigger_payload, f) print(f"[INFO] Trigger-Datei fuer Host-Watcher erstellt: {trigger_file} mit Payload: {trigger_payload}") + # 4. Instanz-Eintrag in der Datenbank registrieren domain = f"{subdomain}.invario-software.de" instance_doc = { "owner_id": user_id, + "owner_username": username, # <--- HIER HINZUGEFÜGT "school_name": school_name, "subdomain": subdomain, "domain": domain, @@ -2513,12 +2516,13 @@ def booking_payment(): app_obj = current_app._get_current_object() 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") # Startet den asynchronen Provisioning-Thread thread = threading.Thread( 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() print(f"[INFO] Background Provisioning Trigger gestartet für Subdomain: {subdomain}") @@ -3170,17 +3174,18 @@ def my_invoices(): def my_instance_management(): username = _sanitize_text(session.get("username") or "", 80) display_name = _sanitize_text(session.get("display_name") or username, 120) - - 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) + user_id = session.get("user_id") if request.method == 'POST': flash("Nutzer können Instanzen nicht selbst erstellen oder ändern. Bitte den Administrator kontaktieren.", "error") 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 + pending_request = None + if instance_doc: instance_view = { "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), "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( "my_instance.html", instance=instance_view, + pending_request=pending_request, suggested_subdomain=suggested_subdomain, parent_domain=INSTANCE_PARENT_DOMAIN, default_school_name=display_name, diff --git a/Website/templates/my_instance.html b/Website/templates/my_instance.html index f23b9d2..0292bf6 100644 --- a/Website/templates/my_instance.html +++ b/Website/templates/my_instance.html @@ -20,6 +20,13 @@

Letzte Meldung: {{ instance.last_message }}

Aktualisiert: {{ instance.updated_at }}

Zugang: https://{{ instance.domain }}

+ {% elif pending_request %} +
+

Ihre Instanz wird gerade eingerichtet!

+

Die Subdomain {{ pending_request.subdomain }} wird für Sie bereitgestellt. Dies kann einen kurzen Moment dauern.

+

Bitte laden Sie diese Seite in ein paar Sekunden neu.

+ +
{% else %}

Für Ihr Konto ist aktuell keine Instanz zugewiesen.

Bitte wenden Sie sich an den Administrator, um eine Instanz zugewiesen zu bekommen.

@@ -38,4 +45,4 @@ .instance-card h2 { margin: 0 0 0.6rem; } .instance-card p { margin: 0.28rem 0; } -{% endblock %} +{% endblock %} \ No newline at end of file