Merge pull request #7057 from betagouv/main

2022-03-17-01
This commit is contained in:
Paul Chavard 2022-03-17 12:17:22 +01:00 committed by GitHub
commit a7c406c6f2
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
17 changed files with 115 additions and 80 deletions

View file

@ -1,7 +1,7 @@
module Administrateurs module Administrateurs
class ProceduresController < AdministrateurController class ProceduresController < AdministrateurController
before_action :retrieve_procedure, only: [:champs, :annotations, :edit, :monavis, :update_monavis, :jeton, :update_jeton, :publication, :publish, :transfert, :allow_expert_review, :experts_require_administrateur_invitation] before_action :retrieve_procedure, only: [:champs, :annotations, :modifications, :edit, :monavis, :update_monavis, :jeton, :update_jeton, :publication, :publish, :transfert, :allow_expert_review, :experts_require_administrateur_invitation]
before_action :procedure_revisable?, only: [:champs, :annotations] before_action :procedure_revisable?, only: [:champs, :annotations, :modifications]
ITEMS_PER_PAGE = 25 ITEMS_PER_PAGE = 25
@ -172,6 +172,9 @@ module Administrateurs
def jeton def jeton
end end
def modifications
end
def update_jeton def update_jeton
token = params[:procedure][:api_entreprise_token] token = params[:procedure][:api_entreprise_token]
@procedure.api_entreprise_token = token @procedure.api_entreprise_token = token

View file

@ -8,7 +8,8 @@ import React, {
createContext, createContext,
useCallback useCallback
} from 'react'; } from 'react';
import maplibre, { Map, Style, NavigationControl } from 'maplibre-gl'; import maplibre, { Map, NavigationControl } from 'maplibre-gl';
import type { Style } from 'maplibre-gl';
import invariant from 'tiny-invariant'; import invariant from 'tiny-invariant';

View file

@ -3,10 +3,12 @@ import invariant from 'tiny-invariant';
import cadastreLayers from './layers/cadastre'; import cadastreLayers from './layers/cadastre';
const IGN_TOKEN = 'rc1egnbeoss72hxvd143tbyk'; // ggignore function ignServiceURL(
layer: string,
function ignServiceURL(layer: string, format = 'image/png') { env = 'decouverte',
const url = `https://wxs.ign.fr/${IGN_TOKEN}/geoportail/wmts`; format = 'image/png'
) {
const url = `https://wxs.ign.fr/${env}/geoportail/wmts`;
const query = const query =
'service=WMTS&request=GetTile&version=1.0.0&tilematrixset=PM&tilematrix={z}&tilecol={x}&tilerow={y}&style=normal'; 'service=WMTS&request=GetTile&version=1.0.0&tilematrixset=PM&tilematrix={z}&tilecol={x}&tilerow={y}&style=normal';
@ -125,7 +127,10 @@ function buildSources() {
.flatMap(({ layers }) => layers.map(([, code]) => code)) .flatMap(({ layers }) => layers.map(([, code]) => code))
.map((code) => [ .map((code) => [
getLayerCode(code), getLayerCode(code),
rasterSource([ignServiceURL(code)], 'IGN-F/Géoportail/MNHN') rasterSource(
[ignServiceURL(code, 'environnement')],
'IGN-F/Géoportail/MNHN'
)
]) ])
); );
} }
@ -210,7 +215,7 @@ export default {
url: 'https://openmaptiles.geo.data.gouv.fr/data/france-vector.json' url: 'https://openmaptiles.geo.data.gouv.fr/data/france-vector.json'
}, },
'photographies-aeriennes': rasterSource( 'photographies-aeriennes': rasterSource(
[ignServiceURL('ORTHOIMAGERY.ORTHOPHOTOS', 'image/jpeg')], [ignServiceURL('ORTHOIMAGERY.ORTHOPHOTOS', 'decouverte', 'image/jpeg')],
'IGN-F/Géoportail' 'IGN-F/Géoportail'
), ),
cadastre: { cadastre: {
@ -218,7 +223,7 @@ export default {
url: 'https://openmaptiles.geo.data.gouv.fr/data/cadastre.json' url: 'https://openmaptiles.geo.data.gouv.fr/data/cadastre.json'
}, },
'plan-ign': rasterSource( 'plan-ign': rasterSource(
[ignServiceURL('GEOGRAPHICALGRIDSYSTEMS.PLANIGNV2')], [ignServiceURL('GEOGRAPHICALGRIDSYSTEMS.PLANIGNV2', 'decouverte')],
'IGN-F/Géoportail' 'IGN-F/Géoportail'
), ),
...buildSources() ...buildSources()

View file

@ -1,4 +1,4 @@
import { AnyLayer } from 'maplibre-gl'; import type { AnyLayer } from 'maplibre-gl';
const layers: AnyLayer[] = [ const layers: AnyLayer[] = [
{ {

View file

@ -1,10 +1,6 @@
import { import type { LngLat, LngLatLike, LngLatBoundsLike } from 'maplibre-gl';
LngLatBounds,
LngLat,
LngLatLike,
LngLatBoundsLike
} from 'maplibre-gl';
import type { Geometry, FeatureCollection, Feature } from 'geojson'; import type { Geometry, FeatureCollection, Feature } from 'geojson';
import { LngLatBounds } from 'maplibre-gl';
import invariant from 'tiny-invariant'; import invariant from 'tiny-invariant';
export function getBounds(geometry: Geometry): LngLatBoundsLike { export function getBounds(geometry: Geometry): LngLatBoundsLike {

View file

@ -653,6 +653,10 @@ class Procedure < ApplicationRecord
!AssignTo.exists?(groupe_instructeur: groupe_instructeurs) !AssignTo.exists?(groupe_instructeur: groupe_instructeurs)
end end
def revised?
feature_enabled?(:procedure_revisions) && revisions.size > 2
end
def routee? def routee?
routing_enabled? || groupe_instructeurs.size > 1 routing_enabled? || groupe_instructeurs.size > 1
end end

View file

@ -36,9 +36,9 @@
= t("update_drop_down_options#{postfix}", scope: [:administrateurs, :revision_changes], label: change[:label]) = t("update_drop_down_options#{postfix}", scope: [:administrateurs, :revision_changes], label: change[:label])
%ul %ul
- if added.present? - if added.present?
%li= t(:add_option, scope: [:administrateurs, :revision_changes], items: added.map{ |term| "« #{term.strip} »" }.join(", ")) %li= t(:add_option, scope: [:administrateurs, :revision_changes], items: added.map{ |term| "« #{term.strip} »" }.join(", "))
- if removed.present? - if removed.present?
%li= t(:remove_option, scope: [:administrateurs, :revision_changes], items: removed.map{ |term| "« #{term.strip} »" }.join(", ")) %li= t(:remove_option, scope: [:administrateurs, :revision_changes], items: removed.map{ |term| "« #{term.strip} »" }.join(", "))
- when :drop_down_other - when :drop_down_other
- if change[:from] == false - if change[:from] == false
%li.mb-1= t("administrateurs.revision_changes.update_drop_down_other#{postfix}.enabled", label: change[:label]) %li.mb-1= t("administrateurs.revision_changes.update_drop_down_other#{postfix}.enabled", label: change[:label])
@ -51,6 +51,6 @@
= t("update_carte_layers#{postfix}", scope: [:administrateurs, :revision_changes], label: change[:label]) = t("update_carte_layers#{postfix}", scope: [:administrateurs, :revision_changes], label: change[:label])
%ul %ul
- if added.present? - if added.present?
%li= t(:add_option, scope: [:administrateurs, :revision_changes], items: added.map{ |term| "« #{t(term, scope: [:administrateurs, :carte_layers])} »" }.join(", ")) %li= t(:add_option, scope: [:administrateurs, :revision_changes], items: added.map{ |term| "« #{t(term, scope: [:administrateurs, :carte_layers])} »" }.join(", "))
- if removed.present? - if removed.present?
%li= t(:remove_option, scope: [:administrateurs, :revision_changes], items: removed.map{ |term| "« #{t(term, scope: [:administrateurs, :carte_layers])} »" }.join(", ")) %li= t(:remove_option, scope: [:administrateurs, :revision_changes], items: removed.map{ |term| "« #{t(term, scope: [:administrateurs, :carte_layers])} »" }.join(", "))

View file

@ -0,0 +1,18 @@
= render partial: 'administrateurs/breadcrumbs',
locals: { steps: [link_to('Démarches', admin_procedures_path),
link_to(@procedure.libelle, admin_procedure_path(@procedure)),
'Modifications'] }
.container
%h1.page-title
Historique des modifications du formulaire
.container
- previous_revision = nil
- @procedure.revisions.each do |revision|
- if previous_revision.present? && !revision.draft?
- changes = previous_revision.compare(revision)
- if changes.present?
.card.mb-4
%h2.card-title= "Modifications publiées le #{l(revision.published_at, format: '%d %B %Y à %R')}"
= render partial: 'revision_changes', locals: { changes: changes }
- previous_revision = revision

View file

@ -56,7 +56,7 @@
- error_messages = @procedure.errors.messages_for(:draft_types_de_champ).to_sentence - error_messages = @procedure.errors.messages_for(:draft_types_de_champ).to_sentence
= link_to champs_admin_procedure_path(@procedure), class: 'card-admin', title: error_messages do = link_to champs_admin_procedure_path(@procedure), class: 'card-admin', title: error_messages do
- if @procedure.draft_types_de_champ.count == 0 - if @procedure.draft_types_de_champ.empty?
%div %div
%span.icon.clock %span.icon.clock
%p.card-admin-status-todo À faire %p.card-admin-status-todo À faire
@ -70,7 +70,7 @@
%p.card-admin-status-accept Validé %p.card-admin-status-accept Validé
%div %div
%p.card-admin-title %p.card-admin-title
%span.badge.baseline= @procedure.draft_types_de_champ.count %span.badge.baseline= @procedure.draft_types_de_champ.size
Champs du formulaire Champs du formulaire
%p.card-admin-subtitle À remplir par les usagers %p.card-admin-subtitle À remplir par les usagers
%p.button Modifier %p.button Modifier
@ -109,13 +109,13 @@
%p.card-admin-status-accept Validé %p.card-admin-status-accept Validé
%div %div
%p.card-admin-title %p.card-admin-title
%span.badge.baseline= @procedure.administrateurs.count %span.badge.baseline= @procedure.administrateurs.size
#{"Administrateur".pluralize(@procedure.administrateurs.count)} #{"Administrateur".pluralize(@procedure.administrateurs.size)}
%p.card-admin-subtitle Gestion de la démarche %p.card-admin-subtitle Gestion de la démarche
%p.button Modifier %p.button Modifier
= link_to admin_procedure_groupe_instructeurs_path(@procedure), id: 'groupe-instructeurs', class: 'card-admin' do = link_to admin_procedure_groupe_instructeurs_path(@procedure), id: 'groupe-instructeurs', class: 'card-admin' do
- if @procedure.routee? || @procedure.instructeurs.count > 1 - if @procedure.routee? || @procedure.instructeurs.size > 1
%div %div
%span.icon.accept %span.icon.accept
%p.card-admin-status-accept Validé %p.card-admin-status-accept Validé
@ -126,14 +126,27 @@
%div %div
%p.card-admin-title %p.card-admin-title
- if @procedure.routee? - if @procedure.routee?
%span.badge.baseline= @procedure.groupe_instructeurs.count %span.badge.baseline= @procedure.groupe_instructeurs.size
- else - else
%span.badge.baseline= @procedure.instructeurs.count %span.badge.baseline= @procedure.instructeurs.size
= @procedure.routee? ? "Groupe Instructeurs" : "#{"Instructeur".pluralize(@procedure.instructeurs.count)}" = @procedure.routee? ? "Groupe Instructeurs" : "#{"Instructeur".pluralize(@procedure.instructeurs.size)}"
%p.card-admin-subtitle Suivi des dossiers %p.card-admin-subtitle Suivi des dossiers
%p.button Modifier %p.button Modifier
- if @procedure.revised?
= link_to modifications_admin_procedure_path(@procedure), id: 'modifications', class: 'card-admin' do
%div
%span.icon.accept
%p.card-admin-status-accept Activée
%div
%p.card-admin-title
%span.badge.baseline= @procedure.revisions.size - 1
Modifications
%p.card-admin-subtitle Historique des modifications du formulaire
%p.button Voir
%h2.procedure-admin-explanation Pour aller plus loin %h2.procedure-admin-explanation Pour aller plus loin
.procedure-grid .procedure-grid

View file

@ -105,9 +105,5 @@ Rails.application.configure do
# Uncomment if you wish to allow Action Cable access from any origin. # Uncomment if you wish to allow Action Cable access from any origin.
# config.action_cable.disable_request_forgery_protection = true # config.action_cable.disable_request_forgery_protection = true
if ENV['IGN_CARTE_REFERER']
config.hosts << ENV['IGN_CARTE_REFERER']
end
config.hosts << ENV.fetch("APP_HOST") config.hosts << ENV.fetch("APP_HOST")
end end

View file

@ -56,7 +56,7 @@ en:
mentions_legales: mentions_legales:
label: "Legal notices" label: "Legal notices"
title: "Legal notices" title: "Legal notices"
url: "https//doc.demarches-simplifiees.fr/mentions-legales" url: "https://doc.demarches-simplifiees.fr/mentions-legales"
newsletter: newsletter:
label: "Newsletter" label: "Newsletter"
title: "Notre newsletter" title: "Notre newsletter"

View file

@ -56,7 +56,7 @@ fr:
mentions_legales: mentions_legales:
label: "Mentions légales" label: "Mentions légales"
title: "Mentions légales" title: "Mentions légales"
url: "https//doc.demarches-simplifiees.fr/mentions-legales" url: "https://doc.demarches-simplifiees.fr/mentions-legales"
newsletter: newsletter:
label: "Newsletter" label: "Newsletter"
title: "Notre newsletter" title: "Notre newsletter"

View file

@ -3,47 +3,47 @@ fr:
revision_changes: revision_changes:
attestation_template: attestation_template:
add: Un model dattestation à été ajouté add: Un model dattestation à été ajouté
update_title: Le titre de lattestation à été modifié. Le nouveau titre est « %{to} » update_title: Le titre de lattestation à été modifié. Le nouveau titre est « %{to} »
update_body: Le corps du document de lattestation à été modifié update_body: Le corps du document de lattestation à été modifié
update_footer: Le pied de page de lattestation à été modifié update_footer: Le pied de page de lattestation à été modifié
update_logo: Le logo de lattestation à été modifié. Le nouveau logo est « %{to} » update_logo: Le logo de lattestation à été modifié. Le nouveau logo est « %{to} »
update_signature: La signature de lattestation à été modifié. La nouvelle signature est « %{to} » update_signature: La signature de lattestation à été modifié. La nouvelle signature est « %{to} »
has_changes: Modifications en cours (appliqué à la prochaine publication) has_changes: Modifications en cours (appliqué à la prochaine publication)
add: Le champ « %{label} » a été ajouté add: Le champ « %{label} » a été ajouté
remove: Le champ « %{label} » a été supprimé remove: Le champ « %{label} » a été supprimé
move: move:
one: La position dun champ a été modifiée one: La position dun champ a été modifiée
other: Les positions de %{count} champs ont été modifiées other: Les positions de %{count} champs ont été modifiées
update_libelle: Le libellé du champ « %{label} » a été modifié. Le nouveau libellé est « %{to} » update_libelle: Le libellé du champ « %{label} » a été modifié. Le nouveau libellé est « %{to} »
update_description: La description du champ « %{label} » a été modifiée. La nouvelle description est « %{to} » update_description: La description du champ « %{label} » a été modifiée. La nouvelle description est « %{to} »
update_drop_down_secondary_libelle: Le libellé secondaire du champ « %{label} » a été modifié. Le nouveau libellé est « %{to} » update_drop_down_secondary_libelle: Le libellé secondaire du champ « %{label} » a été modifié. Le nouveau libellé est « %{to} »
update_drop_down_secondary_description: La description secondaire du champ « %{label} » a été modifiée. La nouvelle description est « %{to} » update_drop_down_secondary_description: La description secondaire du champ « %{label} » a été modifiée. La nouvelle description est « %{to} »
update_type_champ: Le type du champ « %{label} » a été modifié. Il est maintenant de type « %{to} » update_type_champ: Le type du champ « %{label} » a été modifié. Il est maintenant de type « %{to} »
update_mandatory: update_mandatory:
enabled: Le champ « %{label} » est maintenant obligatoire enabled: Le champ « %{label} » est maintenant obligatoire
disabled: Le champ « %{label} » nest plus obligatoire disabled: Le champ « %{label} » nest plus obligatoire
update_piece_justificative_template: Le modèle de pièce justificative du champ « %{label} » a été modifié update_piece_justificative_template: Le modèle de pièce justificative du champ « %{label} » a été modifié
update_drop_down_options: Les options de sélection du champ « %{label} » ont été modifiées update_drop_down_options: Les options de sélection du champ « %{label} » ont été modifiées
update_drop_down_other: update_drop_down_other:
enabled: Le champ « %{label} » comporte maintenant un choix « Autre » enabled: Le champ « %{label} » comporte maintenant un choix « Autre »
disabled: Le champ « %{label} » ne comporte plus de choix « Autre » disabled: Le champ « %{label} » ne comporte plus de choix « Autre »
update_carte_layers: Les référentiels cartographiques du champ « %{label} » ont été modifiés update_carte_layers: Les référentiels cartographiques du champ « %{label} » ont été modifiés
add_private: Lannotation privée « %{label} » a été ajoutée add_private: Lannotation privée « %{label} » a été ajoutée
remove_private: Lannotation privée « %{label} » a été supprimée remove_private: Lannotation privée « %{label} » a été supprimée
move_private: move_private:
one: La position dune annotation privée a été modifiée one: La position dune annotation privée a été modifiée
other: Les positions de %{count} annotations privées ont été modifiées other: Les positions de %{count} annotations privées ont été modifiées
update_libelle_private: Le libellé de lannotation privée « %{label} » a été modifié. Le nouveau libellé est « %{to} » update_libelle_private: Le libellé de lannotation privée « %{label} » a été modifié. Le nouveau libellé est « %{to} »
update_description_private: La description de lannotation privée « %{label} » a été modifiée. La nouvelle description est « %{to} » update_description_private: La description de lannotation privée « %{label} » a été modifiée. La nouvelle description est « %{to} »
update_drop_down_secondary_libelle_private: Le libellé secondaire de lannotation « %{label} » a été modifié. Le nouveau libellé est « %{to} » update_drop_down_secondary_libelle_private: Le libellé secondaire de lannotation « %{label} » a été modifié. Le nouveau libellé est « %{to} »
update_drop_down_secondary_description_private: La description secondaire de lannotation « %{label} » a été modifiée. La nouvelle description est « %{to} » update_drop_down_secondary_description_private: La description secondaire de lannotation « %{label} » a été modifiée. La nouvelle description est « %{to} »
update_type_champ_private: Le type de lannotation privée « %{label} » a été modifié. Elle est maintenant de type « %{to} » update_type_champ_private: Le type de lannotation privée « %{label} » a été modifié. Elle est maintenant de type « %{to} »
update_mandatory_private: update_mandatory_private:
enabled: Lannotation privée « %{label} » est maintenant obligatoire enabled: Lannotation privée « %{label} » est maintenant obligatoire
disabled: Lannotation privée « %{label} » nest plus obligatoire disabled: Lannotation privée « %{label} » nest plus obligatoire
update_piece_justificative_template_private: Le modèle de pièce justificative de lannotation privée « %{label} » a été modifié update_piece_justificative_template_private: Le modèle de pièce justificative de lannotation privée « %{label} » a été modifié
update_drop_down_options_private: Les options de sélection de lannotation privée « %{label} » ont été modifiées update_drop_down_options_private: Les options de sélection de lannotation privée « %{label} » ont été modifiées
update_carte_layers_private: Les référentiels cartographiques de lannotation privée « %{label} » ont été modifiés update_carte_layers_private: Les référentiels cartographiques de lannotation privée « %{label} » ont été modifiés
add_option: "ajoutés : %{items}" add_option: "ajoutés : %{items}"
remove_option: "supprimés : %{items}" remove_option: "supprimés : %{items}"
carte_layers: carte_layers:

View file

@ -408,6 +408,7 @@ Rails.application.routes.draw do
get 'apercu' get 'apercu'
get 'champs' get 'champs'
get 'annotations' get 'annotations'
get 'modifications'
get 'monavis' get 'monavis'
patch 'update_monavis' patch 'update_monavis'
get 'jeton' get 'jeton'

View file

@ -3,21 +3,19 @@ namespace :after_party do
task process_expired_dossiers_en_construction: :environment do task process_expired_dossiers_en_construction: :environment do
puts "Running deploy task 'process_expired_dossiers_en_construction'" puts "Running deploy task 'process_expired_dossiers_en_construction'"
if ENV['APP_NAME'] == 'tps' dossiers_close_to_expiration = Dossier
dossiers_close_to_expiration = Dossier .en_construction_close_to_expiration
.en_construction_close_to_expiration .without_en_construction_expiration_notice_sent
.without_en_construction_expiration_notice_sent
ExpiredDossiersDeletionService.send_expiration_notices(dossiers_close_to_expiration) ExpiredDossiersDeletionService.send_expiration_notices(dossiers_close_to_expiration, :en_construction_close_to_expiration_notice_sent_at)
BATCH_SIZE = 1000 BATCH_SIZE = 1000
((dossiers_close_to_expiration.count / BATCH_SIZE).ceil + 1).times do |n| ((dossiers_close_to_expiration.count / BATCH_SIZE).ceil + 1).times do |n|
dossiers_close_to_expiration dossiers_close_to_expiration
.offset(n * BATCH_SIZE) .offset(n * BATCH_SIZE)
.limit(BATCH_SIZE) .limit(BATCH_SIZE)
.update_all(en_construction_close_to_expiration_notice_sent_at: Time.zone.now + n.days) .update_all(en_construction_close_to_expiration_notice_sent_at: Time.zone.now + n.days)
end
end end
# Update task as completed. If you remove the line below, the task will # Update task as completed. If you remove the line below, the task will

View file

@ -6,7 +6,7 @@ namespace :after_party do
dossiers_termines = Dossier.state_termine dossiers_termines = Dossier.state_termine
progress = ProgressReport.new(dossiers_termines.count) progress = ProgressReport.new(dossiers_termines.count)
dossiers_termines.find_each do |dossier| dossiers_termines.find_each do |dossier|
dossier.traitements.create!(state: dossier.state, motivation: dossier.motivation, processed_at: dossier.processed_at) dossier.traitements.find_or_create_by!(state: dossier.state, motivation: dossier.motivation, processed_at: dossier.processed_at)
progress.inc progress.inc
end end
progress.finish progress.finish

View file

@ -18,7 +18,7 @@ namespace :after_party do
geometry_collections.find_each do |geometry_collection| geometry_collections.find_each do |geometry_collection|
geometry_collection.geometry['geometries'].each do |geometry| geometry_collection.geometry['geometries'].each do |geometry|
if valid_geometry?(geometry) if valid_geometry?(geometry)
geometry_collection.champ.geo_areas.create!(geometry: geometry, source: 'selection_utilisateur') geometry_collection.champ.geo_areas.find_or_create_by!(geometry: geometry, source: 'selection_utilisateur')
end end
end end
@ -36,7 +36,7 @@ namespace :after_party do
} }
if valid_geometry?(geometry) if valid_geometry?(geometry)
multi_line_string.champ.geo_areas.create!(geometry: geometry, source: 'selection_utilisateur') multi_line_string.champ.geo_areas.find_or_create_by!(geometry: geometry, source: 'selection_utilisateur')
end end
end end
@ -54,7 +54,7 @@ namespace :after_party do
} }
if valid_geometry?(geometry) if valid_geometry?(geometry)
multi_polygon.champ.geo_areas.create!(geometry: geometry, source: 'selection_utilisateur') multi_polygon.champ.geo_areas.find_or_create_by!(geometry: geometry, source: 'selection_utilisateur')
end end
end end