refactor: noms publics dracodev par configuration (dev/prod)
Aucun nom public d'une autre app dracodev n'est codé en dur dans le code vivant : nouveau module app/services/draco_urls.py (env > config > défaut officiel, jamais de -dev en défaut). CSP connect-src/frame-src, bouton SSO ObsiGate, révocations SSO, événements agent, preset MCP TikTak, barre commune, panneau Spark (injection hôte DRACO_PANNEAU_CONFIG), refs croisées (hôte configuré + officiel reconnus, URL d'affichage reconstruite, aucune donnée stockée migrée), User-Agent OG, liens Gitea. Variables ajoutées DRACO_AGENT_URL/TIKTAK_URL/KANBANTE_URL/FLOWDECK_URL, réutilisées DRACO_SSO_URL/OAUTH_REDIRECT_URI/AGENT_EVENEMENTS_URL/GITEA_URL/APP_BASE_URL. Version 7.82.0.
This commit is contained in:
@@ -35,14 +35,22 @@ def parse_deep_link(url: str) -> tuple[str, str, str, str] | None:
|
||||
except ValueError:
|
||||
return None
|
||||
host = (u.hostname or "").lower()
|
||||
if host == "tiktak.dracodev.net":
|
||||
# v7.82.0 (dev/prod) : les hôtes reconnus viennent de la config
|
||||
# (TIKTAK_URL, DRACO_SSO_URL, FLOWDECK_URL/OAUTH_REDIRECT_URI,
|
||||
# GITEA_URL/KANBANTE_URL) — un dev colle des URL en `-dev`, la prod
|
||||
# des URL officielles. L'hôte officiel reste TOUJOURS reconnu en
|
||||
# plus de l'hôte configuré : les références déjà stockées portent
|
||||
# des URL absolues et aucune donnée n'est migrée pour un renommage.
|
||||
from app.services import draco_urls
|
||||
|
||||
if host in draco_urls.hotes_connus("tiktak"):
|
||||
q = parse_qs(u.query)
|
||||
if q.get("task"):
|
||||
return ("tiktak", "task", q["task"][0], f"TikTak · tâche {q['task'][0]}")
|
||||
if q.get("list"):
|
||||
return ("tiktak", "list", q["list"][0], f"TikTak · liste {q['list'][0]}")
|
||||
return None
|
||||
if host == "og.dracodev.net":
|
||||
if host in draco_urls.hotes_connus("obsigate"):
|
||||
frag = u.fragment or ""
|
||||
if frag.startswith("file="):
|
||||
cible = unquote(frag[5:])
|
||||
@@ -50,7 +58,7 @@ def parse_deep_link(url: str) -> tuple[str, str, str, str] | None:
|
||||
nom = cible.rsplit("/", 1)[-1]
|
||||
return ("obsigate", "note", cible, f"ObsiGate · {nom}")
|
||||
return None
|
||||
if host == "flowdeck.dracodev.net":
|
||||
if host in draco_urls.hotes_connus("flowdeck"):
|
||||
m = re.fullmatch(r"/pages/(\d+)", u.path or "")
|
||||
if m:
|
||||
return ("flowdeck", "page", m.group(1), f"Flowdeck · page {m.group(1)}")
|
||||
@@ -58,7 +66,7 @@ def parse_deep_link(url: str) -> tuple[str, str, str, str] | None:
|
||||
if m:
|
||||
return ("flowdeck", "project", m.group(1), f"Flowdeck · projet {m.group(1)}")
|
||||
return None
|
||||
if host == "git.dracodev.net":
|
||||
if host in draco_urls.hotes_connus("gitea") | draco_urls.hotes_connus("kanbante"):
|
||||
m = re.fullmatch(r"/([^/]+)/([^/]+)/issues/(\d+)", u.path or "")
|
||||
if m:
|
||||
owner, repo, num = m.groups()
|
||||
@@ -67,9 +75,48 @@ def parse_deep_link(url: str) -> tuple[str, str, str, str] | None:
|
||||
return None
|
||||
|
||||
|
||||
def url_affichage(target_url: str) -> str:
|
||||
"""URL d'affichage d'une référence : l'hôte vient de la config.
|
||||
|
||||
Les références **stockées** portent l'URL absolue collée par
|
||||
l'utilisateur (``target_url``, jamais migrée ni réécrite en base).
|
||||
À l'affichage, si l'hôte stocké est un hôte dracodev connu
|
||||
(officiel ou configuré), il est remplacé par l'hôte configuré de
|
||||
l'environnement courant — chemin, requête et fragment intacts :
|
||||
une réf créée en prod s'ouvre sur le dev quand on la consulte
|
||||
depuis le dev, et inversement. Hôte inconnu : URL inchangée.
|
||||
"""
|
||||
try:
|
||||
u = urlparse((target_url or "").strip())
|
||||
except ValueError:
|
||||
return target_url
|
||||
host = (u.hostname or "").lower()
|
||||
if not host:
|
||||
return target_url
|
||||
from app.services import draco_urls
|
||||
|
||||
base = None
|
||||
for app, url in (
|
||||
("tiktak", draco_urls.tiktak_url()),
|
||||
("obsigate", draco_urls.obsigate_url()),
|
||||
("flowdeck", draco_urls.flowdeck_url()),
|
||||
("gitea", draco_urls.gitea_url()),
|
||||
("kanbante", draco_urls.kanbante_url()),
|
||||
):
|
||||
if host in draco_urls.hotes_connus(app):
|
||||
base = url
|
||||
break
|
||||
if base is None:
|
||||
return target_url
|
||||
return u._replace(scheme=urlparse(base).scheme,
|
||||
netloc=urlparse(base).netloc).geturl()
|
||||
|
||||
|
||||
def _row_to_ref(row) -> dict:
|
||||
d = dict(row)
|
||||
d["app_color"] = APP_COLORS.get(d["target_app"], "#888")
|
||||
# Affichage seulement : la valeur stockée en base n'est pas touchée.
|
||||
d["target_url"] = url_affichage(d.get("target_url") or "")
|
||||
return d
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user