changes to the instace displaying
This commit is contained in:
+38
-22
@@ -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,
|
||||
|
||||
@@ -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 %}
|
||||
Reference in New Issue
Block a user