From f7d9c0f786e40c85246e457b6162762617994ae5 Mon Sep 17 00:00:00 2001 From: Maxime Normandin Date: Sun, 21 Sep 2025 17:01:13 +0000 Subject: [PATCH 1/2] fix what_it_means_for_canadians save on admin --- app/avo/resources/promise.rb | 3 ++- app/models/promise.rb | 22 ++++++++++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/app/avo/resources/promise.rb b/app/avo/resources/promise.rb index cfccd40..b35ccd2 100644 --- a/app/avo/resources/promise.rb +++ b/app/avo/resources/promise.rb @@ -79,7 +79,8 @@ def fields field :text, as: :textarea # field :extracted_keywords_concepts, as: :textarea # field :intended_impact_and_objectives, as: :textarea - field :what_it_means_for_canadians, as: :textarea + field :what_it_means_for_canadians_for_avo, as: :textarea, + name: "What it means for Canadians" # field :linked_evidence_ids, as: :textarea # field :relevant_departments, as: :textarea # field :commitment_history_rationale, as: :code diff --git a/app/models/promise.rb b/app/models/promise.rb index 6d225c7..9b5f949 100644 --- a/app/models/promise.rb +++ b/app/models/promise.rb @@ -52,6 +52,28 @@ def update_progress!(inline: false) self.save! end + # Virtual attribute for Avo admin interface + def what_it_means_for_canadians_for_avo + what_it_means_for_canadians&.inspect || "[]" + end + + # Handle array format for Avo admin interface + def what_it_means_for_canadians_for_avo=(value) + if value.is_a?(String) + if value.strip.start_with?("[") && value.strip.end_with?("]") + begin + parsed = JSON.parse(value) + self.what_it_means_for_canadians = parsed if parsed.is_a?(Array) + rescue JSON::ParserError => e + Rails.logger.warn("Failed to parse array format: #{e.message}") + end + else + Rails.logger.warn("Expected array format but got: #{value}") + end + else + self.what_it_means_for_canadians = value + end + end def self.client_fields [ From 369bfc1d561f458211f22ca4141ffcb416eb1f26 Mon Sep 17 00:00:00 2001 From: Maxime Normandin Date: Mon, 22 Sep 2025 15:26:40 +0000 Subject: [PATCH 2/2] refactor parsing function, add validation on save --- app/models/promise.rb | 35 ++++++++++++++++++++++++++++------- 1 file changed, 28 insertions(+), 7 deletions(-) diff --git a/app/models/promise.rb b/app/models/promise.rb index 9b5f949..694465c 100644 --- a/app/models/promise.rb +++ b/app/models/promise.rb @@ -8,6 +8,8 @@ class Promise < ApplicationRecord has_one :lead_department_promise, -> { where(is_lead: true) }, class_name: "DepartmentPromise" has_one :lead_department, through: :lead_department_promise, source: :department + validate :validate_what_it_means_for_canadians_for_avo + def self.ransackable_attributes(auth_object = nil) [ "concise_title" ] end @@ -54,24 +56,43 @@ def update_progress!(inline: false) # Virtual attribute for Avo admin interface def what_it_means_for_canadians_for_avo - what_it_means_for_canadians&.inspect || "[]" + JSON.generate(what_it_means_for_canadians || []) end # Handle array format for Avo admin interface def what_it_means_for_canadians_for_avo=(value) + error_message = "Must be a valid array format" if value.is_a?(String) - if value.strip.start_with?("[") && value.strip.end_with?("]") + stripped = value.strip + if stripped.empty? + self.what_it_means_for_canadians = [] + @what_it_means_for_canadians_for_avo_error = nil + return + end + if stripped.start_with?("[") && stripped.end_with?("]") begin - parsed = JSON.parse(value) - self.what_it_means_for_canadians = parsed if parsed.is_a?(Array) - rescue JSON::ParserError => e - Rails.logger.warn("Failed to parse array format: #{e.message}") + parsed = JSON.parse(stripped) + if parsed.is_a?(Array) + self.what_it_means_for_canadians = parsed + @what_it_means_for_canadians_for_avo_error = nil + else + @what_it_means_for_canadians_for_avo_error = error_message + end + rescue JSON::ParserError + @what_it_means_for_canadians_for_avo_error = error_message end else - Rails.logger.warn("Expected array format but got: #{value}") + @what_it_means_for_canadians_for_avo_error = error_message end else self.what_it_means_for_canadians = value + @what_it_means_for_canadians_for_avo_error = nil + end + end + + private def validate_what_it_means_for_canadians_for_avo + if defined?(@what_it_means_for_canadians_for_avo_error) && @what_it_means_for_canadians_for_avo_error.present? + errors.add(:what_it_means_for_canadians_for_avo, @what_it_means_for_canadians_for_avo_error) end end