USER_RESP_DEFAULTMODULENAME non pris en compte dans les appels front api

Tags: #<Tag:0x00007f2f341b60b0>

Bonjour,
j’ai un objet BCSIPerson héritier de User.
Dans ma configuration, j’ai défini un module par défaut pour la création d’un user via le système param : USER_RESP_DEFAULTMODULENAME

Lorsque je suis connectée et que je vais sur les différents écrans de création, le module est bien setté.

Maintenant j’ai un page publique dont une partie du code JS créé une personne :

			var person = appSimplicite.getBusinessObject("BCSIPerson", "public_BCSIPerson");
			person.resetFilters();
			person.resetValues(true); 
			person.getForCreate(function() {
				console.log("get for create");
				console.log(person.item);
			});

Mon utilisateur technique a bien les droits en création sur BCSIPerson ET User.
Lorsque je récupère ma person suite au get, toutes les valeurs par défaut sont bien settées (lang, active) mais pas le module.

Savez-vous pourquoi ? Est-ce parce que le paramètre est un paramètre système ?

Cordialement
Amandine TRIDOU

[Platform]
Status=OK
Version=4.0.P24
BuiltOn=2020-09-08 13:58 (revision cc3e1c0a38d7b0549d655541696b9efd34201031)
Encoding=UTF-8
EndpointIP=21.0.9.2
EndpointURL=http://e55490efd12d:8080
TimeZone=Europe/Paris
SystemDate=2020-09-10 14:48:34

Votre objet BCSIPerson doit implémenter le hook postValidate sans appeler celui de User (qui valorise le module à partir de ce param système).

Quand vous héritez d’un objet vous devez explicitement appeler les méthodes de l’objet parent quand vous les implémentez en surcharge sinon elles ne seront pas appelées, rien de specifique à Simplicité.

Cf. ce doc pour plus de détails et la syntaxe à utiliser dans le cas du Rhino: https://docs.simplicite.io/documentation/01-core/businessobject-code-hooks.md#inheritance

Merci pour votre retour mais nous ne surchargeons que les méthodes initCreate, initUpdate et preSave. Ces 3 méthodes appellent bien la méthode parent.
Comme dit dans mon post, nous avons 2 cas :
1 - création d’une personne via les IHM avec un compte habilité --> le module est bien indiqué
2- création d’une personne via un appel API depuis une page puiblique --> le module n’est pas renseigné
Dans les deux cas, on appelle bien le initCreate mais dans le 2 cas, le champs row_mdl_id est vide, d’où mon hypothèse : mon user public qui a le droit de créer un user n’a pas le droit de lire un paramètre système et donc ce champs n’est pas valué. Serait ce une hypothèse correcte et si oui, comment contourner le problème ?

Actuellement nous le faisons dans le initCreate si la valeur est vide, alors nous appelons le paramètre système en forçant l’usage au

Grant.getSystemAdmin().getParameter("USER_RESP_DEFAULTMODULENAME", "")

Oui ça doit être ça.

Le param système est effectivement de type “private” donc non visible au user public et c’est bien le grant public qui fait le getParameter donc qui ne récupère rien.

On va changer la méthode pour que si le getParameter sur le grant courant (public ou autre) ne ramène rien on récupère la valeur pour le grant system admin

EDIT: non en fait c’est bien le grant system admin qui récupère la valeur du param dans le code de User

Merci pour votre retour. C’est bizarre le module devrait donc est mis.
Nous avons contourné le problème en faisant :

/**
 * Business object BCSIPerson
 */
public class BCSIPerson extends com.simplicite.objects.System.User {

	private static final long serialVersionUID = 1L;

	private static String IPN_SUSPENDED = "IPN suspended";
	private static String IPN_UNKNOWN = "IPN unknown or non compliant";

	@Override
	public void initCreate() {
		super.initCreate();
		if (StringUtils.isBlank(this.getFieldValue("row_module_id"))) {
			this.setFieldValue("row_module_id.mdl_name", Grant.getSystemAdmin().getParameter("USER_RESP_DEFAULTMODULENAME"));
			this.setFieldValue("row_module_id", ModuleDB.getModuleId(Grant.getSystemAdmin().getParameter("USER_RESP_DEFAULTMODULENAME", "")));
		}
	}
}

Coté front, nous avons le code suivant :

		var login = "public_rcm_" + ((params["LANG"] == "EN" ) ? "en" : "fr");
		var appSimplicite = new Simplicite.Ajax(ROOT, "api", login , "simplicite");
		var person = appSimplicite.getBusinessObject("BCSIPerson", "public_BCSIPerson");
		person.resetFilters();
 		person.resetValues(true); 
		person.search(function() {
		 	if (person.list.length === 0) {
				person.resetFilters();
				person.resetValues(true); 
				person.getForCreate(function() { // Sans notre surcharge du hook, le champ module est vide
						person.item.usr_login = user.profile.uid;
						person.item.usr_active = '0';
						person.create(function(result) {
						 	userId = result.row_id;
						 	if (callback) {
						 		callback();
						 	}
						});
				});
			} else {
				userId = person.list[0].row_id;
				if (callback) {
					callback();
				}
			}
		}, { usr_login : user.profile.uid });

Cordialement