From dea78c49f619642136beb484b30189ca8af87257 Mon Sep 17 00:00:00 2001 From: Paul Chavard Date: Tue, 22 Sep 2020 17:14:31 +0200 Subject: [PATCH 1/5] Run jobs in named queues --- app/jobs/api_entreprise/job.rb | 2 ++ app/jobs/export_job.rb | 2 ++ app/jobs/web_hook_job.rb | 2 ++ 3 files changed, 6 insertions(+) diff --git a/app/jobs/api_entreprise/job.rb b/app/jobs/api_entreprise/job.rb index 61797fa5f..371d769e7 100644 --- a/app/jobs/api_entreprise/job.rb +++ b/app/jobs/api_entreprise/job.rb @@ -1,4 +1,6 @@ class ApiEntreprise::Job < ApplicationJob + queue_as :api_entreprise + DEFAULT_MAX_ATTEMPTS_API_ENTREPRISE_JOBS = 5 rescue_from(ApiEntreprise::API::ResourceNotFound) do |exception| diff --git a/app/jobs/export_job.rb b/app/jobs/export_job.rb index 6abd0dcff..91bb9e1f7 100644 --- a/app/jobs/export_job.rb +++ b/app/jobs/export_job.rb @@ -1,4 +1,6 @@ class ExportJob < ApplicationJob + queue_as :exports + def perform(export) export.compute end diff --git a/app/jobs/web_hook_job.rb b/app/jobs/web_hook_job.rb index 5bea19d7d..3e6df8585 100644 --- a/app/jobs/web_hook_job.rb +++ b/app/jobs/web_hook_job.rb @@ -1,4 +1,6 @@ class WebHookJob < ApplicationJob + queue_as :webhooks_v1 + TIMEOUT = 10 def perform(procedure, dossier) From cb4e91c405def21a273eca115a6a957621de69d4 Mon Sep 17 00:00:00 2001 From: kara Diaby Date: Tue, 22 Sep 2020 16:04:57 +0200 Subject: [PATCH 2/5] Add iban type de champ --- Gemfile | 1 + Gemfile.lock | 2 ++ app/graphql/schema.graphql | 5 +++++ app/models/champs/iban_champ.rb | 19 +++++++++++++++++++ app/models/type_de_champ.rb | 3 ++- .../types_de_champ/iban_type_de_champ.rb | 2 ++ app/validators/iban_validator.rb | 11 +++++++++++ app/views/shared/champs/iban/_show.html.haml | 1 + .../shared/dossiers/_champ_row.html.haml | 2 ++ .../dossiers/editable_champs/_iban.html.haml | 4 ++++ config/locales/models/type_de_champ/fr.yml | 1 + spec/factories/champ.rb | 4 ++++ spec/factories/type_de_champ.rb | 3 +++ spec/models/champs/iban_champ_spec.rb | 12 ++++++++++++ .../services/procedure_export_service_spec.rb | 3 +++ 15 files changed, 72 insertions(+), 1 deletion(-) create mode 100644 app/models/champs/iban_champ.rb create mode 100644 app/models/types_de_champ/iban_type_de_champ.rb create mode 100644 app/validators/iban_validator.rb create mode 100644 app/views/shared/champs/iban/_show.html.haml create mode 100644 app/views/shared/dossiers/editable_champs/_iban.html.haml create mode 100644 spec/models/champs/iban_champ_spec.rb diff --git a/Gemfile b/Gemfile index 388c88735..afed52c8e 100644 --- a/Gemfile +++ b/Gemfile @@ -42,6 +42,7 @@ gem 'groupdate' gem 'haml-rails' gem 'hashie' gem 'http_accept_language' +gem 'iban-tools' gem 'jquery-rails' # Use jquery as the JavaScript library gem 'jwt' gem 'kaminari', '1.2.1' # Pagination diff --git a/Gemfile.lock b/Gemfile.lock index 89a21c188..dd871a642 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -341,6 +341,7 @@ GEM httpclient (2.8.3) i18n (1.8.5) concurrent-ruby (~> 1.0) + iban-tools (1.1.0) ice_nine (0.11.2) ipaddress (0.8.3) jaro_winkler (1.5.4) @@ -813,6 +814,7 @@ DEPENDENCIES haml-rails hashie http_accept_language + iban-tools jquery-rails jwt kaminari (= 1.2.1) diff --git a/app/graphql/schema.graphql b/app/graphql/schema.graphql index e8cad479c..c84c2ee0c 100644 --- a/app/graphql/schema.graphql +++ b/app/graphql/schema.graphql @@ -1272,6 +1272,11 @@ enum TypeDeChamp { """ header_section + """ + Iban + """ + iban + """ Nombre entier """ diff --git a/app/models/champs/iban_champ.rb b/app/models/champs/iban_champ.rb new file mode 100644 index 000000000..dcb6cd5db --- /dev/null +++ b/app/models/champs/iban_champ.rb @@ -0,0 +1,19 @@ +# == Schema Information +# +# Table name: champs +# +# id :integer not null, primary key +# private :boolean default(FALSE), not null +# row :integer +# type :string +# value :string +# created_at :datetime +# updated_at :datetime +# dossier_id :integer +# etablissement_id :integer +# parent_id :bigint +# type_de_champ_id :integer +# +class Champs::IbanChamp < Champ + validates_with IbanValidator +end diff --git a/app/models/type_de_champ.rb b/app/models/type_de_champ.rb index 7a5835616..2f391cd11 100644 --- a/app/models/type_de_champ.rb +++ b/app/models/type_de_champ.rb @@ -46,7 +46,8 @@ class TypeDeChamp < ApplicationRecord siret: 'siret', carte: 'carte', repetition: 'repetition', - titre_identite: 'titre_identite' + titre_identite: 'titre_identite', + iban: 'iban' } belongs_to :revision, class_name: 'ProcedureRevision', optional: true diff --git a/app/models/types_de_champ/iban_type_de_champ.rb b/app/models/types_de_champ/iban_type_de_champ.rb new file mode 100644 index 000000000..204348185 --- /dev/null +++ b/app/models/types_de_champ/iban_type_de_champ.rb @@ -0,0 +1,2 @@ +class TypesDeChamp::IbanTypeDeChamp < TypesDeChamp::TypeDeChampBase +end diff --git a/app/validators/iban_validator.rb b/app/validators/iban_validator.rb new file mode 100644 index 000000000..d31c30a19 --- /dev/null +++ b/app/validators/iban_validator.rb @@ -0,0 +1,11 @@ +require 'iban-tools' + +class IbanValidator < ActiveModel::Validator + def validate(record) + if record.value.present? + unless IBANTools::IBAN.valid?(record.value) + record.errors.add :iban, record.errors.generate_message(:value, :invalid) + end + end + end +end diff --git a/app/views/shared/champs/iban/_show.html.haml b/app/views/shared/champs/iban/_show.html.haml new file mode 100644 index 000000000..6ee164a0a --- /dev/null +++ b/app/views/shared/champs/iban/_show.html.haml @@ -0,0 +1 @@ +%p= champ.blank? ? 'Iban non fourni' : champ diff --git a/app/views/shared/dossiers/_champ_row.html.haml b/app/views/shared/dossiers/_champ_row.html.haml index 6d6461468..261d6d373 100644 --- a/app/views/shared/dossiers/_champ_row.html.haml +++ b/app/views/shared/dossiers/_champ_row.html.haml @@ -30,6 +30,8 @@ = render partial: "shared/champs/piece_justificative/show", locals: { champ: c } - when TypeDeChamp.type_champs.fetch(:siret) = render partial: "shared/champs/siret/show", locals: { champ: c, profile: profile } + - when TypeDeChamp.type_champs.fetch(:iban) + = render partial: "shared/champs/iban/show", locals: { champ: c } - when TypeDeChamp.type_champs.fetch(:textarea) = render partial: "shared/champs/textarea/show", locals: { champ: c } - when TypeDeChamp.type_champs.fetch(:date) diff --git a/app/views/shared/dossiers/editable_champs/_iban.html.haml b/app/views/shared/dossiers/editable_champs/_iban.html.haml new file mode 100644 index 000000000..149b436db --- /dev/null +++ b/app/views/shared/dossiers/editable_champs/_iban.html.haml @@ -0,0 +1,4 @@ += form.text_field :value, + placeholder: "27 caractères au format FR7630006000011234567890189", + required: champ.mandatory?, + aria: { describedby: describedby_id(champ) } diff --git a/config/locales/models/type_de_champ/fr.yml b/config/locales/models/type_de_champ/fr.yml index bdc1513ac..e3d5395da 100644 --- a/config/locales/models/type_de_champ/fr.yml +++ b/config/locales/models/type_de_champ/fr.yml @@ -34,3 +34,4 @@ fr: carte: 'Carte' repetition: 'Bloc répétable' titre_identite: 'Titre identité' + iban: 'Iban' diff --git a/spec/factories/champ.rb b/spec/factories/champ.rb index 000924b78..dd7ca6e27 100644 --- a/spec/factories/champ.rb +++ b/spec/factories/champ.rb @@ -155,6 +155,10 @@ FactoryBot.define do type_de_champ { association :type_de_champ_carte, procedure: dossier.procedure } end + factory :champ_iban, class: 'Champs::IbanChamp' do + type_de_champ { association :type_de_champ_iban, procedure: dossier.procedure } + end + factory :champ_siret, class: 'Champs::SiretChamp' do association :type_de_champ, factory: [:type_de_champ_siret] association :etablissement, factory: [:etablissement] diff --git a/spec/factories/type_de_champ.rb b/spec/factories/type_de_champ.rb index eb43d56ff..0156e19d9 100644 --- a/spec/factories/type_de_champ.rb +++ b/spec/factories/type_de_champ.rb @@ -139,6 +139,9 @@ FactoryBot.define do factory :type_de_champ_siret do type_champ { TypeDeChamp.type_champs.fetch(:siret) } end + factory :type_de_champ_iban do + type_champ { TypeDeChamp.type_champs.fetch(:iban) } + end factory :type_de_champ_carte do type_champ { TypeDeChamp.type_champs.fetch(:carte) } end diff --git a/spec/models/champs/iban_champ_spec.rb b/spec/models/champs/iban_champ_spec.rb new file mode 100644 index 000000000..b23f78b89 --- /dev/null +++ b/spec/models/champs/iban_champ_spec.rb @@ -0,0 +1,12 @@ + +describe Champs::IbanChamp do + describe '#valid?' do + it do + expect(build(:champ_iban, value: nil)).to be_valid + expect(build(:champ_iban, value: "FR35 KDSQFDJQSMFDQMFDQ")).to_not be_valid + expect(build(:champ_iban, value: "FR7630006000011234567890189")).to be_valid + expect(build(:champ_iban, value: "FR76 3000 6000 0112 3456 7890 189")).to be_valid + expect(build(:champ_iban, value: "FR76 3000 6000 0112 3456 7890 189DSF")).to_not be_valid + end + end +end diff --git a/spec/services/procedure_export_service_spec.rb b/spec/services/procedure_export_service_spec.rb index 0f8cafdfe..34f140986 100644 --- a/spec/services/procedure_export_service_spec.rb +++ b/spec/services/procedure_export_service_spec.rb @@ -74,6 +74,7 @@ describe ProcedureExportService do "siret", "carte", "titre_identite", + "iban", "text" ] end @@ -158,6 +159,7 @@ describe ProcedureExportService do "siret", "carte", "titre_identite", + "iban", "text" ] end @@ -238,6 +240,7 @@ describe ProcedureExportService do "siret", "carte", "titre_identite", + "iban", "text" ] end From ea4bcf59adc5dd4905317723439cd1d826e86882 Mon Sep 17 00:00:00 2001 From: Paul Chavard Date: Wed, 23 Sep 2020 16:25:19 +0200 Subject: [PATCH 3/5] remove demandes/new page --- app/controllers/demandes_controller.rb | 38 --------- app/views/demandes/new.html.haml | 102 ------------------------- config/routes.rb | 1 - 3 files changed, 141 deletions(-) delete mode 100644 app/controllers/demandes_controller.rb delete mode 100644 app/views/demandes/new.html.haml diff --git a/app/controllers/demandes_controller.rb b/app/controllers/demandes_controller.rb deleted file mode 100644 index 5aac0b6b7..000000000 --- a/app/controllers/demandes_controller.rb +++ /dev/null @@ -1,38 +0,0 @@ -class DemandesController < ApplicationController - def new - end - - def create - PipedriveService.add_demande( - demande_params[:email], - demande_params[:phone], - demande_params[:name], - demande_params[:poste], - demande_params[:source], - demande_params[:organization_name], - demande_params[:address], - demande_params[:nb_of_procedures], - demande_params[:nb_of_dossiers], - demande_params[:deadline] - ) - flash.notice = 'Votre demande a bien été enregistrée, nous vous contacterons rapidement.' - redirect_to administration_path(formulaire_demande_compte_admin_submitted: true) - end - - private - - def demande_params - params.permit( - :organization_name, - :poste, - :name, - :email, - :phone, - :source, - :address, - :nb_of_procedures, - :nb_of_dossiers, - :deadline - ) - end -end diff --git a/app/views/demandes/new.html.haml b/app/views/demandes/new.html.haml deleted file mode 100644 index 0bbaa871d..000000000 --- a/app/views/demandes/new.html.haml +++ /dev/null @@ -1,102 +0,0 @@ -- content_for(:title, 'Demande de compte administrateur') - -- content_for :footer do - = render partial: "root/footer" - - - -.container.demande - - %b - Étape 1 : demandez un compte administrateur - >> Étape 2 : recevez une confirmation par email >> Étape 3 : créez une démarche de test - %br - %br - %h1 Demande de compte administrateur pour créer une 1ère démarche de test - .card.featured - .card-title - Vous souhaitez seulement compléter une démarche sur notre site ? - - %p - Vous n'avez pas besoin de compte administrateur ! - %p - Cliquez plutôt sur le - %strong lien direct - vers votre démarche que doit vous communiquer l'administration – par exemple #{APPLICATION_BASE_URL}/commencer/NOM_DE_LA_DEMARCHE. - %p - Vous pouvez aussi consulter la - = succeed '.' do - = link_to "liste des démarches disponibles", LISTE_DES_DEMARCHES_URL - - %p.intro Attention, la création de compte administrateur est réservée uniquement aux organismes publics. Elle ne concerne ni les particuliers, ni les entreprises, ni les associations (sauf celles reconnues d'utilité publique), ni les personnes souhaitant remplir un dossier ou faire une démarche en ligne. Ce compte vous permettra de créer des démarches sur #{APPLICATION_NAME}, vous pourrez ensuite les diffuser en ligne auprès de vos usagers. - %p.intro Pour obtenir un compte administrateur sur #{APPLICATION_NAME}, veuillez remplir le formulaire ci-dessous et un membre de notre équipe vous contactera dès que possible. - %p.intro Tous les champs sont obligatoires. - %p.intro Si vous souhaitez seulement compléter une démarche sur notre site, vous n'avez pas besoin de compte administrateur! - - - %hr - - = form_tag({ controller: 'demandes', action: 'create' }, class: 'form') do - - = label_tag :organization_name do - Quel est le nom de votre organisme ? - %span.mandatory * - = text_field_tag :organization_name, nil, placeholder: 'service jeunesse et prévention, direction des affaires maritimes', required: true - - = label_tag :poste do - Quel est votre poste ? - %span.mandatory * - = text_field_tag :poste, nil, required: true - - = label_tag :name do - Quel est votre prénom et votre nom ? - %span.mandatory * - = text_field_tag :name, nil, required: true - - = label_tag :email do - Quelle est l'adresse email professionnelle pour laquelle vous souhaitez un compte ? - %span.mandatory * - %p.intro{ :style => "font-weight: normal" } - Vous utilisez un email orange, wanadoo, free, gmail etc. ? Merci de nous - %a{ href: contact_admin_path, target:'_blank', rel: 'noopener' } - contacter préalablement. - - = email_field_tag :email, nil, placeholder: 'jean.martin@developpement-durable.gouv.fr', required: true, pattern:'^.+@((?!hotmail)(?!gmail)(?!orange)(?!free)(?!wanadoo).)+\..+$',title:'Saisir un email valide et ne se finissant pas par Orange, Wanadoo, Free, etc.' - - = label_tag :phone do - Quel est votre numéro de téléphone (ligne directe) ? - %span.mandatory * - = text_field_tag :phone, nil, required: true - - = label_tag :source do - Comment avez-vous entendu parler de #{APPLICATION_NAME} ? - %span.mandatory * - = text_field_tag :source, nil, required: true - - = label_tag :address do - Quel est le code postal de votre institution ? - %span.mandatory * - = text_field_tag :address, nil, required: true - - = label_tag :nb_of_procedures do - Combien de démarches souhaitez-vous dématérialiser ? - %span.mandatory * - = select_tag :nb_of_procedures, - options_for_select(nb_of_procedures_options), - prompt: 'choisir un intervalle', - required: true - - = label_tag :deadline do - À quelle échéance voudriez-vous dématérialiser ? - %span.mandatory * - = select_tag :deadline, - options_for_select(deadline_options), - prompt: 'choisir une échéance', - required: true - - = label_tag :nb_of_dossiers do - Nombre de dossiers usagers qui seront dématérialisés, par an ? (Mettez 0 si vous ne savez pas) - %span.mandatory * - = number_field_tag :nb_of_dossiers, nil, required: true - - = submit_tag 'Demander un compte administrateur pour créer une 1ère démarche de test', class: 'button primary expand large', data: { disable: true } diff --git a/config/routes.rb b/config/routes.rb index 54ae76c40..23b83dae0 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -110,7 +110,6 @@ Rails.application.routes.draw do get '/stats' => 'stats#index' get '/stats/download' => 'stats#download' - resources :demandes, only: [:new, :create] namespace :france_connect do get 'particulier' => 'particulier#login' From 61c315b27698678d0c370f5313221551fc62832c Mon Sep 17 00:00:00 2001 From: Paul Chavard Date: Wed, 23 Sep 2020 11:34:10 +0200 Subject: [PATCH 4/5] Fix geo area point coordinates display --- app/models/geo_area.rb | 2 +- spec/models/geo_area_spec.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/models/geo_area.rb b/app/models/geo_area.rb index 9bc30fc67..f4a7a5b27 100644 --- a/app/models/geo_area.rb +++ b/app/models/geo_area.rb @@ -91,7 +91,7 @@ class GeoArea < ApplicationRecord def location if point? - Geo::Coord.new(*rgeo_geometry.coordinates).to_s + Geo::Coord.new(*rgeo_geometry.coordinates.reverse).to_s end end diff --git a/spec/models/geo_area_spec.rb b/spec/models/geo_area_spec.rb index 95e6b492e..e0f68f294 100644 --- a/spec/models/geo_area_spec.rb +++ b/spec/models/geo_area_spec.rb @@ -14,7 +14,7 @@ RSpec.describe GeoArea, type: :model do describe '#location' do let(:geo_area) { build(:geo_area, :point) } - it { expect(geo_area.location).to eq("2°25'42\"N 46°32'19\"E") } + it { expect(geo_area.location).to eq("46°32'19\"N 2°25'42\"E") } end describe '#rgeo_geometry' do From 26a6e18cb9f0cac47ec8fb7b8e7634db6fb7e7cd Mon Sep 17 00:00:00 2001 From: Paul Chavard Date: Wed, 23 Sep 2020 14:37:07 +0200 Subject: [PATCH 5/5] =?UTF-8?q?Do=20not=20crash=20when=20rgeo=20can?= =?UTF-8?q?=E2=80=99t=20calculate=20polygon=20area?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit example are “hourglass” shaped polygons --- app/models/geo_area.rb | 4 ++-- spec/factories/geo_area.rb | 19 +++++++++++++++++++ spec/models/geo_area_spec.rb | 8 ++++++++ 3 files changed, 29 insertions(+), 2 deletions(-) diff --git a/app/models/geo_area.rb b/app/models/geo_area.rb index f4a7a5b27..c2693e80a 100644 --- a/app/models/geo_area.rb +++ b/app/models/geo_area.rb @@ -79,13 +79,13 @@ class GeoArea < ApplicationRecord def area if polygon? && RGeo::Geos.supported? - rgeo_geometry.area&.round(1) + rgeo_geometry&.area&.round(1) end end def length if line? && RGeo::Geos.supported? - rgeo_geometry.length&.round(1) + rgeo_geometry.length.round(1) end end diff --git a/spec/factories/geo_area.rb b/spec/factories/geo_area.rb index 629413b26..f4cf3f5cc 100644 --- a/spec/factories/geo_area.rb +++ b/spec/factories/geo_area.rb @@ -38,6 +38,25 @@ FactoryBot.define do end end + trait :hourglass_polygon do + geometry do + { + "type": "Polygon", + "coordinates": [ + [ + [2.4282997263522077, 46.53823812531846], + [2.4283969564289976, 46.53823259028192], + [2.4283701343391897, 46.53816063476029], + [2.4284807754604003, 46.53817078233945], + [2.4284921748487136, 46.53822105895472], + [2.428447247847828, 46.53820214757286], + [2.4282997263522077, 46.53823812531846] + ] + ] + } + end + end + trait :line_string do geometry do { diff --git a/spec/models/geo_area_spec.rb b/spec/models/geo_area_spec.rb index e0f68f294..4a42e972b 100644 --- a/spec/models/geo_area_spec.rb +++ b/spec/models/geo_area_spec.rb @@ -5,6 +5,14 @@ RSpec.describe GeoArea, type: :model do it { expect(geo_area.area).to eq(219.0) } end + describe '#area (hourglass polygon)' do + let(:geo_area) { build(:geo_area, :hourglass_polygon) } + + # This test fails in my local environement end the problem exists in production. + # Must be some mismatch between CI/production. I still want this fix in production. + it.pending { expect(geo_area.area).to be_nil } + end + describe '#length' do let(:geo_area) { build(:geo_area, :line_string) }