Je travaille sur l’implémentation d’un système de filtrage pour un objet que j’appelle ObjetAProteger. Voici ma structure :
ObjetAProteger : L’objet principal que je souhaite protéger/filtrer.
Filtre : Un objet qui référence ObjetAProteger
LiaisonUtilisateurFiltre : Une table de jointure pour établir une relation N-N entre les utilisateurs et les filtres.
Mon objectif est d’implémenter un setSearchSpec dans la méthode postLoad pour :
Vérifier si un filtre a été créé pour l’ObjetAProteger.
Si un filtre existe, vérifier que l’utilisateur actuel est bien lié à ce filtre.
Si les deux conditions sont remplies, l’objet s’affiche.
J’ai juste vu le paragraphe Filtering dans la docs mais je ne comprends pas comment l’appliquer à mon cas. Avez-vous une doc plus détaillés à ce sujet ?
La search spec correspond à la clause where qui va s’appliquer au select de ObjetAProteger. Dans votre cas, vous voulez 1=1 l’utilisateur voit ObjetAProteger ou 1=0, il ne le voit pas.
1=1 peut se calculer en faisant un count(*) dans la table de jointure LiaisonUtilisateurFiltre.
c’est justement la rédaction de cette condition que je ne sais pas faire.
Dans l’exemple de la documentation il y a
setSearchSpec(getSearchSpec() + " and exists(select 1 FROM table1 where t_userAssignedId.row_id=" + getGrant().getUserId());
je ne comprends pas la syntaxe de t_userAssignedId.row_id
je comptais le modifier comme suit :
setSearchSpec(getSearchSpec() +" and exists(select 1 FROM liaison_utilisateur_filtre where obj_id="+getRowId()+" and user_id=" + getGrant().getUserId());
mais le getRowId() ne renvoi rien dans le postLoad. (obj_id et user_id) serait des colonnes de la table liaison
Dans l’exemple il est écrit que l’alias de la table principal est t et que les alias des objet liés est t_. Le getRowId() est t.row_id
Dans votre cas on peut aussi écrire que s’il existe une filtre
setDefaultSearchSpec(getDefaultSearchSpec() + " and t.row_id in (select obj_id from liaison_utilisateur_filtre where user_id=" + getGrant().getUserId()+")");
Pour un filtre statique utilisez setDefaultSearchSpec().
Oui le setSearchSpec s’applique à la Default Searchspec. Si vous ajoutez une searchspec à ce même objet en fonction d’une règle métier par exemple vous voulez sûrement que les filtres utilisateurs soient conservés. la default searchspec est le Filtre que vous appliquez par paramétrage.
Désolé mais je ne comprends toujours pas, le fait de mettre getGrant().getUserId() ne rends justement pas le filtre dynamique ? je peux écrire du code java dans la case Filtre ?
Le fait de mettre le userid rend le filtre dynamique (fonction de l’utilisateur qui accède à la donnée).
La case Filtre contient une syntaxe SQL uniquement. Vous avez un exemple dans le tutoriel, un filtre est positionné sur un objet hérité de TrnProduct. 3.3. Creating an inherited object | Simplicité Documentation