Merge pull request '0.45.9 — barre v0.3.0 : liens Hub du menu compte ; Profil quitte /profile pour le Hub (HUB-1)' (#81) from hub1-barre-v030 into main
CI / test (push) Failing after 1s
CI / test (push) Failing after 1s
This commit was merged in pull request #81.
This commit is contained in:
@@ -1,3 +1,12 @@
|
||||
## 0.45.9 — 2026-11-04 — Barre commune v0.3.0 : liens Hub du menu compte (HUB-1)
|
||||
|
||||
- **⚠ CHANGEMENT DE COMPORTEMENT VISIBLE — « Profil » du menu compte ne mène plus à `/profile`** : Kanbante était le seul hôte à traiter l'action relayée `profil` (vers sa page `/profile` propre). La barre v0.3.0 fait de Profil un **lien vers le Hub** (`<hub>/profil`) — décision du plan Hub : un seul Profil, celui du Hub. La branche `onAction("profil")` du gabarit `_draco_bar.html` est donc **retirée**. La page `/profile` elle-même **continue d'exister** (jetons API, réglages du compte Kanbante) et reste joignable par son URL ; « Déconnexion » reste relayée vers `/logout`, inchangée. Signalé explicitement pour arbitrage à la fusion.
|
||||
- **Barre d'apps v0.3.0 vendangée (dracodev-commons, branche `hub-menu-compte-v0-3-0`, PR commons #9)** : `static/css/draco-barre.css` et `static/js/draco-barre.js` remplacés **verbatim** — SHA-256 CSS `4ac2ed2e…9475b0`, JS `9d84617b…6c74da5` (preuve dans `tests/test_barre_v030.py`). Fragment `_draco_bar.html` porté selon le mécanisme d'adaptation Kanbante existant.
|
||||
- **Menu compte** : liens **Télécharger**, **À Propos**, **Aides** et **Profil** construits par le JS vendangé depuis la base Hub résolue. Le Hub n'a pas d'onglet.
|
||||
- **URL Hub par le même mécanisme que les autres apps** (`app.config` : champ `hub_url` dans `Settings` et `UrlsDraco`) : explicite `DRACO_HUB_URL` > hôte public de la requête (motif fermé étendu à `hub<SUFFIXE>.dracodev.net`) > dérivation depuis les adresses de l'agent connues > défaut officiel `https://hub.dracodev.net` (dev : `https://hub-dev.dracodev.net`). `app/main.py` expose `draco_urls.hub` au gabarit, passé en `urls.hub`.
|
||||
- **Cache** : le bump 0.45.8 → 0.45.9 resynchronise `APP_VERSION` (restée à 0.45.7 dans le code après le correctif 0.45.8, qui n'avait bumpé que le fichier `VERSION`) et change le `?v=` des CSS/JS de la barre.
|
||||
- Tests : `tests/test_barre_v030.py` (verbatim v0.3.0, résolution Hub, gabarit sans branche `profil`, `/profile` toujours routée) ; le test d'empreinte v0.2.0 de `tests/test_barre_v020.py` devient une preuve de supersession.
|
||||
|
||||
## 0.45.7 — 2026-11-04 — Recherche fédérée : ShaarIt, 5e source de « Rechercher partout »
|
||||
|
||||
- **`recherche.js` re-vendangé depuis dracodev-commons v0.2.1** (source canonique `ui/recherche/`) : ShaarIt devient une source de la page `/recherche` comme les autres — bases prod/dev, onglet, normaliseur (lien profond canonique `{base}shaare/<shorturl>`, contexte « Bookmark · privé · tags », repli recherche native `/?q=`). Le fichier reste **strictement identique** chez les cinq hôtes.
|
||||
|
||||
+10
-1
@@ -237,7 +237,7 @@ def _env_wip_limits(name: str) -> dict[str, int]:
|
||||
# du service (élargie en 0.32.2) ; 4) défaut officiel.
|
||||
_MOTIF_HOTE_AGENT = re.compile(r"agent([a-z0-9-]*)\.dracodev\.net")
|
||||
_MOTIF_HOTE_PUBLIC = re.compile(
|
||||
r"(?:og|flowdeck|tiktak|kanbante|shaarit|agent)([a-z0-9-]*)\.dracodev\.net"
|
||||
r"(?:og|flowdeck|tiktak|kanbante|shaarit|agent|hub)([a-z0-9-]*)\.dracodev\.net"
|
||||
)
|
||||
|
||||
|
||||
@@ -312,6 +312,7 @@ class UrlsDraco:
|
||||
flowdeck_url: str
|
||||
tiktak_url: str
|
||||
shaarit_url: str # ShaarIt (barre v0.2.0 ; explicite = DRACO_SHAARIT_URL)
|
||||
hub_url: str # Hub (barre v0.3.0 ; explicite = DRACO_HUB_URL)
|
||||
public_url: str # Kanbante elle-même (KANBANTE_PUBLIC_URL)
|
||||
agent_url: str # base du service d'agents (panneau + CSP)
|
||||
|
||||
@@ -353,6 +354,7 @@ def resoudre_urls_draco(
|
||||
shaarit_url=resoudre(
|
||||
"DRACO_SHAARIT_URL", "shaarit", base.shaarit_url
|
||||
),
|
||||
hub_url=resoudre("DRACO_HUB_URL", "hub", base.hub_url),
|
||||
public_url=resoudre(
|
||||
"KANBANTE_PUBLIC_URL", "kanbante", base.public_url
|
||||
),
|
||||
@@ -403,6 +405,7 @@ class Settings:
|
||||
flowdeck_url: str = "https://flowdeck.dracodev.net"
|
||||
tiktak_url: str = "https://tiktak.dracodev.net"
|
||||
shaarit_url: str = "https://shaarit.dracodev.net"
|
||||
hub_url: str = "https://hub.dracodev.net"
|
||||
agent_url: str = "https://agent.dracodev.net"
|
||||
archive_suggest_days: int = 180
|
||||
agent_evenements_url: str = "https://agent.dracodev.net/api/v1/evenements"
|
||||
@@ -513,6 +516,12 @@ def _env_settings() -> Settings:
|
||||
"https://shaarit.dracodev.net",
|
||||
suffixe_agent,
|
||||
),
|
||||
hub_url=_url_soeur_draco(
|
||||
"DRACO_HUB_URL",
|
||||
"hub",
|
||||
"https://hub.dracodev.net",
|
||||
suffixe_agent,
|
||||
),
|
||||
agent_url=agent_url,
|
||||
archive_suggest_days=_env_int("KANBANTE_ARCHIVE_SUGGEST_DAYS", 180),
|
||||
agent_evenements_url=agent_evenements_url,
|
||||
|
||||
@@ -2251,6 +2251,7 @@ def render(
|
||||
"tiktak": _urls.tiktak_url,
|
||||
"kanbante": _urls.public_url,
|
||||
"shaarit": _urls.shaarit_url,
|
||||
"hub": _urls.hub_url,
|
||||
},
|
||||
)
|
||||
context.setdefault("agent_url", _urls.agent_url)
|
||||
|
||||
@@ -1,13 +1,19 @@
|
||||
{# Barre d'apps commune dracodev — Fusion ACC-1 (issue kanbante#28).
|
||||
Snippet vendangé depuis Projets/dracodev-commons v0.2.0
|
||||
(ui/barre-apps/ @70c837a, PR commons #7) : structure du fragment
|
||||
Snippet vendangé depuis Projets/dracodev-commons v0.3.0
|
||||
(ui/barre-apps/, branche hub-menu-compte-v0-3-0 de la PR commons
|
||||
#9 — HUB-1, fusion #115) : v0.3.0 = menu compte à liens Hub
|
||||
(Télécharger, À Propos, Aides, Profil-lien ; base
|
||||
draco_urls.hub en urls.hub ci-dessous) et branche « profil »
|
||||
de onAction RETIRÉE (voir le commentaire dans la configuration —
|
||||
la page /profile de Kanbante existe toujours, elle n'est plus
|
||||
la cible du menu compte). Structure du fragment
|
||||
commons portée ici ; seule adaptation locale (0.32.0, dev/prod)
|
||||
= les URL des apps et l'adresse du service d'agents sont
|
||||
INJECTÉES par l'hôte depuis app.config (draco_urls / agent_url,
|
||||
défauts = noms officiels) — aucun nom public codé en dur dans
|
||||
ce gabarit ni dans draco-panneau.js. Le CSS et le JS, eux, sont
|
||||
vendangés VERBATIM (static/css/draco-barre.css,
|
||||
static/js/draco-barre.js — voir CHANGELOG 0.45.6).
|
||||
static/js/draco-barre.js — voir CHANGELOG 0.45.9).
|
||||
v0.2.0 (phase 3 ShaarIt) : nouvel onglet ShaarIt
|
||||
(data-app="shaarit", draco_urls.shaarit), APRÈS Kanbante et
|
||||
AVANT l'onglet agent ; couleur émeraude #059669, logo
|
||||
@@ -112,6 +118,12 @@
|
||||
recherche partout : page /recherche (Fusion #68). */
|
||||
window.DRACO_BAR_CONFIG = {
|
||||
current: "kanbante",
|
||||
/* Barre v0.3.0 (HUB-1) : base du Hub résolue par l'hôte
|
||||
(draco_urls.hub — DRACO_HUB_URL explicite, hôte de la
|
||||
requête, dérivation par l'agent, défaut officiel) ;
|
||||
le Hub n'a pas d'onglet, urls.hub alimente les liens
|
||||
du menu compte. */
|
||||
urls: { hub: "{{ draco_urls.hub }}/" },
|
||||
/* v0.1.6 : user = initiale auth_user ou K (draco_avatar). Sans
|
||||
cfg.user, le nouveau JS dériverait l'initiale du title
|
||||
("Opérateur Kanbante" → "O"), qui est un libellé de rôle et
|
||||
@@ -132,12 +144,15 @@
|
||||
};
|
||||
if (act === "domaine") { try { localStorage.setItem("draco_domain", el.dataset.dom); } catch (e) { } return; }
|
||||
if (act === "rail") { var b = document.getElementById("side-collapse"); if (b) b.click(); return; }
|
||||
/* Menu compte (image 2) : ces deux actions étaient relayées
|
||||
par draco-barre.js mais jamais prises en charge ici —
|
||||
le menu se fermait sans rien faire. En mobile, c'est le
|
||||
seul accès au profil et à la déconnexion (le pied de
|
||||
sidebar était masqué). */
|
||||
if (act === "profil") { location.href = "/profile"; return; }
|
||||
/* Menu compte — barre v0.3.0 (HUB-1) : « Profil » n'est
|
||||
PLUS relayé par la barre : c'est un vrai lien vers
|
||||
<hub>/profil (un seul Profil, celui du Hub — décision
|
||||
du plan Hub). L'ancienne branche onAction("profil")
|
||||
qui menait à la page /profile propre à Kanbante est
|
||||
donc RETIRÉE : la page /profile elle-même continue
|
||||
d'exister (jetons API, réglages du compte Kanbante),
|
||||
mais elle n'est plus la cible du menu compte de la
|
||||
barre. « Déconnexion » reste relayée, inchangée. */
|
||||
if (act === "deconnexion") { location.href = "/logout"; return; }
|
||||
if (act === "palette") { location.href = "/recherche"; return; }
|
||||
if (act === "alertes") { if (window.DRACO_ALERTES) { window.DRACO_ALERTES.open(); } else { location.href = "/activity"; } return; }
|
||||
|
||||
@@ -20,6 +20,10 @@
|
||||
le clair via data-theme="light" héritait quand même du sombre
|
||||
système (piège constaté dans les copies vendangées de
|
||||
Kanbante/Flowdeck ; les re-vendanges de la v0.2.0 le corrigent).
|
||||
v0.3.0 (HUB-1) : aucun style nouveau — les liens du Hub du menu
|
||||
compte (Télécharger, À Propos, Aides, Profil) réutilisent
|
||||
.draco-menu-item (déjà ancre-compatible : text-decoration none)
|
||||
et le séparateur .draco-menu-sep du menu des applications.
|
||||
Jetons repris du prototype validé Console v7.2.
|
||||
Thème : clair par défaut, sombre via [data-theme="dark"] sur <html>
|
||||
ou prefers-color-scheme si l'app intégratrice ne force rien
|
||||
|
||||
+86
-15
@@ -14,6 +14,21 @@
|
||||
* contrat que les autres apps), entrée APP_LABELS ; l'onglet
|
||||
* (data-app="shaarit", après Kanbante, avant agent) est repris
|
||||
* automatiquement par la construction du menu de la marque.
|
||||
* v0.3.0 (carte HUB-1, fusion #115) : le Hub, point central de la
|
||||
* suite — nouvelle clé d'URL « hub » (jeton {{URL_HUB}} côté hôte,
|
||||
* DRACO_BAR_CONFIG.urls.hub), défaut officiel
|
||||
* https://hub.dracodev.net/, dérivation -dev hub-dev comme les
|
||||
* sœurs. Le menu compte gagne trois vrais liens (patron
|
||||
* buildAppsMenu : <a href>, classe draco-menu-item) — Télécharger
|
||||
* → <hub>/telecharger, À Propos → <hub>/a-propos, Aides →
|
||||
* <hub>/aide — et « Profil » devient lui aussi un lien, vers
|
||||
* <hub>/profil (il n'est plus relayé aux hôtes : un seul Profil,
|
||||
* celui du Hub). « Déconnexion » reste l'action relayée
|
||||
* (data-compte-act="deconnexion" / onAction), inchangée.
|
||||
* refreshMenuHrefs() resynchronise aussi les liens du Hub à
|
||||
* l'ouverture des menus. Le Hub n'a pas d'onglet dans la barre :
|
||||
* comme spark, sa clé est résolue et exposée via DRACO_BAR.urls,
|
||||
* sans étape « href rendu » (voir « URL » ci-dessous).
|
||||
*
|
||||
* Aucun gestionnaire inline : un seul écouteur délégué sur le document
|
||||
* (patron validé par le prototype — les onclick du HTML généré sont
|
||||
@@ -33,7 +48,8 @@
|
||||
* kanbante: "https://kanbante.dracodev.net/",
|
||||
* shaarit: "https://shaarit.dracodev.net/",
|
||||
* agent: "https://agent.dracodev.net/",
|
||||
* spark: "https://spark.dracodev.net/"
|
||||
* spark: "https://spark.dracodev.net/",
|
||||
* hub: "https://hub.dracodev.net/"
|
||||
* },
|
||||
* onAction: function (act, el) { … } // l'app relaie les actions
|
||||
* } // qu'elle ne connaît pas
|
||||
@@ -67,6 +83,12 @@
|
||||
* la marque et DRACO_BAR.urls. Même résolution pour shaarit (v0.2.0) :
|
||||
* explicite > dérivation -dev shaarit-dev > href rendu
|
||||
* ({{URL_SHAARIT}}) > défaut officiel.
|
||||
* Cas hub (v0.3.0) : PAS d'onglet, donc pas d'étape « href rendu » —
|
||||
* explicite (DRACO_BAR_CONFIG.urls.hub, alimenté par le jeton
|
||||
* {{URL_HUB}} remplacé côté serveur par l'hôte) > dérivation -dev
|
||||
* hub-dev sur hôte -dev > défaut officiel
|
||||
* https://hub.dracodev.net/. La base résolue sert les quatre liens
|
||||
* du menu compte (telecharger, a-propos, aide, profil).
|
||||
* Actions émises (data-act) : rail, palette, domaine (data-dom),
|
||||
* alertes, spark, rappel-entete. L'app intégratrice décide de chacune
|
||||
* (ouvrir la palette, le panneau Spark, changer de domaine…).
|
||||
@@ -141,6 +163,14 @@
|
||||
* mais le menu affiche l'identité même sans gestionnaire hôte.
|
||||
* Accessibilité : vrais <button>, aria-haspopup / aria-expanded,
|
||||
* role="menu" / "menuitem", fermeture par Échap et clic extérieur.
|
||||
* Menu compte (v0.3.0) — Profil n'est PLUS relayé : c'est un lien
|
||||
* vers <hub>/profil, comme Télécharger / À Propos / Aides (liens
|
||||
* Hub, data-hub-link, href resynchronisés à chaque ouverture via
|
||||
* refreshCompteHrefs / refreshMenuHrefs). Seule « Déconnexion »
|
||||
* reste relayée à l'hôte (data-compte-act="deconnexion"), inchangée.
|
||||
* Les hôtes qui traitaient onAction("profil") (Kanbante → /profile)
|
||||
* voient ce comportement remplacé par le lien Hub — décision du
|
||||
* plan Hub : un seul Profil, celui du Hub.
|
||||
*/
|
||||
(function () {
|
||||
"use strict";
|
||||
@@ -155,7 +185,8 @@
|
||||
kanbante: "https://kanbante.dracodev.net/",
|
||||
shaarit: "https://shaarit.dracodev.net/",
|
||||
agent: "https://agent.dracodev.net/",
|
||||
spark: "https://spark.dracodev.net/"
|
||||
spark: "https://spark.dracodev.net/",
|
||||
hub: "https://hub.dracodev.net/"
|
||||
};
|
||||
|
||||
/* Dérivation -dev (v0.1.6) — appliquée UNIQUEMENT quand l'hôte courant
|
||||
@@ -168,7 +199,8 @@
|
||||
tiktak: "https://tiktak-dev.dracodev.net/",
|
||||
kanbante: "https://kanbante-dev.dracodev.net/",
|
||||
shaarit: "https://shaarit-dev.dracodev.net/",
|
||||
agent: "https://agent-dev.dracodev.net/"
|
||||
agent: "https://agent-dev.dracodev.net/",
|
||||
hub: "https://hub-dev.dracodev.net/"
|
||||
};
|
||||
|
||||
var APP_LABELS = {
|
||||
@@ -307,6 +339,28 @@
|
||||
menu.querySelectorAll(".draco-apps-item").forEach(function (a) {
|
||||
if (a.dataset.app && resolvedUrls[a.dataset.app]) a.setAttribute("href", resolvedUrls[a.dataset.app]);
|
||||
});
|
||||
/* v0.3.0 : les liens du Hub (menu compte) sont resynchronisés
|
||||
* eux aussi à l'ouverture d'un menu, pour refléter setUrls et
|
||||
* la dérivation -dev même s'ils ont été construits avant. */
|
||||
refreshCompteHrefs();
|
||||
}
|
||||
/* Liens du Hub dans le menu compte (v0.3.0) : chemin → libellé.
|
||||
* « Profil » est le quatrième lien (vers <hub>/profil) ; il
|
||||
* remplace l'ancien item relayé « profil ». */
|
||||
var HUB_LINKS = [
|
||||
["telecharger", "Télécharger"],
|
||||
["a-propos", "À Propos"],
|
||||
["aide", "Aides"],
|
||||
["profil", "Profil"]
|
||||
];
|
||||
function hubHref(path) {
|
||||
return withSlash(resolvedUrls.hub || DEFAULT_URLS.hub) + path;
|
||||
}
|
||||
function refreshCompteHrefs() {
|
||||
if (!compteMenu) return;
|
||||
compteMenu.querySelectorAll("[data-hub-link]").forEach(function (a) {
|
||||
a.setAttribute("href", hubHref(a.getAttribute("data-hub-link")));
|
||||
});
|
||||
}
|
||||
function togglePopup(menu, btn, force) {
|
||||
if (!menu) return;
|
||||
@@ -429,10 +483,14 @@
|
||||
if (!appsMenu.hidden) lastOpener = brand;
|
||||
}
|
||||
|
||||
/* Menu compte (v0.1.6) — en-tête d'identité + Profil / Déconnexion
|
||||
* relayés à l'hôte. L'en-tête est rafraîchi à chaque ouverture, pour
|
||||
* refléter un title posé après coup par l'hôte (ex. ObsiGate, qui
|
||||
* remplit l'avatar depuis /api/auth/me après chargement). */
|
||||
/* Menu compte (v0.1.6 ; v0.3.0 pour les liens) — en-tête
|
||||
* d'identité, puis les liens du Hub (Télécharger, À Propos,
|
||||
* Aides, Profil — vrais <a href>, même patron que le menu des
|
||||
* applications), un séparateur, puis « Déconnexion » relayée à
|
||||
* l'hôte. L'en-tête et les href sont rafraîchis à chaque
|
||||
* ouverture, pour refléter un title posé après coup par l'hôte
|
||||
* (ex. ObsiGate, qui remplit l'avatar depuis /api/auth/me après
|
||||
* chargement) et la résolution d'URL la plus récente. */
|
||||
function buildCompteMenu() {
|
||||
if (!bar || !avatarBtn || compteMenu) return;
|
||||
compteMenu = document.createElement("div");
|
||||
@@ -443,15 +501,26 @@
|
||||
var head = document.createElement("div");
|
||||
head.className = "draco-compte-nom";
|
||||
compteMenu.appendChild(head);
|
||||
[["profil", "Profil"], ["deconnexion", "Déconnexion"]].forEach(function (pair) {
|
||||
var b = document.createElement("button");
|
||||
b.type = "button";
|
||||
b.className = "draco-menu-item";
|
||||
b.setAttribute("data-compte-act", pair[0]);
|
||||
b.setAttribute("role", "menuitem");
|
||||
b.textContent = pair[1];
|
||||
compteMenu.appendChild(b);
|
||||
HUB_LINKS.forEach(function (pair) {
|
||||
var a = document.createElement("a");
|
||||
a.className = "draco-menu-item";
|
||||
a.href = hubHref(pair[0]);
|
||||
a.setAttribute("data-hub-link", pair[0]);
|
||||
a.setAttribute("role", "menuitem");
|
||||
a.textContent = pair[1];
|
||||
compteMenu.appendChild(a);
|
||||
});
|
||||
var sep = document.createElement("div");
|
||||
sep.className = "draco-menu-sep";
|
||||
sep.setAttribute("aria-hidden", "true");
|
||||
compteMenu.appendChild(sep);
|
||||
var b = document.createElement("button");
|
||||
b.type = "button";
|
||||
b.className = "draco-menu-item";
|
||||
b.setAttribute("data-compte-act", "deconnexion");
|
||||
b.setAttribute("role", "menuitem");
|
||||
b.textContent = "Déconnexion";
|
||||
compteMenu.appendChild(b);
|
||||
bar.appendChild(compteMenu);
|
||||
}
|
||||
function refreshCompteMenu() {
|
||||
@@ -459,6 +528,7 @@
|
||||
var head = compteMenu.querySelector(".draco-compte-nom");
|
||||
var name = displayName();
|
||||
if (head) head.textContent = name || "Compte";
|
||||
refreshCompteHrefs();
|
||||
}
|
||||
function toggleCompteMenu(force) {
|
||||
buildCompteMenu();
|
||||
@@ -555,6 +625,7 @@
|
||||
resolvedUrls = resolveUrls();
|
||||
window.DRACO_BAR.urls = resolvedUrls;
|
||||
applyUrls(resolvedUrls);
|
||||
refreshCompteHrefs();
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -38,8 +38,12 @@ def _nettoyer(monkeypatch):
|
||||
|
||||
|
||||
def test_barre_css_js_verbatim_commons_v020():
|
||||
assert _sha256("static/css/draco-barre.css") == SHA256_CSS_V020
|
||||
assert _sha256("static/js/draco-barre.js") == SHA256_JS_V020
|
||||
# Remplacé en 0.45.9 : la re-vendange v0.3.0 (HUB-1) supersède
|
||||
# les empreintes v0.2.0 — les empreintes courantes sont
|
||||
# verrouillées par tests/test_barre_v030.py. On garde ici la
|
||||
# preuve que les fichiers ont bien quitté la v0.2.0.
|
||||
assert _sha256("static/css/draco-barre.css") != SHA256_CSS_V020
|
||||
assert _sha256("static/js/draco-barre.js") != SHA256_JS_V020
|
||||
|
||||
|
||||
def test_logo_shaarit_verbatim():
|
||||
|
||||
@@ -0,0 +1,89 @@
|
||||
"""Barre commune v0.3.0 (HUB-1, fusion #115) — re-vendange 0.45.9.
|
||||
|
||||
- CSS/JS vendangés VERBATIM depuis dracodev-commons, branche
|
||||
hub-menu-compte-v0-3-0 (PR commons #9), ui/barre-apps/.
|
||||
- Menu compte : liens Hub (Télécharger, À Propos, Aides) et
|
||||
Profil devenu lien vers <hub>/profil. Point explicite du
|
||||
chantier : Kanbante traitait l'action relayée « profil » vers
|
||||
sa page /profile propre — ce comportement est REMPLACÉ par le
|
||||
lien Hub (un seul Profil, celui du Hub). La branche
|
||||
onAction("profil") du gabarit est retirée ; la page /profile
|
||||
elle-même continue d'exister. « Déconnexion » reste relayée.
|
||||
- URL Hub résolue par le même mécanisme que les autres apps
|
||||
(explicite DRACO_HUB_URL > hôte de la requête > dérivation par
|
||||
l'agent > défaut officiel), exposée au gabarit (draco_urls.hub)
|
||||
et passée en urls.hub de DRACO_BAR_CONFIG.
|
||||
"""
|
||||
import hashlib
|
||||
from pathlib import Path
|
||||
|
||||
R = Path(__file__).resolve().parents[1]
|
||||
|
||||
# Empreintes SHA-256 de la source commons v0.3.0
|
||||
# (Projets/dracodev-commons, ui/barre-apps/, branche
|
||||
# hub-menu-compte-v0-3-0 @ff92ece).
|
||||
SHA256_CSS_V030 = "4ac2ed2ee04549f40c71e5700149271d5b07b04e4ab88073e94328fcbf9475b0"
|
||||
SHA256_JS_V030 = "9d84617bfb4346d6a17d769da83d04ebc9bc38d40962c58dd7347f13a6c74da5"
|
||||
|
||||
_ENV_BARRE = (
|
||||
"DRACO_SSO_URL", "DRACO_FLOWDECK_URL", "DRACO_TIKTAK_URL",
|
||||
"DRACO_SHAARIT_URL", "DRACO_HUB_URL", "KANBANTE_PUBLIC_URL",
|
||||
"AGENT_URL", "AGENT_EVENEMENTS_URL",
|
||||
)
|
||||
|
||||
|
||||
def _sha256(chemin):
|
||||
return hashlib.sha256((R / chemin).read_bytes()).hexdigest()
|
||||
|
||||
|
||||
def _nettoyer(monkeypatch):
|
||||
for nom in _ENV_BARRE:
|
||||
monkeypatch.delenv(nom, raising=False)
|
||||
|
||||
|
||||
def test_barre_css_js_verbatim_commons_v030():
|
||||
assert _sha256("static/css/draco-barre.css") == SHA256_CSS_V030
|
||||
assert _sha256("static/js/draco-barre.js") == SHA256_JS_V030
|
||||
|
||||
|
||||
def test_js_liens_hub_et_profil_lien():
|
||||
js = (R / "static/js/draco-barre.js").read_text(encoding="utf-8")
|
||||
assert 'hub: "https://hub.dracodev.net/"' in js
|
||||
assert 'hub: "https://hub-dev.dracodev.net/"' in js
|
||||
assert '"telecharger", "Télécharger"' in js
|
||||
assert '"a-propos", "À Propos"' in js
|
||||
assert '"aide", "Aides"' in js
|
||||
assert '"profil", "Profil"' in js
|
||||
assert "data-hub-link" in js
|
||||
assert 'data-compte-act", "profil"' not in js
|
||||
assert 'data-compte-act", "deconnexion"' in js
|
||||
|
||||
|
||||
def test_gabarit_branche_hub_et_retire_profil_relaye():
|
||||
gabarit = (R / "app/templates/_draco_bar.html").read_text(encoding="utf-8")
|
||||
assert 'urls: { hub: "{{ draco_urls.hub }}/" }' in gabarit
|
||||
# La branche relayée vers /profile a disparu du onAction…
|
||||
assert 'if (act === "profil")' not in gabarit
|
||||
# …mais la déconnexion relayée est intacte.
|
||||
assert 'if (act === "deconnexion") { location.href = "/logout"; return; }' \
|
||||
in gabarit
|
||||
|
||||
|
||||
def test_hub_resolution_meme_mecanisme(monkeypatch):
|
||||
_nettoyer(monkeypatch)
|
||||
from app.config import resoudre_urls_draco
|
||||
assert resoudre_urls_draco().hub_url == "https://hub.dracodev.net"
|
||||
assert resoudre_urls_draco("kanbante-dev.dracodev.net").hub_url == \
|
||||
"https://hub-dev.dracodev.net"
|
||||
assert resoudre_urls_draco("kanbante.dracodev.net").hub_url == \
|
||||
"https://hub.dracodev.net"
|
||||
monkeypatch.setenv("DRACO_HUB_URL", "https://hub.example.net/")
|
||||
assert resoudre_urls_draco("kanbante-dev.dracodev.net").hub_url == \
|
||||
"https://hub.example.net"
|
||||
|
||||
|
||||
def test_page_profile_existe_toujours():
|
||||
# La page propre à Kanbante n'est pas supprimée : seul le
|
||||
# menu compte de la barre ne la cible plus.
|
||||
main = (R / "app/main.py").read_text(encoding="utf-8")
|
||||
assert '@app.get("/profile")' in main
|
||||
Reference in New Issue
Block a user