Merci @Lorenzo Scalese pour ta réponse qui correspond à ce que je souhaite faire.

J'ai peut-être un complément : Je crois comprendre que la méthode OnStartRequest() va être appelée avant le login proprement dit.

Ne devrais-je pas utiliser plutôt OnLogin()  ou OnEndRequest() pour exécuter mon code après le login ?

Je vais faire quelques tests ce matin

Merci @Lorenzo Scalese 

Je vais fouiller ça dans la doc, car je n'ai jamais fait de mapping autrement que globalement pour une BD. Je pense que cela doit être pratique dans certains cas (j'ai une reprise de données à faire, je pense que j'utiliserai cela pour accéder à certaines tables de la base source dans la nouvelle base).

Merci également pour le NS %All que je ne connaissais pas et qui semble très pratique !

Pierre

Merci beaucoup @Lorenzo Scalese pour ta réponse rapide, claire et précise.

J'avais déjà pensé au mapping que j'ai déjà utiliser, mais je ne sais mapper que l'intégralité des routines ou des globales d'une base dans une autre, ce que je trouve trop global.

Dans mon cas précis, je m'en suis tiré en faisant hériter la classe contenant ma méthode RemoveIrisTestUsers de la classe Bna.Utils.Sql. Cela fonctionne car maintenant la méthode est dans la classe courante, le lien est fait avant que je ne change de NS :

ClassMethod RemoveIrisTestUsers() As %Status
{
    w "Suppression des utilisateurs de tests",!

	New $NameSpace
	Set $NameSpace="%SYS"

	// Get test users by login begining
	Set query = "select UPPER(ID) from Security.Users "_
				"where "_
    				"ID like LOWER('ARS-%') or "_
		    		"ID like LOWER('CHERCHEUR-%') or "_
    				"ID like LOWER('CS-%') or "_
    				"ID like LOWER('DGOS-%') or "_
					"ID like LOWER('CENTRE-%')"
	Set sc = ..SelectFirstColsInArray(query, .userIds)
	if 'sc Return sc
	for i=0 : 1 : userIds-1 {
		w userIds.%Get(i),!
	}

	Return $$$OK
}

Bonjour @Jean-Charles Cano

Pour ma part, je pense que tu pourrais te pencher sur le serveur SSH vers lequel tu envoie (ou sur lequel tu récupère) tes fichiers.

J'ai eu moi même ce type de problème, car le nombre maximum de session était atteint. Le message était le même et je n'avait pas de trace dans les logs de ma machine SSH/SFTP car ce n'était pas un fonctionnement anormal que de refuser la connexion dans ce cas.

Je ne suis pas certain que ton pb vienne de là, mais c'est toujours une piste

NDT : Je pense a voir trouvé une autre façon de protéger une route.
Je ne protège pas la route à proprement parler, mais la méthode vers laquelle elle pointe à l'aide de [ Requires = "myResource:Use" ] :

/// Sample API
Class Test.Api Extends %CSP.REST
{

 XData UrlMap [ XMLNamespace = "http://www.intersystems.com/urlmap" ]
 {
	<Routes>
		<Route Url="/test" Method="GET" Call="Test" />
	</Routes>
 }

 ClassMethod Test() As %Status [ Requires = "myResource:Use" ]
 {
  Do ##class(%REST.Impl).%WriteResponse("api method test : OK")
  Return $$$OK
 }
}

Merci pour ces liens, mais en fait je me dbrouille avec python, c'était bien sur l'intégration de Python dans Iris que je m'interrogeais (j'ai cru comprendre que l'on peut utiliser python en embarqué ou indépendamment d'Iris.

J'attendrai l'article dont tu me parles ;-) et verrai cela avec @Sylvain Guilbaud bientôt

Bonnes fêtes et merci pour tes réponses

Bonjour,

Comme tu peux le voir en utilisant les outils de développement de ton navigateur, la feuille CSS utilisée pour les styles est générée par une page ZEN :

Le problème est que tu peux modifier cette classe mais que tes modifications seront potentiellement perdues à chaque mise à jour de'Iris. De plus ce n'est pas terrible de procéder de cette manière (modifier la fourniture d'Iris).

Tout d'abord avec les outils de dev du navigateur vérifiions ce qu'il faut cibler :

C'est donc la classe portalTitle qui permet la modification du background. Regardons maintenant les css statiques chargées :

la feuille ZEN_Component__core_3.css me parait une bonne candidate pour la modification, tu peux l'éditer et ajouter tes styles à la fin de celle-ci :

et on obtient l'effet désiré :

Ce n'est toujours pas terrible, mais cela répond je pense à ta demande.

Bonjour Guillaume,

Merci pour cette réponse rapide, j'utilise actuellement Iris en objectscript uniquement, donc je ne suis pas trop à l'aise avec l'intégration de python.

Je dois avoir prochainement une présentation/formation à l'intégration de python (langage que je pratique un peu par ailleurs) par @Sylvain Guilbaud 

Afin de rendre cette session plus productive j'aimerai bien me dégrossir un peu sur le sujet, quelles ressources pourrais-tu me conseiller ?

Mince alors, c'est exact, tu as raison.

Il me semblait avoir vérifié le résultat, mais je pense que j'ai été trop enthousiaste, et comme il s'agissait juste d'un essai, je n'ai pas enchainé sur un développement.

Comme je le dis dans ma conclusion il faut se garder d'utiliser tel que ce que propose ChatGpt, mon propos, même si j'ai donné un magnifique contre-exemple était que bien utilisé, cet outil peut accélerer le démarrage d'un projet.

Dans tous les cas quelque soit la provenance (chatGpt, Forum, Tuto,...) utiliser un code sans le comprendre n'est jamais une bonne solution, l'effort gagné sur le coup se paiera plus tard par des difficultés de maintenance au mieux ou des dysfonctionnements.

Merci @Sylvain Guilbaud pour ces précisions,

j'avoue ne pas avoir saisi la subtilité entre $SEQUENCE et $INCREMENT quand la valeur d'incrément est 1.

Pour la classe, j'avais plus ou moins pensé à faire cela, mais je trouve plus pratique d'avoir une clé unique indépendante de l'ID dans une seule propriété.

J'ai finalement fait une petite classe pour gérer ce besoin dans différentes fonctionnalités (numérotation automatique des centre, génération de login, ...), la voici :

Class Bna.Utils.Sequence Extends %RegisteredObject
{

Property Name As %String;

Method %OnNew(name) As %Status
{
        Set ..Name = name
        Return $$$OK
}

ClassMethod ShowAll()
{
        zw ^Sequence
}

ClassMethod ResetAll()
{
        Kill ^Sequence
}

Method Get(seqKey As %String = "") As %Integer
{
        if seqKey="" {
            Return $INCREMENT(^Sequence(..Name))
        } else {
            Return $INCREMENT(^Sequence(..Name, seqKey))
        }
}

Method Reset(seqKey As %String = "")
{
        if seqKey="" {
            Kill ^Sequence(..Name)
        } else {
            Kill ^Sequence(..Name, seqKey)
        }
}

Method Show(seqKey As %String = "")
{
        if seqKey="" {
            zw ^Sequence(..Name)
        } else {
            zw ^Sequence(..Name, seqKey)
        }
}

}