From b8bd6b58e5cff647c0f96270873435fb2e85272b Mon Sep 17 00:00:00 2001 From: Gregory Cage Date: Wed, 24 Sep 2025 16:34:54 -0400 Subject: [PATCH 1/7] Add ORNL specific logic when loggin in from NOVA --- lib/galaxy/authnz/custos_authnz.py | 1 - lib/galaxy/authnz/psa_authnz.py | 1 - lib/galaxy/config/schemas/config_schema.yml | 14 ++++++++++++++ lib/galaxy/managers/configuration.py | 2 ++ lib/galaxy/webapps/galaxy/controllers/authnz.py | 11 +++++++++++ 5 files changed, 27 insertions(+), 2 deletions(-) diff --git a/lib/galaxy/authnz/custos_authnz.py b/lib/galaxy/authnz/custos_authnz.py index d8fd3a6f5f..2a9a45789b 100644 --- a/lib/galaxy/authnz/custos_authnz.py +++ b/lib/galaxy/authnz/custos_authnz.py @@ -590,7 +590,6 @@ class OIDCAuthnzBase(IdentityProvider): custos_authnz_token = self._get_custos_authnz_token(sa_session, user_id, self.config.provider) user = custos_authnz_token.user if custos_authnz_token else None - self.refresh(sa_session, custos_authnz_token, 90) return user, decoded_jwt diff --git a/lib/galaxy/authnz/psa_authnz.py b/lib/galaxy/authnz/psa_authnz.py index 70451874d3..d8bb7fac16 100644 --- a/lib/galaxy/authnz/psa_authnz.py +++ b/lib/galaxy/authnz/psa_authnz.py @@ -329,7 +329,6 @@ class PSAAuthnz(IdentityProvider): user_id = decoded_jwt["unique_name"] authnz_token = self._get_authnz_token(sa_session, user_id, self.config["provider"]) user = authnz_token.user if authnz_token else None - self.refresh(sa_session, authnz_token, 90) return user, decoded_jwt @staticmethod diff --git a/lib/galaxy/config/schemas/config_schema.yml b/lib/galaxy/config/schemas/config_schema.yml index a6dbbd35a6..6f672c1fd1 100644 --- a/lib/galaxy/config/schemas/config_schema.yml +++ b/lib/galaxy/config/schemas/config_schema.yml @@ -4168,3 +4168,17 @@ mapping: Number of seconds before file source content listings are refreshed. Shorter times will result in more queries while browsing a file sources. Longer times will result in fewer requests to file sources but outdated contents might be displayed to the user. Currently only affects s3fs file sources. + + ornl_nova_redirect_url: + type: str + default: https://nova-test.ornl.gov + required: false + desc: | + ORNL Only. The url to return to when logging in through Galaxy via NOVA. + + ornl_nova_login_origin_cookie: + type: str + default: galaxy-nova-login + required: false + desc: | + ORNL Only. The name of the cookie to check whether the user was sent from NOVA to log in. \ No newline at end of file diff --git a/lib/galaxy/managers/configuration.py b/lib/galaxy/managers/configuration.py index 68f312a3df..d7bd20d918 100644 --- a/lib/galaxy/managers/configuration.py +++ b/lib/galaxy/managers/configuration.py @@ -233,6 +233,8 @@ class ConfigSerializer(base.ModelSerializer): "enable_help_forum_tool_panel_integration": _use_config, "disable_batch_input": _use_config, "llm_api_configured": lambda item, key, **context: bool(item.openai_api_key), + "ornl_nova_redirect_url": _defaults_to("https://nova-test.ornl.gov"), + "ornl_nova_login_origin_cookie": _defaults_to("galaxy-nova-login") } diff --git a/lib/galaxy/webapps/galaxy/controllers/authnz.py b/lib/galaxy/webapps/galaxy/controllers/authnz.py index 32a7ce5813..44f6578c08 100644 --- a/lib/galaxy/webapps/galaxy/controllers/authnz.py +++ b/lib/galaxy/webapps/galaxy/controllers/authnz.py @@ -91,6 +91,12 @@ class OIDC(JSAppLauncher): trans.set_cookie(value="/", name=LOGIN_NEXT_COOKIE_NAME) success, message, redirect_uri = trans.app.authnz_manager.authenticate(provider, trans, idphint) if success: + + # ORNL ONLY logic + nova_login = trans.get_cookie(trans.app.config.ornl_nova_login_origin_cookie) + if nova_login == "true": + return trans.response.send_redirect(url_for(redirect_uri)) + return {"redirect_uri": redirect_uri} else: raise exceptions.AuthenticationFailed(message) @@ -149,6 +155,11 @@ class OIDC(JSAppLauncher): trans.set_cookie(value=provider, name=PROVIDER_COOKIE_NAME) # Clear the login next cookie back to default. trans.set_cookie(value="/", name=LOGIN_NEXT_COOKIE_NAME) + + # ORNL ONLY logic + nova_login = trans.get_cookie(trans.app.config.ornl_nova_login_origin_cookie) + if nova_login == "true": + return trans.response.send_redirect(url_for(trans.app.config.ornl_nova_redirect_url)) return trans.response.send_redirect(url_for(redirect_url)) @web.expose -- GitLab From 6b0bb4bb3635126f6447e61a350e6e6d29bb3855 Mon Sep 17 00:00:00 2001 From: Gregory Cage Date: Fri, 26 Sep 2025 11:43:57 -0400 Subject: [PATCH 2/7] Generalize external login redirect cookie --- lib/galaxy/config/schemas/config_schema.yml | 14 ++++---------- lib/galaxy/managers/configuration.py | 3 +-- lib/galaxy/webapps/galaxy/controllers/authnz.py | 10 +++++----- 3 files changed, 10 insertions(+), 17 deletions(-) diff --git a/lib/galaxy/config/schemas/config_schema.yml b/lib/galaxy/config/schemas/config_schema.yml index 6f672c1fd1..f1e4016e68 100644 --- a/lib/galaxy/config/schemas/config_schema.yml +++ b/lib/galaxy/config/schemas/config_schema.yml @@ -4169,16 +4169,10 @@ mapping: queries while browsing a file sources. Longer times will result in fewer requests to file sources but outdated contents might be displayed to the user. Currently only affects s3fs file sources. - ornl_nova_redirect_url: + external_login_redirect_cookie: type: str - default: https://nova-test.ornl.gov + default: "galaxy-external-login-redirect" required: false desc: | - ORNL Only. The url to return to when logging in through Galaxy via NOVA. - - ornl_nova_login_origin_cookie: - type: str - default: galaxy-nova-login - required: false - desc: | - ORNL Only. The name of the cookie to check whether the user was sent from NOVA to log in. \ No newline at end of file + The name of a cookie to check after Galaxy has been logged into via an external third party. If present, Galaxy + will redirect to the url contained in the cookie. \ No newline at end of file diff --git a/lib/galaxy/managers/configuration.py b/lib/galaxy/managers/configuration.py index d7bd20d918..71060fae8a 100644 --- a/lib/galaxy/managers/configuration.py +++ b/lib/galaxy/managers/configuration.py @@ -233,8 +233,7 @@ class ConfigSerializer(base.ModelSerializer): "enable_help_forum_tool_panel_integration": _use_config, "disable_batch_input": _use_config, "llm_api_configured": lambda item, key, **context: bool(item.openai_api_key), - "ornl_nova_redirect_url": _defaults_to("https://nova-test.ornl.gov"), - "ornl_nova_login_origin_cookie": _defaults_to("galaxy-nova-login") + "external_login_redirect_cookie": _defaults_to("galaxy-external-login-redirect") } diff --git a/lib/galaxy/webapps/galaxy/controllers/authnz.py b/lib/galaxy/webapps/galaxy/controllers/authnz.py index 44f6578c08..9db77a03bf 100644 --- a/lib/galaxy/webapps/galaxy/controllers/authnz.py +++ b/lib/galaxy/webapps/galaxy/controllers/authnz.py @@ -93,8 +93,8 @@ class OIDC(JSAppLauncher): if success: # ORNL ONLY logic - nova_login = trans.get_cookie(trans.app.config.ornl_nova_login_origin_cookie) - if nova_login == "true": + external_login = trans.get_cookie(trans.app.config.external_login_redirect_cookie) + if external_login: return trans.response.send_redirect(url_for(redirect_uri)) return {"redirect_uri": redirect_uri} @@ -157,9 +157,9 @@ class OIDC(JSAppLauncher): trans.set_cookie(value="/", name=LOGIN_NEXT_COOKIE_NAME) # ORNL ONLY logic - nova_login = trans.get_cookie(trans.app.config.ornl_nova_login_origin_cookie) - if nova_login == "true": - return trans.response.send_redirect(url_for(trans.app.config.ornl_nova_redirect_url)) + external_login = trans.get_cookie(trans.app.config.external_login_redirect_cookie) + if external_login and (external_login.find("https://") == 0 or external_login.find("http://") == 0): + return trans.response.send_redirect(url_for(external_login)) return trans.response.send_redirect(url_for(redirect_url)) @web.expose -- GitLab From 4100b116ae0b5c9c7eb91a932694845cf12b5291 Mon Sep 17 00:00:00 2001 From: Gregory Cage Date: Tue, 30 Sep 2025 12:39:31 -0400 Subject: [PATCH 3/7] Set External Redirect Cookie in Galaxy --- lib/galaxy/webapps/galaxy/controllers/authnz.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/galaxy/webapps/galaxy/controllers/authnz.py b/lib/galaxy/webapps/galaxy/controllers/authnz.py index 9db77a03bf..05642e9109 100644 --- a/lib/galaxy/webapps/galaxy/controllers/authnz.py +++ b/lib/galaxy/webapps/galaxy/controllers/authnz.py @@ -77,7 +77,7 @@ class OIDC(JSAppLauncher): @web.json @web.expose - def login(self, trans, provider, idphint=None, next=None): + def login(self, trans, provider, idphint=None, next=None, external_redirect=None): if not trans.app.config.enable_oidc: msg = "Login to Galaxy using third-party identities is not enabled on this Galaxy instance." log.debug(msg) @@ -93,8 +93,8 @@ class OIDC(JSAppLauncher): if success: # ORNL ONLY logic - external_login = trans.get_cookie(trans.app.config.external_login_redirect_cookie) - if external_login: + if external_redirect: + trans.set_cookie(value=external_redirect, name=trans.app.config.external_login_redirect_cookie) return trans.response.send_redirect(url_for(redirect_uri)) return {"redirect_uri": redirect_uri} -- GitLab From 47050bbe7f12140252eb100ee38fb937d81eb76f Mon Sep 17 00:00:00 2001 From: Gregory Cage Date: Wed, 1 Oct 2025 12:05:03 -0400 Subject: [PATCH 4/7] Clear External Redirect Cookie after logging in via OAUTH --- lib/galaxy/webapps/galaxy/controllers/authnz.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/lib/galaxy/webapps/galaxy/controllers/authnz.py b/lib/galaxy/webapps/galaxy/controllers/authnz.py index 05642e9109..a0c0274729 100644 --- a/lib/galaxy/webapps/galaxy/controllers/authnz.py +++ b/lib/galaxy/webapps/galaxy/controllers/authnz.py @@ -91,8 +91,6 @@ class OIDC(JSAppLauncher): trans.set_cookie(value="/", name=LOGIN_NEXT_COOKIE_NAME) success, message, redirect_uri = trans.app.authnz_manager.authenticate(provider, trans, idphint) if success: - - # ORNL ONLY logic if external_redirect: trans.set_cookie(value=external_redirect, name=trans.app.config.external_login_redirect_cookie) return trans.response.send_redirect(url_for(redirect_uri)) @@ -156,9 +154,9 @@ class OIDC(JSAppLauncher): # Clear the login next cookie back to default. trans.set_cookie(value="/", name=LOGIN_NEXT_COOKIE_NAME) - # ORNL ONLY logic external_login = trans.get_cookie(trans.app.config.external_login_redirect_cookie) if external_login and (external_login.find("https://") == 0 or external_login.find("http://") == 0): + trans.set_cookie(value="", name=trans.app.config.external_login_redirect_cookie) return trans.response.send_redirect(url_for(external_login)) return trans.response.send_redirect(url_for(redirect_url)) -- GitLab From d64bc93ec321230d62b53fa2fde3118e6873df08 Mon Sep 17 00:00:00 2001 From: Gregory Cage Date: Wed, 8 Oct 2025 12:04:59 -0400 Subject: [PATCH 5/7] Bump version --- .gitlab-ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index bc8d4048ed..dba5349fec 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -9,8 +9,8 @@ variables: CONTAINER_GALAXY_URL: "${NDIP_DOCKER_REPOSITORY}/${CI_PROJECT_PATH}" CONTAINER_GALAXY_BASE_URL: "${CONTAINER_GALAXY_URL}/base" CONTAINER_GALAXY_COMMIT_URL: "${CONTAINER_GALAXY_URL}/commit" - GALAXY_VERSION_PYTHON: 24.2.dev4+ornl - GALAXY_VERSION_DOCKER: 24.2.dev4.ornl + GALAXY_VERSION_PYTHON: 24.2.dev5+ornl + GALAXY_VERSION_DOCKER: 24.2.dev5.ornl # This import is for the func_rse_docker_* functions before_script: -- GitLab From 34d97b5e37f8580a73be55d561d3c8251839365a Mon Sep 17 00:00:00 2001 From: "Duggan, John" Date: Thu, 9 Oct 2025 19:06:01 +0000 Subject: [PATCH 6/7] Add NOVA link to header --- .gitlab-ci.yml | 4 ++-- client/src/components/Masthead/Masthead.vue | 16 +++++++++++++++- lib/galaxy/config/sample/galaxy.yml.sample | 4 ++++ lib/galaxy/config/schemas/config_schema.yml | 7 +++++++ lib/galaxy/managers/configuration.py | 1 + static/nova_square.png | Bin 0 -> 11812 bytes 6 files changed, 29 insertions(+), 3 deletions(-) create mode 100644 static/nova_square.png diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index dba5349fec..47c6823c3f 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -9,8 +9,8 @@ variables: CONTAINER_GALAXY_URL: "${NDIP_DOCKER_REPOSITORY}/${CI_PROJECT_PATH}" CONTAINER_GALAXY_BASE_URL: "${CONTAINER_GALAXY_URL}/base" CONTAINER_GALAXY_COMMIT_URL: "${CONTAINER_GALAXY_URL}/commit" - GALAXY_VERSION_PYTHON: 24.2.dev5+ornl - GALAXY_VERSION_DOCKER: 24.2.dev5.ornl + GALAXY_VERSION_PYTHON: 24.2.dev6+ornl + GALAXY_VERSION_DOCKER: 24.2.dev6.ornl # This import is for the func_rse_docker_* functions before_script: diff --git a/client/src/components/Masthead/Masthead.vue b/client/src/components/Masthead/Masthead.vue index 32a0814bb2..1f958482b9 100644 --- a/client/src/components/Masthead/Masthead.vue +++ b/client/src/components/Masthead/Masthead.vue @@ -3,7 +3,7 @@ import { BNavbar, BNavbarBrand, BNavbarNav } from "bootstrap-vue"; import { storeToRefs } from "pinia"; import { userLogout } from "utils/logout"; import { withPrefix } from "utils/redirect"; -import { onMounted, ref } from "vue"; +import { computed, onMounted, ref } from "vue"; import { useRouter } from "vue-router/composables"; import { useConfig } from "@/composables/config"; @@ -45,6 +45,14 @@ const props = defineProps({ const extensionTabs = ref([]); const windowToggle = ref(false); +const novaUrl = computed(() => { + if (isConfigLoaded.value) { + return config.value.dashboard_url; + } + + return ""; +}); + function openUrl(url, target = null) { if (!target) { router.push(url); @@ -94,6 +102,12 @@ onMounted(() => { +
  • + + NOVA Square Logo + NOVA Dashboard + +
  • xXr!plu_HD`t0ls#(6Rbz3m%r()2rPIae^K$cc$)jtdw-zFzczwi5gulnQc`+wN%e_iZPdz13KAl=Z&sAUnu>Od>o1!xYf~ZMwNz;C+_{?zXO*)sPM2V1Wi^oMU9nFW$awy_@GA7$~@E z)v9-0ueU_4)zHv5aNqz#RCM&h0F6IZaR)jRO{5Yx-wcS0<6C{T>(HS?4*!o#xp?nh z->zL&Jv}`?w$!`2vQF_@diwdvlP5DWG9299+3!_6=8f53C;Rm2QwD?8PYk4bHMF!A zT^H{-QF|S?Ck6tOJ9e@>@MSFDERT=VS|lG{K5U_wWe~3ii+CR?_aQ> zA%42ys{#u#2IG{PXV0H6Ub3X+pKnC2iB$Td=P?OeqXOgN{5%(iXnnj_{oZk9NYRls z>Ol++`T6=?-Q5c>W+ZIB8M94YT|N2vxw&87^Gcf?$lA*G!RwCm;)?|y8;hQv(wulm zI_-?Mrmn7QT%6qB>V$*`eG?b2Si!-}%*-%n$%+*#3NG%J>TR2(WMm|ys;c_p?c1Y2 zKR>^C^=j*+NkXf%tgNg8Vq$bW`p%s3S#dRsq2X@c{KBi5TcZNQ!r0b^dD~C+TDoH0 zI=&b0&va-dZp^x>^=kr0+NDYPd3nd~?X70C2tD}g>uW<36PN9?&!*LUyP3YD=BE*Z zgO1qZwQGF?SZDaC@tvGBX;MIZyne==sne$~-o0CzVMFrqK1st}k>{HolqN3Ny}LRp z>(*qgnT1Ilu{;K)wJ%=h>&EY!vr1rNgwOxCeA?mbj@;UstvJ<-l{qYIwWw5Y+pbOT zP9$!=Ibrr}>*Q~2_dhetS(1^PJNMiBJB8BCt|1{Jt5&Uw$y*Y(+BGsV(xG&d+v0}; zjvXR}g@tqW_siS&En1|Ml9u+URXnaBurx3*aK*ZH%d!eHGCTs-dZ-BX?G22JLlCRUN~GxpRAu9dld%yYkSQRYGEGs<&2tPJ2;e6`><`-|wS33Ip^YeDhJe#&A ze!pDwww#&QwsI`ovPER^;>8;xbUJ!^mfV|kGsms6a_57}U)|PPh8!nu%gV~~&h=y8 z8rA#nUme5c&k;Y)O!rXn@boOa9>P4;%e7eb=FOXPa`*o@s{i3;`uvOgCr_UI@gTc= zfeO2Qg_$gCIa=;%`90*XUW#vx)Zw=NTln=Qr7Gz~*-EcFfqpz}&sP)Yh*X9JtrT(Zlll1b`+KR-LyNX<6%AS`BCZ$X5Edqum7TpY z`??;(xh>zg_4hoOTu~w(Ak=*{U}eaPRjZmpv_$Wy8yX6FdU|e%TD#-y-NM4ers+gB&6y)(^W#CYhK5Fi+v1O!=1Nn&3V(b^oMT@0Ze))e+-f5~L|5Eqzz)$d#*CFPhI`HMCj0Xwijx_x!$}JbU(Nu)l4q zyL_z(zx|&Lr@wEB(&hCznPT+i>(|0<(K=#t>}sXh`D7a6)*t`yVZ-(8p5ET0xAXU( zooJ>~Rr%*fA%mY#-N&QiU&=W(Zz$Y+bhLZn<(Dk=htoDEK0elKl5zd&)u+LN7h_j? zaYUGJ+p(;F=UcYt@3lq~3>%OhP_uJOa%gZalM5^%5kHRO?@{46UrJV&ugBADl3~d2ijy5U;CK zcNZ}nm?@y6r^oi7`oo8HA*w8znwl$CtzvpGg&}IKSkX?I+S=L)CsQ`u%+b)$c+ioT z^k?Vc-S78xhprAwEGZFb=aW6ODfM*0$49Pv{(L&^;p=;JPvvKY>8AsOf|`yUbCcj< ztNHbE`HyF_^DU15d@|X;;LD4^3=^rGTU$5_3kxGQBrtMubAyumo$~v&6;G#zf2jZe zz5d5z`Trfk%l#Zzh8)T;S+sTQRJNlYf&AR7uXa^_es*zx`P*BpYs0!PUJUf&YISN< zcJFi05o2cHld*X4ZPw*WmnKY^!ot9)$vC4liNVi2Y-tc90~a^hNIY)$7)sTkI|%EZltSR#eQ+BG#o#mv(e?IK;-vzT5x5PDM>E>HojK5;8KNdRR$G zNkB}jZNdZr7It=J4Gj)qVPS@SZ(r6to0(ql=m_VZm;UvKj?35g*#CX$|KqUyKZcbd zUGe{aU7wnxuB;4x@$Q|Qn;YA;b+O(j4Gjz&S0 zq4IMYgI~X*x_bL0B~#O>b^l*3pMUJ>>FI${QC-sJc@L)V|D*cs?CkbUn~Z9HKAk?p zzTVEs*;!CTrRF5R?H2(C1w}>1$jC^BhTGfocfV1e=rLjD%+9VZu9`m|k9YLWPJJd?b39or9lh# z@0SxE+TR-z4l>#8Wf&HOt^Rn?U7oR^Drb%DqwJM(zoY-L?Rlq_#KXh$;Qqh2_Y2P3eh)C8 zHo1ZIlcc6_pjf-KYlpOzj)Cirq9pMyGKMwxF}7$ zeZT6%L3U6vn{a-fZN-a)?HZgzt_uD z5$e2f|33fLDBtd&qT*sus-8W&n_FBjAtQrhe$6M&K3VIw+TY(4m6VtsK71H=9#js6 z*a`|HrKF}_WPj$Fv)ef>P3_X9OBb$OX}NMG1QgjXUcFj$yYso@h3nVd?*?s*s0k05 z!(84W!Pd+uU-v`N%G%mi%3tS1&W35z#8lMO7H!%j#IWM{q^VO||NX056S0xW(a~{+ zdHy_iPDYE(YxDPfWZSA9A@Ds$Z@RLYT3cEJJ3D(UllMJ^i5?qrZ=3!3*kA8bRAeOE z5f&Wmym~Lgh1Uun)Q`wzoY63}vbJ7$G2>2H#`0y$oRlVBkoND&JDOxTY4YTY7cVmQ zx;5Y3U9N0sI8iFo(9rP0>#rs~c9xc%(cAMXr--?f3S94JohZi1$=T6acy9UR(@$T# zdew9@XP%KE!}9bG|9-!J{Os)Pj=ny(++1DTdIkwu*;cQmO-GXs9%|+O`1N}HZdy9x&iW^p)zpuAbQnBr7mTO?(#O~BN6DKxq*C&Gio2PoIvaz#+YViddHcVLj zKRGFB!PP85Vd3UoyR7c)tCi+!XMXtbq28p!!kP{Fp=_3BKg+|z#oOB2VqV$oNh~N3 zIC}KxhTCsVo*$HxE?DLIsPW13=a1KJzgJXkQ+IWm^_{Cn9vqicQdZuWc$iINs#o9D zH`>?M$M^sLwf=w8)hySruxY1#*R5UK8l&f)n5cN{_;Eu^%aeiH_dFOIk}HIMyqfvJ zG3aC2Zds$5JXUl22Uk>4VJON`#~gA1k2 z^Awbnm^Na(ovSQd#CC6elm+$trT;>O7xc>j%|KD1Mk3FvTYiR#*HLaVIYY)b?@2_3$!0=eY z)zvjv$<^JR-7N1;hiUe;1>3fX-MxEPZwbR3b7LDDncd~@j~zL}($v(n;>m;N3ChOC z!jmUYUa@lJ#~JYqExi5=SBw+C3pSliJA7?zw5DcORu+rr#p~DI&s(afu)N>%neW)K zV;@dwuitS)zGlLQZR)#wN;_|QyettENV;zh-|PRIOG!&x7IFnionZeM;W1~?wryfky~p1Es#%^bJFLc^-+YC&1q-e=F!`mDVStgO23+=+?M5o2Lx1r-bCd3O$+um4xfaA2Wx zI|Il5muizcZz;@EVT(?d;^=(1UCVH$&z5_MA0HiUGH+`T-QI9nH+FZK?x)Y6Eic+O zA8gp1ejeo7_?9tZR*rF`|;c}N#J+V(^FF! zUkZMUPTC;qY+e3N#Kgo?kyDX1lhda1(~^XIm&i!TZ}0E>ho1QQ`nu)Mz6%!uT3ReD zVw6JjF>D&G~mDfI~6g;0fVVdis$}eBP?hIvLGHlGi&?%`}<>1yCXKHW}42tS*txK`c+l!dSDma8h^xKrq32DYg5y!Z#y?< zIcrUQWdHxOePC3S)`>UIo~5<4wJqAPL7@Kk?fV~YWv^E>F}aeuzoUc0i%&6mN<)R= z#fuj~ndn%rv?YJls#Q-8G%|15*!jff$2$$j)Kt~44lR=^9UUEa)cv)}%FY&)lj}Qm z%4_;1n|L1oFs{$tvzK%4?>IQ^xBd4!#ZA9uED9Q4*$17}5vfu9+F$+s-BQ_D{e3?c z9Z!+ic~h*LRcmUO+MOR0PCu29lWX%)YrdNY^5BJw7afM%cdk70q2zj+ zrR)z^o}h|JQ>LhB=$=V4zE}4vX~mwoSL`PlZJseh!shRn%R8#RYDGmwu`Fe6 z^iVmpr}FcP*3$B0 z%3EGu-lN&;_p%+3{9;x1X2$uiA~{=(1F~2?G)t_R_{1-2g1OJafE_ym{@4Wx9r}B9 zeH|-9Mn=YmPKk!#aQjaulo{^q-l+4V)qb7|uOiz=o1)_4yYEhyd)F$mK2X_yH}Ckv z!|j6d^8Kyc;)^zKzWmyjZC|KzVPPSotiEM#(uS%4k24$D0y8sLo-QkU=Monur=_Je zVaAM(A3rKU&E*ZZ-^N{jp;PzgvHayzFYfLxuNL{*a9QK++qbU1zP;{AAz@*QmMvpD zeE4u2bD+vAttX8Y&K@2dx-Tl9%}lR}i`ANN(NFBM8e8RxoV%*r*AyPjH~DR*A;J|B z9{%{o#^f)IrY0skOt0N>)SK?SG9+m0var>6tF+#f+Z>H$SpF+;_0_yyAEv2Zt^Ibt zIwlqPu)zP7aUORIcNFvY&s+UfazzWww_=ZjylPj+B!^({s}{&y4!y z#3opH@<@{5+7>ej9+RY1mtU^Xex)s@8^v-U(tOs$iHzMxo7Sw+nLn%PPixrfrFkot zHzntD@bS6T*V{jO{5W=9yoSzsx4yq;mwkG;{fI!(;v3x$yt#uev0J#R8G5j@u}zpa zug`nB-odP`ex5wc4}9LOU9rL;C}@&*;71>a_1A;>RdjUDr0@3NIC${jmfJph(~GZc z4JZ|tj_3TsFjZ2MEp6r*`^0UMZ63mpmbtmRKi04Rd3wrK4tb$YmakvG3UnWR@&5hy z41-_I`}WyYy_qmUpry6-XX%~?4-#rVom6LNnE(IJa|5Z~5TOmSKUi8M{%ATj9_R@v zm?$hJl)om|am|bUf1c`ZIoOfn?D?6W!N0>526lFQyYIf6dPQmCiN&ifzW#b4YbysA*P_b|Y;0^7Zr|<>UhW5K z0yE5sJGIn%I>V3nwW<~Koc68;wLF7^h11>3bOb)U-N6vF%G|=jV{?PEv-5`AZ#%lW z7Crf}o$*-wgnc(0l(eym>mL26FK5*zly49)d8zXW`Ivf~__^*v zd)e-}i@n}0VKf*0kbmTE%ZCpIIuRQV{O*&RFk!-hpTF7de>9%9Gv2B1lM!-U$8c{T^be_yy<*A(YjP+(B^WwHFlxhE_h@0Oi+CvIz$ z><5mF)YPT7XInSxJ@rvCIDGTQ&$};QzPzy|Q~2(+8#g+P)6XT`+f(_Y|NjquiC(ve zwP9PfZ%x(pSxuQf-Cz6t0sguDy}gM=MM4)ZUS#BNXZGvdn08i*;ar(d zojvbvritr0I5`hqT^$Y@2Y>Y{%f!s=(xtXHZ*rzgn|8@?+V;G=hqmS37LbGudW^$EMAncz$V+=GB$<|33CFf2+sN z%BpB#A#w2F!5MSrEIF=dtJdh2m#4Ru<@LLFZ8vk4X)=|IhR-uFG;}=w`O3=R01XjP zTGyA>EKTs1w6d}Sbu+TAYB8K^m+c5$@<+|Btjz3eyNRi3;70X{9vMrnBp6(XIeBTR z_sf5v-pyYh9kIukmU>S(nNqis=fKPhQqt1Q4{{{utbC*OK<9#@=@O~lwz&T#Z3}#S zd@dAUef{;yV+Bk8pmhiCIR||{>81T|&!(3O3XI%gB^$XIQ zUtW0qm4lzZ-A8TqwkrzGAq>l74TZH@_}7McuRh=1-EC-L(ee5DdH?z``w9x-wkP73U4*zB-% z&mI}G*}T!)au#ko)~&zKOs!Ru?fId^x3793lqZXv^WXGbCP zRqSj9ET53`F zh~?4a#~)89_xpIx-5|#ydGHC}lIv4;%$n!nvaR;ZMfbRDkI15$zhAG0&dV5}CO^r;$=Veu&9JWO1&fVjDWu|)PL7|2F_s{p^En(jo z;}?44$B!NUlk$_2nEGu#aXfnb7&N}+;^r14w1IzyD%T4VZJ>eq4G}sXzP?M3eEG7#vo)-?)>hZx+^JKaGWKuCdvoK)jPN2* zkF@&R8^#A~CMHZ@tT1nOgwC@S;@=i-uC;x$zc%)K9Eb5FH&ySTO{XiaU%PfFZF6AY z@l{i&YKJrZ_~umh=0@X&4F(}$VO3M4CQqJxMORl>_v;O-6+tUs%urq$)Y;a?mbGT$ z3Pt%fz7wZSYy0)9>ej4)h=>;(ANQ6f=ilG=cG`o)D$y(|Dgq4^{yG2u4}Yk# z+T_l4nTO_2di-wT=Gc$>%yc;u-9Eowx^!tqZtha0-Me>7H#axWi3?vF*4^01*mrKt z`t|KclMY^68-3TS_vA^>RfogZ$GzP)Z!(XbVy%4E)>(@Wo#+)gRVm=?2A z&U-92Hddhf=#B09^Sy7(>WEV;b+UVG9vT`F5>T{t%N7T{>ASy1bVz%jIN0{)`0?YQ z*tPlh113$X zV7eq;^zo7FlP6CSetvo?W9#eTDAn6)BXI4r0{2Hs4hOGT>9sN>>Hfaj zE#*h=eh|ABoVaw(;fDuq+>nSB-MC@}$9cQoI*S%9N-&XHc~()Zo3&W}h-_-?6^BQC z)3T;co3?1<#)(~ay>880wwUbs|L^x4xdUV3nMw zr>8~9iwU>4cSU@hr_#22k9%60+N;;E1*N6EPbw~%6j9{k*Dfoahz$(7y1F|GAG4KupL9vE zi#V^WtjzrN>sPt2dV%RqFN>Xc{5LyIo;>;Dg$oTEHW)j(=oGN^m=*2V4ZivRa%dWq%5rY5Fa8le#b?wbPRK2+w=Ov zuU}Qu8w;H*rKWnd&YC5~aA0Tg^95J4K5m}>muKhBofEv4&Z$&PF=3G}EiJtwcY8x( z^Xab}n?wG*Y?!}w)%{DCf?joQaE>}Ded5tXce#a;$HBd~&c%xtPdNSb%IAb$=Xiyb zhDr6+vyVlGhPK-O|9QS-6Mtsby49R=-KOf&rATu0+qAGsnfrsi`~hxO%Jg`NPs3Aqkz1 zHbUiDE*&B)3l}Z~jaSd*o;G8~i=;cRN~}(#7=h-cpP!q{{GhJ3Y||NbLyPS>Hy@Sl z5uG{V#e17|k*aLb1&8E$lqPy)R6CTEY&oq`zc#G<%9W4^9Wk2^2bkq-`STU-CreMc zyHaTP-M+cjbM#MLrgLL@x6Vn+ z*fUk>6L&AV%FNDpVf(cBS>ch9CnK|N=WX}T{K;XLl$^Zsxno_hMqA;#JC=Js9OC}* zdH(-5UuW>OGlLpK_J1$iC;t5ObVGzr$pSk@$-e@!vb>vbzS-nw8~LnRwblCe$sDuG zA^R^F>{*#~ty6J{y0w+n3*MZ(yk}FMtqjq!iYR@13p8(Zcw_SM4aLv>OiWFEcb{!s z@8|JP#nMu;Y`3hgt}dwKK2k6d= zjUDfoZ;xBw?xS`%{{OG=JJs*^&T(8D%=q%%``51*Z}SNX66%w)?GlfxVBG)v?)yD* z%`6Y(>V72Fd^{>%@p9?(3^j8N4GwAZJeCJpQ#R%0R90HftNWGdH?L*>{fCQJuI#+G zf2wx)z1Y`NS(wab_wwbZdw-5lp1daM&+q&HHS`5(iX| zPEz&0aO;+rZr-G>y8nN_Z>;#3WaaSnNT+Z{cJ|?ulhr3qp4`mL&R4P3@!ihna=)sd zBv!6oEFmus%A|$&Yrj8yyZ!#LsoLQa=Fjin|MzV^$RG1+K6&=^^&LvvTsUp|kDKS~ z+=_K_9`Y9^dp`aYoxk_##nVcweVF`&wr<_Zn&QcI;Jn`!hX$VM>Y!ok_;`6CVc~^W zvn*Y;e}8|!{OXN{%NEMs`QA%|BG!h1Mx!=v6zsSEXTk8`)z#H2)~$1kj+V|blLqxQ zjvPIjcyf~Jj-sbr>tc2`fu%nJ%lGffHa2sNTl0&GgoK5KzwE!dIy@OV z5y@~MY2$;Z)8pN0YxkZm^->Yi5aF`+3tG zFd{TGG-?Qz;96sGi3JF`IEIGH_yBBxjX;Da6Sdj8$1%3VVt|9B9wsJ8uGYfPd z1=YD$*4BZ+!Ob5&6zuu=Y<9(;kH<5^Zy)UzFZ}Sp@kNQ%m#<$hZk(7>!W6k^azo1w zSw8k$wo|809cts1R+xM;L*ezCo0}`%ZoR(XYSzT*)7z&^5t;tWXJNwS6DK%6eg6FM zYIrvF=vB zxzciSZDFgQUa=G~ul)GvXvqPcgGal?K{d~|ZDyc$XvFR^T`q3!+CH;cK5FM~iC?~aS+HhJ&pKIkvF?l4u9>}+oL{bM7!eu}71ed>l$VwpWBNJgl_5nX znaRnEPv4$6abn}diGo_D5w_7`VaFoxI_OP*+^Ig#AuUZ!uIhy%XiB{#IyYC>_mHZJ zN3=77Fwo8 zMnbo@p91d9C>io{C){%{$}pCrKP1iJ954$welF+ zSw4F7C}aEHt68q;>FUedoB2Ckgg!_rMsLe0G4gbmY<#;WczwX%}Zn#z@ZZOy{1{HLes3ZJRmAQ}8`S7O6t9+fq*adGc1 zee`wXno#TJ=C`Xl z|KZHApw&JyGIGMn6bX6x_NcYrDknlVNDJmsaa~E`P zD}5bS71z!$Uncl`jaO$+&yjVpyJJ+?C-UWNT&o|kB|~u2rcD!O&U{&Tr154>nY3|d zZ|~O`$MUnXoT8&=KR9$`b@=*YA3hlT`u+QETH^Aq-ELD&%*~VE-`mSD=OdSrYKWHT zrOTIJI;*;=%iG%8YJk=Q^hC>879B~IzviuYyli`t@&gsF$S>R0tnt|p@9gn}U8uRa zS&v&pTZAhlG<4zKy>rE$tEi}4km;MCYZ`h-^hm<}G_f_dA1=@TCz7^VvRhog?6!YY zaIiD`mK7md2W6b9tF6Dix#_&NZexUxEl1f>$JJN4nh!Sc+y9wh_HBcQmzNW0iPDtk z!XKDJ3kwTDtG*-+luhOyzx(xfSEM@I>qY?&6`?&}uSL&k;g?io*)d%zr7(U|(SqF_ z^G~KYRaXAoGQ0ZZsR_-^%^PmNowMCiQ8=^PIUf@ZBtG1}|1T^+=?qIyaIj@d;`#YE)tR=^-uw=3@c(Oxz=&8UzUS)d5gm*`G)GLOgknu z|7qKvp(3p(?i3Rv;LV%eK4~{pfT!WM2A9SjQrH8>l(^4 z&m5OkXS?4uudnfl|MAsVv-(-JZEbDmls;MBbmD}E&F?px88th1Uw-lC4QQ%Hb;0@| z$sLD}BnT&8zFNyt)3kKivZUwd=E|+DpMBQtxbB2gpYPp^+hr#uuN}V51r+PN+53eb zRO{^9wQ*jD;D@81PHeGQ8Pc_CmDc`gwP((sZx7Kr3R%>6@%HU*)9h;wD?^g*?ka8i z$lB?0C~}5)L73Iv&*!XVl0b{hcI~oype=KrEhs4H!ri;RytVaiI)W^7B$mWqnrm+t zx@5_c2Tx8;*3i~ote5WY&TeI8wV~o;Qc7CdC5fg89k-kuowl~N1hd%}FJETf8+YE& z?`V?Yyvk=Y_j_-B$eD75rJmz#iQ(&3tKi0i2@bKbcegZ!wFopSy(wob51D#KMTCnr zDmpsRXy%2RH%~??$8jWWlz92_WyPC~$C;jG*2I4(cjakX>OFnYh7A+MR&(rZ-M7Zt ziv9bK-70MI#Vi~)X?xeF@Rh4S>o8<@p=@+7EwZY$z<_Z$8-Y_V)JkKRC}l zJoos-L}gIZti|l&$_k}Rt2Ko>XEE5EzHh9g#AGxxXW6+zzH*89nvbm$mN3j%p?*Ms znZZTrVkpD?ze^`PKhVzX(02Htg{$3zYSkhJ^LH;a&n9kr$grVNmGyvf+u?^h7#z43 za2NluOAzt%{K#0(>^`-?tiy$qA&c>kzybR+FJ7K~==Vr%&OP^L0Y#2GLdksh^Ut&% ed9Kj$pZ&Q(w5RZ&!i@|J3=E#GelF{r5}E+}eT&He literal 0 HcmV?d00001 -- GitLab From 2d452e62dba9cca24d70b088196fbc9660d03d73 Mon Sep 17 00:00:00 2001 From: John Duggan Date: Tue, 14 Oct 2025 10:31:49 -0400 Subject: [PATCH 7/7] Fix section descriptions in tool_conf.xml --- .gitlab-ci.yml | 4 ++-- lib/galaxy/tool_util/toolbox/base.py | 1 + lib/galaxy/tool_util/toolbox/integrated_panel.py | 3 ++- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 47c6823c3f..faa4f5158d 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -9,8 +9,8 @@ variables: CONTAINER_GALAXY_URL: "${NDIP_DOCKER_REPOSITORY}/${CI_PROJECT_PATH}" CONTAINER_GALAXY_BASE_URL: "${CONTAINER_GALAXY_URL}/base" CONTAINER_GALAXY_COMMIT_URL: "${CONTAINER_GALAXY_URL}/commit" - GALAXY_VERSION_PYTHON: 24.2.dev6+ornl - GALAXY_VERSION_DOCKER: 24.2.dev6.ornl + GALAXY_VERSION_PYTHON: 24.2.dev7+ornl + GALAXY_VERSION_DOCKER: 24.2.dev7.ornl # This import is for the func_rse_docker_* functions before_script: diff --git a/lib/galaxy/tool_util/toolbox/base.py b/lib/galaxy/tool_util/toolbox/base.py index ae7ce9a245..9c993eb84e 100644 --- a/lib/galaxy/tool_util/toolbox/base.py +++ b/lib/galaxy/tool_util/toolbox/base.py @@ -634,6 +634,7 @@ class AbstractToolBox(ManagesIntegratedToolPanelMixin): section_dict = { "id": val.id or "", "name": val.name or "", + "description": val.description or "", "version": val.version or "", } section = ToolSection(section_dict) diff --git a/lib/galaxy/tool_util/toolbox/integrated_panel.py b/lib/galaxy/tool_util/toolbox/integrated_panel.py index 4ceb8a5ae2..f51d9b476f 100644 --- a/lib/galaxy/tool_util/toolbox/integrated_panel.py +++ b/lib/galaxy/tool_util/toolbox/integrated_panel.py @@ -96,9 +96,10 @@ $INTEGRATED_TOOL_PANEL elif item_type == panel_item_types.SECTION: section_id = item.id or "" section_name = item.name or "" + section_description = item.description or "" section_version = item.version or "" integrated_tool_panel.append( - f'
    \n' + f'
    \n' ) for _section_key, section_item_type, section_item in item.panel_items_iter(): if section_item_type == panel_item_types.TOOL: -- GitLab