-
Notifications
You must be signed in to change notification settings - Fork 7
Rendu des pdf
###Le contexte
Le rendu des documents en pdf est une opération longue et nécessite d'être réalisée en backgound si l'on ne veut pas bloquer le server.
On utilise DelayedJob pour la gestion des tâches en background. Du fait que l'application est multitenant, on déclare Job::Delayed comme étant dans la table commune dans le initializer de Apartment.
Une table Exportpdfs permet de stocker les données binaires issues de la création du pdf.
Le plugin smartupdater pour le javascript permettant d'interroger le server et de savoir si le document est disponible.
Le traitement de ce sujet est rendu un peu plus complexe par la base qui est multitenant.
Une action produce_pdf est créé dans le controller pour les actions qui produisent des pdf. Par exemple BalanceController.
L'action crée un record dans la table ExportPdf. S'il en existe déjà un, l'action le supprime avant de le recréer. Puis lance le Job exportpdf en lui transmettant le nom de la base de données et l'id de l'exportpdf qui vient d'être créé.
Les classes de Custom Jobs sont dans le dossier Jobs et sont nommées par exemple BalancePdfFiller. Leur fonction est de rendre le pdf, puis le sauve dans le record exportpdf dont l'id lui a été transmis. Il fait ça en utilisant les fonctionnalités de apartment (gestion des schemas).
Du côté de la vue, l'action de cliquer sur l'icone pdf déclenche l'insertion (par javascript) d'un partiel avec le message Ficher en cours de fabrication..., un spinner et un bouton caché. Le même javascript lance alors l'action de polling.
La fonction de polling va interroger à intervalles préfixés le server pour vérifier le statut du fichier exportpdf. Lorsque ce fichier est devenu disponible, le poller arrête la minuterie et affiche le bouton Télécharger.
Ce bouton télécharger renvoie alors sur une action get du controller (deliver) avec un send_data du fichier.
Le modèle Exportpdf appartient aux différents modèles (par exemple Balance), lesquels have_one Exportpdf as:exportable. De cette manière, il est facile de faire le lien entre les objets et leurs transposition en pdf.