Je suis dans un cas où j’aimerais lancer un traitement avant l’export d’une liste afin de vérifier que l’utilisateur n’essaie pas d’exporter 30 000 lignes en Excel par exemple. En fonction du résultat de ce traitement j’aimerais autoriser l’export ou le refuser + envoyer un message expliquant à l’utilisateur de réduire le nombre de lignes à exporter.
Afin de faire cela je voulais utiliser le hook preExport() mais celui-ci retourne void et non String, je ne peux donc pas renvoyer de message à l’utilisateur.
Existe-t-il un autre hook ou un autre moyen pour retourner un message à l’utilisateur avant de lancer l’export d’une liste (et de bloquer / ne pas continuer l’export initialement demandé) ?
En V4 en maintenance cela va être sensible car changer la signature de la méthode preExport ne pourra pas être compatible ascendant (passer de public void à public String est inenvisageable sur ce hook).
On va donc devoir ajouter une nouvelle méthode qui sera appelée avant l’export proprement dit, car les hooks getExportFileName / preExport / postExport sont déjà dédiés à d’autres traitements.
Voilà une nouvelle méthode qui pourrait répondre au besoin :
public String isExportAllowed(String mode, String media) throws FileSizeException
mode = full | list = toutes les données ou celles en liste
media = ServletTool.MEDIA_* = CSV | PDF | XLSX…
sur l’instance d’objet qui demande l’export, ce qui permet
de faire un getCount()
et de retourner le cas échéant un message (de confirmation) ou une exception (message bloquant)
Prévoyez vous de passer en V5, ou faudra-t-il backporter cette évolution en V4 quand elle sera disponible ?
Une autre solution sans évolution (mais sans message UI) serait de limiter la taille des exports à la source via un setSearchLimit(max) dans le preExport. En V5 l’utilisateur peut exporter beaucoup de données car cela ne le bloque pas au niveau UI (l’export s’affiche dans une “toast” d’export en bas à droite de l’écran).
L’évolution sera livrée dans la prochaine révision V5 et backportée en V4 P25.
Exemple de code pour remonter un message bloquant ou une confirmation :
@Override
public String isExportAllowed(String mode, String media, String rowId) {
// List export by a non-admin user
if (rowId==null && !getGrant().hasResponsibility("ONE_ADMIN_GROUP")) {
long max = 5000;
long n = getCount();
if (n > max)
return Message.formatSimpleError("Too many records to export:" + n + " (limited to "+max+")");
if (n > max/5)
return Message.formatSimpleWarning("Are you sure to export "+n+" records?");
}
return null; // ok
}