Probléme avec le Hook du BO SocialPost

Bonjour,
J’ai un besoin ou je dois changer le fonctionnement du Business object SocialPost, car je veux l’afficher d’une maniére plus ergonomique dans une liste pour facilter à un gestionnaire de remonter rapidement tous les post sur une “Factures”, pour cela j’ai pensé à modifier le hook postLoad du BO “SocialPost” mais cela semble ne pas fonctionner, j’ai ajouter mon utilisateur au group SOCIAL_USER et j’ai donné les droits CRUD au business object “SocialPost”, voici le code :

package com.simplicite.objects.Social;

import java.util.*;
import com.simplicite.util.*;
import com.simplicite.util.tools.*;
import com.simplicite.bpm.Alert;
/**
 * Business object SocialPost
 */
public class SocialPost extends ObjectDB {
	private static final long serialVersionUID = 1L;



@Override
public void postLoad() {
		
		AppLog.info("postLoad Hook entred", getGrant());
		super.postLoad();
				AppLog.info("SuperpostLoad  exectued", getGrant());

	
		// Hide not the filds not needed for CP/DP or Admin_assist
		if (getGrant().hasResponsibility("CP_DP") || getGrant().hasResponsibility("ADMIN_ASSIST")) {
	
		ObjectField f = getField("usr_first_name");
		f.setVisibility(ObjectField.VIS_NOT);
	
		f = getField("usr_last_name");
		f.setVisibility(ObjectField.VIS_NOT);
	
		f = getField("usr_image_id");
		f.setVisibility(ObjectField.VIS_NOT);

		f = getField("usr_image_id");
		f.setVisibility(ObjectField.VIS_NOT);
	
		f = getField("pstFollowersOnly");
		f.setVisibility(ObjectField.VIS_NOT);
		
		f = getField("pstStatus");
		f.setVisibility(ObjectField.VIS_NOT);
		
		f = getField("pstLevel");
		f.setVisibility(ObjectField.VIS_NOT);
		}
		
		
		if (getGrant().hasResponsibility("CP_DP")) {
				AppLog.info("CPDP postLoad  exectued", getGrant());
			setSearchSpec("t.usr_login = " + getGrant().getLogin()); 
		}
		
	
}

	//disallow create for Users
	@Override
	public boolean isCreateEnable() {
	
		if (getGrant().hasResponsibility("CP_DP") || getGrant().hasResponsibility("ADMIN_ASSIST")) 
	        return false;
	    
	    return true;
	}
	

Je vous remercie d’avance,

Il n’est pas possible/souhaitable de surcharger la classe Java d’un objet standard de la plateforme => vous devez paramétrer un objet qui en hérite et là vous pourrez écrire du code specifique pour en changer le comportement si cela a du sens.

Mais je comprend que votre besoin concerne plutôt l’UX donc ce n’est pas coté Java qu’il faut customiser mais coté JS de la UI pour utiliser différemment l’objet SocialPost

Cela dit, ce sujet relève plus de l’étude d’une feature request plateforme que d’un “bricolage”. Ce n’est de toute façon jamais une bonne idée de “bricoler” sur les objets standards de la plateforme car ceux-ci évoluent et ce que vous faites aujourd’hui ne fonctionnera peut être plus demain et/ou en en changeant le comportement vous risquez de “casser” des choses ailleurs (l’objet Social post sert à plein de choses, c’est donc un objet “fragile”)

Je mets @Francois dans la boucle

PS: visiblement le sujet est déjà traité dans ce post: Ajouter la fonction de commentaire "Social Post" à ma liste

PS: d’ailleurs @Francois, je propose d’empêcher la création d’une classe Java (ou script Rhino) custom sur les objets de configuration (à part SimpleUser) et sur quelques objets particulier comme SocialPost

L’objet SocialPost est effectivement un objet pas comme les autres, un peu comme le User. Ils sont surchargeables en faisant attention de ne pas écraser le comportement initial (comme appeler les méthodes super sur les hooks surchargés).

Si l’objectif est de donner accès aux POST en liste depuis le menu, il faut effectivement en hériter et y faire des choses pérennes, par exemple :

  • Lister les POST avec un filtre sur le contenu ou l’objet métier avec un search-sepc du genre t.pst_object like 'BOInvoice:%' pour lister tous les msg qui pointent sur des factures
  • Masquer les champs non nécessaires comme n’importe quel autre objet (via hook ou contraintes)
  • L’habiliter en Read+Delete uniquement (on ne crée pas par là, et on ne modifie pas le post de qqun d’autre à priori…)

Il faut aussi savoir que “designer” peut poster automatiquement des messages techniques s’il trouve des erreurs de config ou de runtime sur un BO. Donc il faudra surement également filtrer ce genre de message, en filtrant les messages émis par le designer dans la search-spec.

Oui, l’idée est de pouvoir en hériter en Java uniquement.

Les implémentations Java sont impossibles de toute façon sur des objets déjà livrés en Java (les objets systèmes), le classloader ne peut pas charger 2 classes de même nom dans un même package. Par contre faire du Rhino est possible mais conduira forcement à des comportements inattendus (pas de hook prioritaire entre java ou rhino …).

Bref de mon point du vue :

  • il faut uniquement permettre la surcharge par héritage en Java, plus jamais de Rhino
  • dans les versions à venir interdire complètement de créer de nouveaux scripts Rhino pour un objet métier via la UI (la plateforme laissera les anciens objets fonctionner, et poura télécharger un fichier script rhino pour les boomers)

Bonjour à tous,
Merci pour vos retours et les details,
J’ai opté finalement pour un heritage de l’objet SocialPost, par contre j’essaye d’envoyer un mail dans le postCreate de mon objet herité, cela semble ne pas s’exécute (pas de logs). Voici le code de mon objet qui hérite de SocialPost :

package com.simplicite.objects.Factur_projetDD;

import java.util.*;
import com.simplicite.util.*;
import com.simplicite.util.tools.*;
import com.simplicite.util.ObjectField;
import com.simplicite.bpm.Alert;
/**
 * Business object SocialPostInvoice
 */
public class SocialPostInvoice extends com.simplicite.objects.Social.SocialPost {
	private static final long serialVersionUID = 1L;
	
	
	@Override
public void postLoad() {
		
		super.postLoad();
			

	
		// Hide not the filds not needed for CP/DP or Admin_assist
		if (getGrant().hasResponsibility("CP_DP") || getGrant().hasResponsibility("ADMIN_ASSIST")){
	
		ObjectField f = getField("usr_first_name");
		f.setVisibility(ObjectField.VIS_NOT);
	
		f = getField("usr_last_name");
		f.setVisibility(ObjectField.VIS_NOT);
	
		f = getField("usr_image_id");
		f.setVisibility(ObjectField.VIS_NOT);

		f = getField("usr_email");
		f.setVisibility(ObjectField.VIS_NOT);
	
		f = getField("pstFollowersOnly");
		f.setVisibility(ObjectField.VIS_NOT);
		
		f = getField("pstStatus");
		f.setVisibility(ObjectField.VIS_NOT);
		
		f = getField("pstLevel");
		f.setVisibility(ObjectField.VIS_NOT);
		}
		
		
		setSearchSpec("t.pst_object like 'Facture:%'"); 
	
}


@Override
public String postCreate() {
	
	
	AppLog.info("postCreate Hook executed", getGrant());
	
	Alert a;
		
		//get the CP/DP concerned by the inovoice
		String email ="";
		String facture = this.getField("pstObject").getValue();
		String factureRowId = facture.split(":")[1];

	
		email = getGrant().simpleQuery("select usr_email from m_user u, facture f, projet p where u.row_id=p.projet_chefprojet_id and p.row_id=f.facture_projet_id and f.row_id = "+ factureRowId);
	    

	   
		//Send Alert
	    a = getAlert("CpDpMessage", Alert.TYPE_INFO);
	    if (a!=null) {
	   
	    
     	String content ="";//Content to replace in the alert
    	
		String lang = getGrant().getLang();
		String body = a.getContent(lang);
	
	//	body = body.replace("[invoicesOnPend]", content );
		a.setContent(lang, body);
	    
	    if (Tool.isEmpty(email)) 
		return ("ERROR_EMPTY_EMAIL");

		a.addRecipient(email, Alert.RECIP_TO);

		//send the alert
		a.send(this);
		}	 
			  
  
	return super.postCreate();
		
}



}

Le création d’un post via le popup standard se fait dans l’objet SocialPost et non dans votre héritier donc votre code ne sera pas appelé.

Utiliser la fonction sociale pour des traitements métier de notification vers un CdP ne semble pas une bonne approche. Le mécanisme prévu est de mentionner/taguer des personnes pour leur envoyer une notif (SocialPostMention).

Pour s’en sortir, il faudrait prévoir une action asynchrone périodique sur votre objet hérité (via la cron toutes les heures par exemple) pour envoyer votre email sur les posts “récents” des factures :

  • il faut un parametre système qui dit quand le dernier envoi en masse a eu lieu
  • la méthode de l’action récupère tous les posts de facture depuis cette date + envoi le mail au CDP
  • et repositionne la date de dernier passage dans les param système

Si vous êtes en V5, vous pouvez créer un champ de type notepad (en rendering/affichage d’activités), il peut contenir des check-lists + des commentaires, et ce serait plus simple pour répondre à votre besoin qui pourrait rester dans un hook de la Facture : postSave avec lecture du notepad en json. Le contenu d’un post est en markdown, donc il faudra le convertir en HTML pour le mettre dans un email.

Bonjour,
Oui nous sommes en V5,
hmmm, est ce un comportement spécifique à SocialPost ? car sur un autre BO “ChefProjet” qui hérite de “SimpleUser” j’ai réussi à implémenter un “postCreate” qui ajoute une responasbilité automatique à ChefProjet crée par formulaire ou même un import csv …

Sinon puis-je avoir plus de détails svp sur le notepad dans le postSave ? peux on le personaliser pour afficher que les commentaires ?

Sinon je pense la première proposition répond à mon besoin, je vais essayer de l’implémenter

Ok, ça fonctionnera aussi.

Pour préciser : vous utilisez votre objet hérité quand vous créez un utilisateur CDP.
Les hooks appelés sont ceux de l’objet qui travaille + ceux hérités (si appel du super).
Si vous créez un utilisateur en passant par le User standard de simplicité, le code de ChefProjet ne sera pas appelé. C’est la même chose avec SocialPost, le popup social utilise l’objet SocialPost, pas votre héritier.

Sinon créez un champ notepad dans votre objet pour tester, saisissez des commentaires et vous verrez le contenu au postSave en JSON. Pour masquer la checklist, il faut juste mettre un peu de CSS dans la ressource STYLES de l’objet :

.objform.object-BOFacture .notepad .checklists { display: none; }

Merci pour les détails, je comprends mieux pour les hooks, il n’est carrément pas appeler car la popup utilise SocialPost.

Pour notrepad je viens de le créer mais c’est juste un champ de texte, je comprends pas comment l’exploiter pour avoir l’affichage en liste (Chat)

Il faut changer le rendering.