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()
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,
+8 -1
View File
@@ -20,6 +20,13 @@
<p><strong>Letzte Meldung:</strong> {{ instance.last_message }}</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>
{% 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 %}
<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>
@@ -38,4 +45,4 @@
.instance-card h2 { margin: 0 0 0.6rem; }
.instance-card p { margin: 0.28rem 0; }
</style>
{% endblock %}
{% endblock %}