Merge pull request #10415 from tchak/champs-updated-by
feat(champ): add updated_by column
This commit is contained in:
commit
395967e0a1
10 changed files with 25 additions and 19 deletions
|
@ -7,7 +7,7 @@ class Champs::ChampController < ApplicationController
|
|||
def find_champ
|
||||
dossier = policy_scope(Dossier).includes(:champs, revision: [:types_de_champ]).find(params[:dossier_id])
|
||||
type_de_champ = dossier.find_type_de_champ_by_stable_id(params[:stable_id])
|
||||
dossier.champ_for_update(type_de_champ, params_row_id)
|
||||
dossier.champ_for_update(type_de_champ, params_row_id, updated_by: current_user.email)
|
||||
end
|
||||
|
||||
def params_row_id
|
||||
|
|
|
@ -274,7 +274,7 @@ module Instructeurs
|
|||
end
|
||||
|
||||
def update_annotations
|
||||
dossier_with_champs.update_champs_attributes(champs_private_attributes_params, :private)
|
||||
dossier_with_champs.update_champs_attributes(champs_private_attributes_params, :private, updated_by: current_user.email)
|
||||
if dossier.champs.any?(&:changed_for_autosave?)
|
||||
dossier.last_champ_private_updated_at = Time.zone.now
|
||||
end
|
||||
|
|
|
@ -551,7 +551,7 @@ module Users
|
|||
end
|
||||
|
||||
def update_dossier_and_compute_errors
|
||||
@dossier.update_champs_attributes(champs_public_attributes_params, :public)
|
||||
@dossier.update_champs_attributes(champs_public_attributes_params, :public, updated_by: current_user.email)
|
||||
if @dossier.champs.any?(&:changed_for_autosave?)
|
||||
@dossier.last_champ_updated_at = Time.zone.now
|
||||
end
|
||||
|
|
|
@ -44,7 +44,7 @@ module Mutations
|
|||
.find_by(type_champ: annotation_type_champ, stable_id:)
|
||||
|
||||
return nil if type_de_champ.nil?
|
||||
dossier.champ_for_update(type_de_champ, row_id)
|
||||
dossier.champ_for_update(type_de_champ, row_id, updated_by: current_administrateur.email)
|
||||
end
|
||||
|
||||
def annotation_type_champ
|
||||
|
|
|
@ -55,18 +55,18 @@ module DossierChampsConcern
|
|||
.types_de_champ
|
||||
.filter { _1.stable_id.in?(stable_ids) }
|
||||
.filter { !revision.child?(_1) }
|
||||
.map { champ_for_update(_1, nil) }
|
||||
.map { champ_for_update(_1, nil, updated_by: nil) }
|
||||
end
|
||||
|
||||
def champ_for_update(type_de_champ, row_id)
|
||||
champ, attributes = champ_with_attributes_for_update(type_de_champ, row_id)
|
||||
def champ_for_update(type_de_champ, row_id, updated_by:)
|
||||
champ, attributes = champ_with_attributes_for_update(type_de_champ, row_id, updated_by:)
|
||||
champ.assign_attributes(attributes)
|
||||
champ
|
||||
end
|
||||
|
||||
def update_champs_attributes(attributes, scope)
|
||||
def update_champs_attributes(attributes, scope, updated_by:)
|
||||
champs_attributes = attributes.to_h.map do |public_id, attributes|
|
||||
champ_attributes_by_public_id(public_id, attributes, scope)
|
||||
champ_attributes_by_public_id(public_id, attributes, scope, updated_by:)
|
||||
end
|
||||
|
||||
assign_attributes(champs_attributes:)
|
||||
|
@ -87,13 +87,13 @@ module DossierChampsConcern
|
|||
end
|
||||
end
|
||||
|
||||
def champ_attributes_by_public_id(public_id, attributes, scope)
|
||||
def champ_attributes_by_public_id(public_id, attributes, scope, updated_by:)
|
||||
stable_id, row_id = public_id.split('-')
|
||||
type_de_champ = find_type_de_champ_by_stable_id(stable_id, scope)
|
||||
champ_with_attributes_for_update(type_de_champ, row_id).last.merge(attributes)
|
||||
champ_with_attributes_for_update(type_de_champ, row_id, updated_by:).last.merge(attributes)
|
||||
end
|
||||
|
||||
def champ_with_attributes_for_update(type_de_champ, row_id)
|
||||
def champ_with_attributes_for_update(type_de_champ, row_id, updated_by:)
|
||||
attributes = type_de_champ.params_for_champ
|
||||
# TODO: Once we have the right index in place, we should change this to use `create_or_find_by` instead of `find_or_create_by`
|
||||
champ = champs
|
||||
|
@ -101,6 +101,7 @@ module DossierChampsConcern
|
|||
.find_or_create_by!(stable_id: type_de_champ.stable_id, row_id:)
|
||||
|
||||
attributes[:id] = champ.id
|
||||
attributes[:updated_by] = updated_by
|
||||
|
||||
# Needed when a revision change the champ type in this case, we reset the champ data
|
||||
if champ.type != attributes[:type]
|
||||
|
|
|
@ -64,7 +64,7 @@ class TypesDeChamp::PrefillRepetitionTypeDeChamp < TypesDeChamp::PrefillTypeDeCh
|
|||
type_de_champ = revision.types_de_champ.find { _1.stable_id == stable_id }
|
||||
next unless type_de_champ
|
||||
|
||||
subchamp = champ.dossier.champ_for_update(type_de_champ, row_id)
|
||||
subchamp = champ.dossier.champ_for_update(type_de_champ, row_id, updated_by: nil)
|
||||
TypesDeChamp::PrefillTypeDeChamp.build(subchamp.type_de_champ, revision).to_assignable_attributes(subchamp, value)
|
||||
end.compact
|
||||
end
|
||||
|
|
5
db/migrate/20240513140508_add_updated_by_to_champs.rb
Normal file
5
db/migrate/20240513140508_add_updated_by_to_champs.rb
Normal file
|
@ -0,0 +1,5 @@
|
|||
class AddUpdatedByToChamps < ActiveRecord::Migration[7.0]
|
||||
def change
|
||||
add_column :champs, :updated_by, :text
|
||||
end
|
||||
end
|
|
@ -263,6 +263,7 @@ ActiveRecord::Schema[7.0].define(version: 2024_05_27_090508) do
|
|||
t.string "type"
|
||||
t.integer "type_de_champ_id"
|
||||
t.datetime "updated_at", precision: nil
|
||||
t.text "updated_by"
|
||||
t.string "value"
|
||||
t.jsonb "value_json"
|
||||
t.index ["dossier_id"], name: "index_champs_on_dossier_id"
|
||||
|
|
|
@ -10,7 +10,6 @@ describe Champs::PieceJustificativeController, type: :controller do
|
|||
|
||||
subject do
|
||||
put :update, params: {
|
||||
position: '1',
|
||||
dossier_id: champ.dossier_id,
|
||||
stable_id: champ.stable_id,
|
||||
blob_signed_id: file
|
||||
|
@ -49,7 +48,7 @@ describe Champs::PieceJustificativeController, type: :controller do
|
|||
# See https://github.com/betagouv/demarches-simplifiees.fr/issues/4926
|
||||
before do
|
||||
champ
|
||||
expect_any_instance_of(Champs::PieceJustificativeChamp).to receive(:save).twice.and_return(false)
|
||||
expect_any_instance_of(Champs::PieceJustificativeChamp).to receive(:save).and_return(false)
|
||||
expect_any_instance_of(Champs::PieceJustificativeChamp).to receive(:errors)
|
||||
.and_return(double(full_messages: ['La pièce justificative n’est pas d’un type accepté']))
|
||||
end
|
||||
|
|
|
@ -124,7 +124,7 @@ RSpec.describe DossierChampsConcern do
|
|||
let(:row_id) { nil }
|
||||
|
||||
context "public champ" do
|
||||
subject { dossier.champ_for_update(type_de_champ_public, row_id) }
|
||||
subject { dossier.champ_for_update(type_de_champ_public, row_id, updated_by: dossier.user.email) }
|
||||
|
||||
it {
|
||||
expect(subject.persisted?).to be_truthy
|
||||
|
@ -165,7 +165,7 @@ RSpec.describe DossierChampsConcern do
|
|||
end
|
||||
|
||||
context "private champ" do
|
||||
subject { dossier.champ_for_update(type_de_champ_private, row_id) }
|
||||
subject { dossier.champ_for_update(type_de_champ_private, row_id, updated_by: dossier.user.email) }
|
||||
|
||||
it {
|
||||
expect(subject.persisted?).to be_truthy
|
||||
|
@ -191,7 +191,7 @@ RSpec.describe DossierChampsConcern do
|
|||
let(:champ_991) { dossier.project_champ(dossier.find_type_de_champ_by_stable_id(991), nil) }
|
||||
let(:champ_994) { dossier.project_champ(dossier.find_type_de_champ_by_stable_id(994), row_id) }
|
||||
|
||||
subject { dossier.update_champs_attributes(attributes, :public) }
|
||||
subject { dossier.update_champs_attributes(attributes, :public, updated_by: dossier.user.email) }
|
||||
|
||||
it {
|
||||
subject
|
||||
|
@ -229,7 +229,7 @@ RSpec.describe DossierChampsConcern do
|
|||
|
||||
let(:annotation_995) { dossier.project_champ(dossier.find_type_de_champ_by_stable_id(995), nil) }
|
||||
|
||||
subject { dossier.update_champs_attributes(attributes, :private) }
|
||||
subject { dossier.update_champs_attributes(attributes, :private, updated_by: dossier.user.email) }
|
||||
|
||||
it {
|
||||
subject
|
||||
|
|
Loading…
Reference in a new issue