Add export_item type
This commit is contained in:
parent
24109a0128
commit
977cfc87ce
5 changed files with 190 additions and 0 deletions
70
app/models/export_item.rb
Normal file
70
app/models/export_item.rb
Normal file
|
@ -0,0 +1,70 @@
|
||||||
|
class ExportItem
|
||||||
|
include TagsSubstitutionConcern
|
||||||
|
DOSSIER_STATE = Dossier.states.fetch(:en_construction)
|
||||||
|
FORMAT_DATE = "%Y-%m-%d".freeze
|
||||||
|
|
||||||
|
attr_reader :template, :enabled, :stable_id
|
||||||
|
|
||||||
|
def initialize(template:, enabled: true, stable_id: nil)
|
||||||
|
@template, @enabled, @stable_id = template, enabled, stable_id
|
||||||
|
end
|
||||||
|
|
||||||
|
def self.default(prefix:, enabled: true, stable_id: nil)
|
||||||
|
new(template: prefix_dossier_id(prefix), enabled:, stable_id:)
|
||||||
|
end
|
||||||
|
|
||||||
|
def self.default_pj(tdc)
|
||||||
|
default(prefix: tdc.libelle_as_filename, enabled: false, stable_id: tdc.stable_id)
|
||||||
|
end
|
||||||
|
|
||||||
|
def enabled? = enabled
|
||||||
|
|
||||||
|
def template_json = template.to_json
|
||||||
|
|
||||||
|
def template_string = TiptapService.new.to_path(template)
|
||||||
|
|
||||||
|
def path(dossier, attachment: nil, row_index: nil, index: nil)
|
||||||
|
used_tags = TiptapService.used_tags_and_libelle_for(template)
|
||||||
|
substitutions = tags_substitutions(used_tags, dossier, escape: false, memoize: true)
|
||||||
|
substitutions['original-filename'] = attachment.filename.base if attachment
|
||||||
|
|
||||||
|
TiptapService.new.to_path(template, substitutions) + suffix(attachment, row_index, index)
|
||||||
|
end
|
||||||
|
|
||||||
|
def ==(other)
|
||||||
|
self.class == other.class &&
|
||||||
|
template == other.template &&
|
||||||
|
enabled == other.enabled &&
|
||||||
|
stable_id == other.stable_id
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def self.prefix_dossier_id(prefix)
|
||||||
|
{
|
||||||
|
type: "doc",
|
||||||
|
content: [
|
||||||
|
{
|
||||||
|
type: "paragraph",
|
||||||
|
content: [
|
||||||
|
{ text: "#{prefix}-", type: "text" },
|
||||||
|
{ type: "mention", attrs: DOSSIER_ID_TAG.slice(:id, :label) }
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
def suffix(attachment, row_index, index)
|
||||||
|
suffix = ""
|
||||||
|
suffix += "-#{add_one_and_pad(row_index)}" if row_index.present?
|
||||||
|
suffix += "-#{add_one_and_pad(index)}" if index.present?
|
||||||
|
suffix += attachment.filename.extension_with_delimiter if attachment
|
||||||
|
|
||||||
|
suffix
|
||||||
|
end
|
||||||
|
|
||||||
|
def add_one_and_pad(number)
|
||||||
|
(number + 1).to_s.rjust(2, '0') if number.present?
|
||||||
|
end
|
||||||
|
end
|
40
app/types/export_item_type.rb
Normal file
40
app/types/export_item_type.rb
Normal file
|
@ -0,0 +1,40 @@
|
||||||
|
class ExportItemType < ActiveRecord::Type::Value
|
||||||
|
# form_input, or setter -> type
|
||||||
|
def cast(value)
|
||||||
|
value = value.deep_symbolize_keys if value.respond_to?(:deep_symbolize_keys)
|
||||||
|
|
||||||
|
case value
|
||||||
|
in ExportItem
|
||||||
|
value
|
||||||
|
in NilClass # default value
|
||||||
|
nil
|
||||||
|
# from db
|
||||||
|
in { template: Hash, enabled: TrueClass | FalseClass } => h
|
||||||
|
|
||||||
|
ExportItem.new(**h.slice(:template, :enabled, :stable_id))
|
||||||
|
# from form
|
||||||
|
in { template: String } => h
|
||||||
|
|
||||||
|
template = JSON.parse(h[:template]).deep_symbolize_keys
|
||||||
|
enabled = h[:enabled] == 'true'
|
||||||
|
stable_id = h[:stable_id]&.to_i
|
||||||
|
ExportItem.new(template:, enabled:, stable_id:)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# db -> ruby
|
||||||
|
def deserialize(value) = cast(value&.then { JSON.parse(_1) })
|
||||||
|
|
||||||
|
# ruby -> db
|
||||||
|
def serialize(value)
|
||||||
|
if value.is_a?(ExportItem)
|
||||||
|
JSON.generate({
|
||||||
|
template: value.template,
|
||||||
|
enabled: value.enabled,
|
||||||
|
stable_id: value.stable_id
|
||||||
|
}.compact)
|
||||||
|
else
|
||||||
|
raise ArgumentError, "Invalid value for ExportItem serialization: #{value}"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
5
config/initializers/types.rb
Normal file
5
config/initializers/types.rb
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
require Rails.root.join("app/types/export_item_type")
|
||||||
|
|
||||||
|
ActiveSupport.on_load(:active_record) do
|
||||||
|
ActiveRecord::Type.register(:export_item, ExportItemType)
|
||||||
|
end
|
20
spec/models/export_item_spec.rb
Normal file
20
spec/models/export_item_spec.rb
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
describe ExportItem do
|
||||||
|
describe 'path' do
|
||||||
|
let(:export_item) { ExportItem.default(prefix: 'custom') }
|
||||||
|
let(:dossier) { create(:dossier) }
|
||||||
|
let(:attachment) do
|
||||||
|
ActiveStorage::Attachment.new(
|
||||||
|
name: 'filename',
|
||||||
|
blob: ActiveStorage::Blob.new(filename: "file.pdf")
|
||||||
|
)
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'without index nor row_index' do
|
||||||
|
it do
|
||||||
|
expect(export_item.path(dossier, attachment:)).to eq("custom-#{dossier.id}.pdf")
|
||||||
|
expect(export_item.path(dossier, attachment:, index: 3)).to eq("custom-#{dossier.id}-04.pdf")
|
||||||
|
expect(export_item.path(dossier, attachment:, row_index: 2, index: 3)).to eq("custom-#{dossier.id}-03-04.pdf")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
55
spec/types/export_item_type_spec.rb
Normal file
55
spec/types/export_item_type_spec.rb
Normal file
|
@ -0,0 +1,55 @@
|
||||||
|
describe ExportItemType do
|
||||||
|
let(:type) { ExportItemType.new }
|
||||||
|
|
||||||
|
describe 'cast' do
|
||||||
|
it 'from ExportItem' do
|
||||||
|
export_item = ExportItem.new(template: { foo: 'bar' }, enabled: true, stable_id: 42)
|
||||||
|
expect(type.cast(export_item)).to eq(export_item)
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'from nil' do
|
||||||
|
expect(type.cast(nil)).to eq(nil)
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'from db' do
|
||||||
|
h = { template: { foo: 'bar' }, enabled: true, stable_id: 42 }
|
||||||
|
expect(type.cast(h)).to eq(ExportItem.new(template: { foo: 'bar' }, enabled: true, stable_id: 42))
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'from form' do
|
||||||
|
h = { template: '{"foo":{"bar":"zob"}}' }
|
||||||
|
expect(type.cast(h)).to eq(ExportItem.new(template: { foo: { bar: 'zob' } }, enabled: false))
|
||||||
|
|
||||||
|
h = { template: '{"foo":{"bar":"zob"}}', enabled: 'true' }
|
||||||
|
expect(type.cast(h)).to eq(ExportItem.new(template: { foo: { bar: 'zob' } }, enabled: true))
|
||||||
|
|
||||||
|
h = { template: '{"foo":{"bar":"zob"}}', stable_id: '42' }
|
||||||
|
expect(type.cast(h)).to eq(ExportItem.new(template: { foo: { bar: 'zob' } }, enabled: false, stable_id: 42))
|
||||||
|
|
||||||
|
h = { template: '{"foo":{"bar":"zob"}}', enabled: 'true', stable_id: '42' }
|
||||||
|
expect(type.cast(h)).to eq(ExportItem.new(template: { foo: { bar: 'zob' } }, enabled: true, stable_id: 42))
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'from invalid value' do
|
||||||
|
expect { type.cast('invalid value') }.to raise_error(NoMatchingPatternError)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe 'deserialize' do
|
||||||
|
it 'from nil' do
|
||||||
|
expect(type.deserialize(nil)).to eq(nil)
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'from db' do
|
||||||
|
h = { template: { foo: 'bar' }, enabled: true, stable_id: 42 }
|
||||||
|
expect(type.deserialize(JSON.generate(h))).to eq(ExportItem.new(template: { foo: 'bar' }, enabled: true, stable_id: 42))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe 'serialize' do
|
||||||
|
it 'from ExportItem' do
|
||||||
|
export_item = ExportItem.new(template: { foo: 'bar' }, enabled: true, stable_id: 42)
|
||||||
|
expect(type.serialize(export_item)).to eq('{"template":{"foo":"bar"},"enabled":true,"stable_id":42}')
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
Loading…
Reference in a new issue