diff --git a/decidim-accountability/app/commands/decidim/accountability/admin/create_result.rb b/decidim-accountability/app/commands/decidim/accountability/admin/create_result.rb index 68a3fb1ac7954..5b379db8321c8 100644 --- a/decidim-accountability/app/commands/decidim/accountability/admin/create_result.rb +++ b/decidim-accountability/app/commands/decidim/accountability/admin/create_result.rb @@ -30,7 +30,9 @@ def call attr_reader :result def create_result - @result = Result.create!( + @result = Decidim.traceability.create!( + Result, + @form.current_user, feature: @form.current_feature, scope: @form.scope, category: @form.category, diff --git a/decidim-accountability/app/commands/decidim/accountability/admin/update_result.rb b/decidim-accountability/app/commands/decidim/accountability/admin/update_result.rb index 33b3344cf547a..2940534e33537 100644 --- a/decidim-accountability/app/commands/decidim/accountability/admin/update_result.rb +++ b/decidim-accountability/app/commands/decidim/accountability/admin/update_result.rb @@ -35,7 +35,9 @@ def call attr_reader :result, :form def update_result - result.update_attributes!( + Decidim.traceability.update!( + result, + form.current_user, scope: @form.scope, category: @form.category, parent_id: @form.parent_id, diff --git a/decidim-accountability/spec/commands/create_result_spec.rb b/decidim-accountability/spec/commands/create_result_spec.rb index c2260aeb80e65..200022ccb6f09 100644 --- a/decidim-accountability/spec/commands/create_result_spec.rb +++ b/decidim-accountability/spec/commands/create_result_spec.rb @@ -4,6 +4,7 @@ describe Decidim::Accountability::Admin::CreateResult do let(:organization) { create :organization, available_locales: [:en] } + let(:user) { create :user, organization: organization } let(:participatory_process) { create :participatory_process, organization: organization } let(:current_feature) { create :accountability_feature, participatory_space: participatory_process } let(:scope) { create :scope, organization: organization } @@ -36,6 +37,7 @@ let(:form) do double( invalid?: invalid, + current_user: user, current_feature: current_feature, title: { en: "title" }, description: { en: "description" }, @@ -73,6 +75,12 @@ expect(result.scope).to eq scope end + it "creates a new version for the result", versioning: true do + subject.call + expect(result.versions.count).to eq 1 + expect(result.versions.last.whodunnit).to eq user.to_gid.to_s + end + it "sets the category" do subject.call expect(result.category).to eq category diff --git a/decidim-accountability/spec/commands/update_result_spec.rb b/decidim-accountability/spec/commands/update_result_spec.rb index f02bc77cd4e83..74b2d6b84c35b 100644 --- a/decidim-accountability/spec/commands/update_result_spec.rb +++ b/decidim-accountability/spec/commands/update_result_spec.rb @@ -4,6 +4,7 @@ describe Decidim::Accountability::Admin::UpdateResult do let(:result) { create :result } + let(:user) { create :user, organization: organization } let(:organization) { result.feature.organization } let(:scope) { create :scope, organization: organization } let(:category) { create :category, participatory_space: participatory_process } @@ -36,6 +37,7 @@ let(:form) do double( invalid?: invalid, + current_user: user, title: { en: "title" }, description: { en: "description" }, proposal_ids: proposals.map(&:id), @@ -66,6 +68,13 @@ expect(translated(result.title)).to eq "title" end + it "creates a new version for the result", versioning: true do + expect do + subject.call + end.to change { result.versions.count }.by(1) + expect(result.versions.last.whodunnit).to eq user.to_gid.to_s + end + it "sets the scope" do subject.call expect(result.scope).to eq scope diff --git a/decidim-core/lib/decidim/has_reference.rb b/decidim-core/lib/decidim/has_reference.rb index 85fdab33be17a..88ac15398979a 100644 --- a/decidim-core/lib/decidim/has_reference.rb +++ b/decidim-core/lib/decidim/has_reference.rb @@ -28,12 +28,17 @@ def calculate_reference Decidim.resource_reference_generator.call(self, feature) end - # Internal: Sets the unique reference to the model. + # Internal: Sets the unique reference to the model. Note that if the resource + # implements `Decidim::Traceable` this method will not create a version. # # Returns nothing. def store_reference self[:reference] ||= calculate_reference - save if changed? + return unless changed? + + # rubocop:disable Rails/SkipsModelValidations + update_column(:reference, self[:reference]) + # rubocop:enable Rails/SkipsModelValidations end end end