Skip to content

Commit

Permalink
Merge branch 'feature/dat-411-etq-d-si-la-modalite-dappel-formulaire-…
Browse files Browse the repository at this point in the history
…de-collecte-du' of github.com:etalab/data_pass into feature/dat-411-etq-d-si-la-modalite-dappel-formulaire-de-collecte-du
  • Loading branch information
Isalafont committed Jul 1, 2024
2 parents 8f4d080 + b418b2f commit e80d52b
Show file tree
Hide file tree
Showing 12 changed files with 137 additions and 0 deletions.
1 change: 1 addition & 0 deletions Gemfile
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ source 'https://rubygems.org'

ruby '3.3.2'

gem 'active_model_validates_intersection_of'
gem 'active_model_serializers', '~> 0.10.14'
gem 'active_storage_validations'
gem 'aws-sdk-s3', require: false
Expand Down
3 changes: 3 additions & 0 deletions Gemfile.lock
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,8 @@ GEM
activemodel (>= 4.1)
case_transform (>= 0.2)
jsonapi-renderer (>= 0.1.1.beta1, < 0.3)
active_model_validates_intersection_of (3.0.1)
activemodel (>= 5.0.0)
active_storage_validations (1.1.4)
activejob (>= 5.2.0)
activemodel (>= 5.2.0)
Expand Down Expand Up @@ -594,6 +596,7 @@ PLATFORMS

DEPENDENCIES
active_model_serializers (~> 0.10.14)
active_model_validates_intersection_of
active_storage_validations
aws-sdk-s3
bootsnap
Expand Down
15 changes: 15 additions & 0 deletions app/models/authorization_request/api_particulier.rb
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,24 @@ class AuthorizationRequest::APIParticulier < AuthorizationRequest
add_attributes :date_prevue_mise_en_production,
:volumetrie_approximative

add_attribute :modalities,
type: :array,
validation: {
presence: true,
intersection: { in: %w[params formulaire_qf] },
}

add_scopes(validation: {
presence: true, if: -> { need_complete_validation?(:scopes) }
})

contact :contact_technique, validation_condition: ->(record) { record.need_complete_validation?(:contacts) }

after_initialize :set_default_modalities

def set_default_modalities
return if modalities.present?

data['modalities'] = %w[params]
end
end
22 changes: 22 additions & 0 deletions app/models/concerns/authorization_core/attributes.rb
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,31 @@ def self.add_attribute(name, options = {})

validates name, options[:validation] if options[:validation].present?

overwrite_array_accessor(name) if options[:type] == :array

extra_attributes.push(name)
end
end

private

def self.overwrite_array_accessor(name)
define_method(name) do
data[name.to_s] ||= []

begin
JSON.parse(data[name.to_s]).sort
rescue StandardError
data[name.to_s].sort
end
end

define_method(:"#{name}=") do |value|
value = (value || []).compact_blank

super(value.sort)
end
end
end
end
end
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
<!-- No need to implement it yet -->
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
<%= render layout: 'authorization_requests/shared/blocks/summary_block', locals: { title: t('authorization_request_forms.default.steps.modalities'), block_id: :basic_infos, f:, editable: } do %>
<% if f.wording_for('intro', 'modalities') %>
<%= f.wording_for('intro', 'modalities').html_safe %>
<% end %>

<ul>
<% @authorization_request.modalities.each do |modality| %>
<li>
<%= f.label_value("modalities.values.#{modality}").html_safe %>
</li>
<% end %>
</ul>
<% end %>
1 change: 1 addition & 0 deletions config/authorization_definitions.yml
Original file line number Diff line number Diff line change
Expand Up @@ -184,6 +184,7 @@ shared:
webhook: true
blocks:
- name: 'basic_infos'
- name: 'modalities'
- name: 'personal_data'
- name: 'legal'
- name: 'scopes'
Expand Down
3 changes: 3 additions & 0 deletions config/authorization_request_forms/api_particulier.yml
Original file line number Diff line number Diff line change
Expand Up @@ -201,6 +201,9 @@ api-particulier-arpege-concerto:
- cnaf_allocataires
- cnaf_enfants
- cnaf_adresse
modalities:
- formulaire_qf
- params

api-particulier-bl-enfance-berger-levrault:
name: BL Enfance, Tarification services municipaux / Portail Famille
Expand Down
1 change: 1 addition & 0 deletions config/i18n-tasks.yml
Original file line number Diff line number Diff line change
Expand Up @@ -130,6 +130,7 @@ ignore_unused:
- 'authorization_request_forms.*.legal.justificatif.*'
- 'authorization_request_forms.api_particulier.legal.cnaf.*'
- 'authorization_request_forms.api_particulier.legal.deliberation.*'
- 'authorization_request_forms.*.modalities.values.*.label'
- 'authorization_request_mailer.*.subject'
- 'support.*'
- 'authorization_request_forms.build.update.{reopening_,}error.*'
Expand Down
8 changes: 8 additions & 0 deletions config/locales/authorization_request_forms.fr.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ fr:
legal: "Justification du traitement des données personnelles"
scopes: "Les données"
contacts: "Les personnes impliquées"
modalities: "Les modalités d'accès"
finish: "La synthèse"
terms_of_service_accepted:
label: J'ai pris connaissance des&nbsp;<a href="%{link}" target="_blank">conditions générales d'utilisation</a>&nbsp;et je les valide.
Expand Down Expand Up @@ -199,6 +200,13 @@ fr:
cadre_juridique_document:
label: Ajoutez votre délibération

modalities:
intro: "Vous pourrez accéder au service API Particulier via les modalités ci-dessous :"
values:
params:
label: Via un jeton d'accès, accompagné des paramètres usagers.
formulaire_qf:
label: Via l'utilisation du formulaire national QF (Quotient Familial). Plus d'infos <a href="https://quotient-familial.numerique.gouv.fr/" target="_blank">ici</a>.
scopes:
info:
content: |
Expand Down
35 changes: 35 additions & 0 deletions spec/models/authorization_request/api_particulier_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
RSpec.describe AuthorizationRequest::APIParticulier, type: :model do
describe 'modalities attribute' do
subject { authorization_request.modalities }

let(:authorization_request) { build(:authorization_request, :api_particulier) }

it { is_expected.to be_a(Array) }

it 'has a default value' do
expect(subject).to eq(%w[params])
end

context 'with values' do
let(:authorization_request) { create(:authorization_request, :api_particulier, modalities: %w[params formulaire_qf]) }

it { is_expected.to eq(%w[formulaire_qf params]) }
end
end

describe 'modalities validation' do
subject { build(:authorization_request, :api_particulier, modalities:) }

context 'with valid values' do
let(:modalities) { %w[formulaire_qf params] }

it { is_expected.to be_valid }
end

context 'with invalid values' do
let(:modalities) { %w[invalid] }

it { is_expected.not_to be_valid }
end
end
end
34 changes: 34 additions & 0 deletions spec/organizers/create_authorization_request_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -110,5 +110,39 @@

it { is_expected.to be_success }
end

describe 'API Particulier authorization request' do
let(:authorization_request_params) { ActionController::Parameters.new }

context 'with a form which has modalities on data key' do
let(:authorization_request_form) { AuthorizationRequestForm.find('api-particulier-arpege-concerto') }

it { is_expected.to be_success }

it 'creates an authorization request with modalities' do
expect { create_authorization_request }.to change(AuthorizationRequest, :count).by(1)

authorization_request = AuthorizationRequest.last

expect(authorization_request.modalities).to be_present
expect(authorization_request.modalities).to eq(%w[formulaire_qf params])
end
end

context 'with a form which has no modalities on data key' do
let(:authorization_request_form) { AuthorizationRequestForm.find('api-particulier') }

it { is_expected.to be_success }

it 'creates an authorization request with default modalities' do
expect { create_authorization_request }.to change(AuthorizationRequest, :count).by(1)

authorization_request = AuthorizationRequest.last

expect(authorization_request.modalities).to be_present
expect(authorization_request.modalities).to eq(%w[params])
end
end
end
end
end

0 comments on commit e80d52b

Please sign in to comment.