add pdf to pjs export

This commit is contained in:
Christophe Robillard 2021-03-08 11:35:20 +01:00
parent e90957dd32
commit 60cc4d3697
6 changed files with 32 additions and 10 deletions

View file

@ -210,6 +210,7 @@ module Instructeurs
def telecharger_pjs def telecharger_pjs
return head(:forbidden) if !dossier.attachments_downloadable? return head(:forbidden) if !dossier.attachments_downloadable?
generate_pdf_for_instructeur_export
files = ActiveStorage::DownloadableFile.create_list_from_dossier(dossier) files = ActiveStorage::DownloadableFile.create_list_from_dossier(dossier)
zipline(files, "dossier-#{dossier.id}.zip") zipline(files, "dossier-#{dossier.id}.zip")
@ -232,6 +233,12 @@ module Instructeurs
@dossier ||= current_instructeur.dossiers.find(params[:dossier_id]) @dossier ||= current_instructeur.dossiers.find(params[:dossier_id])
end end
def generate_pdf_for_instructeur_export
@include_infos_administration = true
pdf = render_to_string(file: 'dossiers/show', formats: [:pdf])
dossier.pdf_export_for_instructeur.attach(io: StringIO.open(pdf), filename: "export-#{dossier.id}.pdf", content_type: 'application/pdf')
end
def commentaire_params def commentaire_params
params.require(:commentaire).permit(:body, :piece_jointe) params.require(:commentaire).permit(:body, :piece_jointe)
end end

View file

@ -13,12 +13,14 @@ class ActiveStorage::DownloadableFile
def self.create_list_from_dossier(dossier) def self.create_list_from_dossier(dossier)
pjs = PiecesJustificativesService.liste_pieces_justificatives(dossier) pjs = PiecesJustificativesService.liste_pieces_justificatives(dossier)
pjs.map do |piece_justificative| files = pjs.map do |piece_justificative|
[ [
piece_justificative, piece_justificative,
self.timestamped_filename(piece_justificative) self.timestamped_filename(piece_justificative)
] ]
end end
files << [dossier.pdf_export_for_instructeur, self.timestamped_filename(dossier.pdf_export_for_instructeur)]
files
end end
private private

View file

@ -63,6 +63,7 @@ class Dossier < ApplicationRecord
has_one :france_connect_information, through: :user has_one :france_connect_information, through: :user
has_one_attached :justificatif_motivation has_one_attached :justificatif_motivation
has_one_attached :pdf_export_for_instructeur
has_many :champs, -> { root.public_ordered }, inverse_of: :dossier, dependent: :destroy has_many :champs, -> { root.public_ordered }, inverse_of: :dossier, dependent: :destroy
has_many :champs_private, -> { root.private_ordered }, class_name: 'Champ', inverse_of: :dossier, dependent: :destroy has_many :champs_private, -> { root.private_ordered }, class_name: 'Champ', inverse_of: :dossier, dependent: :destroy

View file

@ -201,6 +201,15 @@ FactoryBot.define do
end end
end end
trait :with_pdf_export do
after(:create) do |dossier, _evaluator|
dossier.pdf_export_for_instructeur.attach(
io: StringIO.new('Hello World'),
filename: 'export.pdf'
)
end
end
trait :with_justificatif do trait :with_justificatif do
after(:create) do |dossier, _evaluator| after(:create) do |dossier, _evaluator|
dossier.justificatif_motivation.attach( dossier.justificatif_motivation.attach(

View file

@ -162,10 +162,11 @@ feature 'Instructing a dossier:' do
files = ZipTricks::FileReader.read_zip_structure(io: File.open(DownloadHelpers.download)) files = ZipTricks::FileReader.read_zip_structure(io: File.open(DownloadHelpers.download))
expect(DownloadHelpers.download).to include "dossier-#{dossier.id}.zip" expect(DownloadHelpers.download).to include "dossier-#{dossier.id}.zip"
expect(files.size).to be 2 expect(files.size).to be 3
expect(files[0].filename.include?('piece_justificative_0')).to be_truthy expect(files[0].filename.include?('piece_justificative_0')).to be_truthy
expect(files[0].uncompressed_size).to be File.size(path) expect(files[0].uncompressed_size).to be File.size(path)
expect(files[1].filename.include?('horodatage/operation')).to be_truthy expect(files[1].filename.include?('horodatage/operation')).to be_truthy
expect(files[2].filename.include?('dossier/export')).to be_truthy
end end
scenario 'A instructeur can download an archive containing several identical attachments' do scenario 'A instructeur can download an archive containing several identical attachments' do
@ -176,13 +177,14 @@ feature 'Instructing a dossier:' do
files = ZipTricks::FileReader.read_zip_structure(io: File.open(DownloadHelpers.download)) files = ZipTricks::FileReader.read_zip_structure(io: File.open(DownloadHelpers.download))
expect(DownloadHelpers.download).to include "dossier-#{dossier.id}.zip" expect(DownloadHelpers.download).to include "dossier-#{dossier.id}.zip"
expect(files.size).to be 3 expect(files.size).to be 4
expect(files[0].filename.include?('piece_justificative_0')).to be_truthy expect(files[0].filename.include?('piece_justificative_0')).to be_truthy
expect(files[1].filename.include?('piece_justificative_0')).to be_truthy expect(files[1].filename.include?('piece_justificative_0')).to be_truthy
expect(files[0].filename).not_to eq files[1].filename expect(files[0].filename).not_to eq files[1].filename
expect(files[0].uncompressed_size).to be File.size(path) expect(files[0].uncompressed_size).to be File.size(path)
expect(files[1].uncompressed_size).to be File.size(path) expect(files[1].uncompressed_size).to be File.size(path)
expect(files[2].filename.include?('horodatage/operation')).to be_truthy expect(files[2].filename.include?('horodatage/operation')).to be_truthy
expect(files[3].filename.include?('dossier/export')).to be_truthy
end end
before { DownloadHelpers.clear_downloads } before { DownloadHelpers.clear_downloads }

View file

@ -1,11 +1,12 @@
describe ActiveStorage::DownloadableFile do describe ActiveStorage::DownloadableFile do
let(:dossier) { create(:dossier, :en_construction) } let(:dossier) { create(:dossier, :en_construction, :with_pdf_export) }
subject(:list) { ActiveStorage::DownloadableFile.create_list_from_dossier(dossier) } subject(:list) { ActiveStorage::DownloadableFile.create_list_from_dossier(dossier) }
describe 'create_list_from_dossier' do describe 'create_list_from_dossier' do
context 'when no piece_justificative is present' do context 'when no piece_justificative is present' do
it { expect(list).to match([]) } it { expect(list.length).to eq 1 }
it { expect(list.first[0].record_type).to eq "Dossier" }
end end
context 'when there is a piece_justificative' do context 'when there is a piece_justificative' do
@ -13,7 +14,7 @@ describe ActiveStorage::DownloadableFile do
dossier.champs << create(:champ_piece_justificative, :with_piece_justificative_file, dossier: dossier) dossier.champs << create(:champ_piece_justificative, :with_piece_justificative_file, dossier: dossier)
end end
it { expect(list.length).to eq 1 } it { expect(list.length).to eq 2 }
end end
context 'when there is a private piece_justificative' do context 'when there is a private piece_justificative' do
@ -21,7 +22,7 @@ describe ActiveStorage::DownloadableFile do
dossier.champs_private << create(:champ_piece_justificative, :with_piece_justificative_file, private: true, dossier: dossier) dossier.champs_private << create(:champ_piece_justificative, :with_piece_justificative_file, private: true, dossier: dossier)
end end
it { expect(list.length).to eq 1 } it { expect(list.length).to eq 2 }
end end
context 'when there is a repetition bloc' do context 'when there is a repetition bloc' do
@ -30,7 +31,7 @@ describe ActiveStorage::DownloadableFile do
end end
it 'should have 4 piece_justificatives' do it 'should have 4 piece_justificatives' do
expect(list.size).to eq 4 expect(list.size).to eq 5
end end
end end
@ -39,7 +40,7 @@ describe ActiveStorage::DownloadableFile do
dossier.commentaires << create(:commentaire, dossier: dossier) dossier.commentaires << create(:commentaire, dossier: dossier)
end end
it { expect(list.length).to eq 0 } it { expect(list.length).to eq 1 }
end end
context 'when there is a message with an attachment' do context 'when there is a message with an attachment' do
@ -47,7 +48,7 @@ describe ActiveStorage::DownloadableFile do
dossier.commentaires << create(:commentaire, :with_file, dossier: dossier) dossier.commentaires << create(:commentaire, :with_file, dossier: dossier)
end end
it { expect(list.length).to eq 1 } it { expect(list.length).to eq 2 }
end end
end end
end end