2024-04-29 00:17:15 +02:00
|
|
|
# frozen_string_literal: true
|
|
|
|
|
2023-04-24 18:48:05 +02:00
|
|
|
namespace :after_party do
|
|
|
|
desc 'Deployment task: fix_include_in_logic'
|
|
|
|
task fix_include_in_logic: :environment do
|
|
|
|
include Logic
|
|
|
|
puts "Running deploy task 'fix_include_in_logic'"
|
|
|
|
|
|
|
|
tdcs_with_condition = TypeDeChamp.where.not(condition: nil)
|
|
|
|
|
|
|
|
progress = ProgressReport.new(tdcs_with_condition.count)
|
|
|
|
|
|
|
|
tdcs_with_condition.find_each do |tdc|
|
|
|
|
begin
|
|
|
|
tdc.revisions.each do |revision|
|
|
|
|
tdcs = revision.types_de_champ.where(stable_id: tdc.condition.sources)
|
|
|
|
|
|
|
|
transformed_condition = transform_eq_to_include(tdc.condition, tdcs)
|
|
|
|
|
|
|
|
if (transformed_condition != tdc.condition)
|
|
|
|
rake_puts "found #{tdc.id}, original: #{tdc.condition.to_s(tdcs)}, correction: #{transformed_condition.to_s(tdcs)}!"
|
|
|
|
new_tdc = revision.find_and_ensure_exclusive_use(tdc.stable_id)
|
|
|
|
new_tdc.update_columns(condition: transformed_condition)
|
|
|
|
Champ.joins(:dossier).where(dossier: { revision: revision }, type_de_champ: tdc).update(type_de_champ: new_tdc)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
rescue StandardError => e
|
|
|
|
rake_puts "problem with tdc #{tdc.id},\ncondition: #{tdc.read_attribute_before_type_cast('condition')},\nmessage: #{e.message}"
|
|
|
|
ensure
|
|
|
|
progress.inc
|
|
|
|
end
|
|
|
|
end
|
|
|
|
progress.finish
|
|
|
|
|
|
|
|
# Update task as completed. If you remove the line below, the task will
|
|
|
|
# run with every deploy (or every time you call after_party:run).
|
|
|
|
AfterParty::TaskRecord
|
|
|
|
.create version: AfterParty::TaskRecorder.new(__FILE__).timestamp
|
|
|
|
end
|
|
|
|
|
|
|
|
def transform_eq_to_include(condition, tdcs)
|
|
|
|
case condition
|
|
|
|
when Logic::NAryOperator
|
|
|
|
condition.class.new(condition.operands.map { transform_eq_to_include(_1, tdcs) })
|
|
|
|
when Eq
|
|
|
|
target = tdcs.find { _1.stable_id == condition.left.stable_id }
|
|
|
|
if target.type_champ == 'multiple_drop_down_list'
|
|
|
|
ds_include(condition.left, condition.right)
|
|
|
|
else
|
|
|
|
condition
|
|
|
|
end
|
|
|
|
else
|
|
|
|
condition
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|