Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 3 additions & 2 deletions app/controllers/administrateurs/procedures_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -325,7 +325,7 @@ def publication
end

def check_path
path = params[:path]
path = publish_params[:path]
@path_available = @procedure.path_available?(path)
@other_procedure = @procedure.other_procedure_with_path(path)

Expand Down Expand Up @@ -631,6 +631,7 @@ def procedure_params
:procedure_expires_when_termine_enabled,
:rdv_enabled,
:pro_connect_restricted,
:robots_indexable,
{ zone_ids: [], procedure_tag_names: [] }
]

Expand All @@ -654,7 +655,7 @@ def procedure_params
end

def publish_params
params.permit(:path, :lien_site_web)
params.require(:procedure).permit(:path, :lien_site_web, :robots_indexable)
end

def closing_params
Expand Down
4 changes: 3 additions & 1 deletion app/models/concerns/procedure_clone_concern.rb
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,8 @@ module ProcedureCloneConcern
'routing_alert',
'api_particulier_token',
'no_gender',
'pro_connect_restricted'
'pro_connect_restricted',
'robots_indexable'
]

NEW_MAX_DUREE_CONSERVATION = Expired::DEFAULT_DOSSIER_RENTENTION_IN_MONTH
Expand Down Expand Up @@ -181,6 +182,7 @@ def initialize_clone_defaults(procedure, admin)
procedure.template = false
procedure.labels = labels.map(&:dup)
procedure.routing_alert = false
procedure.robots_indexable = true
procedure
end

Expand Down
5 changes: 5 additions & 0 deletions app/views/administrateurs/procedures/_informations.html.haml
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,11 @@
.fr-fieldset__element
= render Dsfr::InputComponent.new(form: f, attribute: :lien_site_web, input_type: :text_field, opts: {}, required: false)

.fr-fieldset__element
= render Dsfr::ToggleComponent.new(form: f, target: :robots_indexable, extra_class_names: "fr-mt-2w",
title: "Cette démarche est référençable par les moteurs de recherche (Google, …) pour aider les usagers à la découvrir",
)

%fieldset.fr-fieldset
%legend.fr-fieldset__legend Cadre juridique
.fr-fieldset__element
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
= form_for procedure,
url: admin_procedure_publish_path(procedure_id: procedure.id),
method: :put,
html: { class: 'form' } do |f|
method: :put do |f|
= render Procedure::ErrorsSummary.new(procedure: @procedure, validation_context: :publication)
.mt-2
- if procedure.draft_changed?
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
<div class="fr-input-group">
<%= form.label :path, class: 'fr-label' do %>
<%= t('activerecord.attributes.procedure.procedure_path') %>
<span class="fr-hint-text"><%= t('activerecord.attributes.procedure.hints.procedure_path') %></span>
<% end %>

<div class="fr-input">
<div class="flex">
<span class="placeholder"><%= commencer_url(path: '') %></span>
<%= form.text_field(:path, value: procedure.suggested_path,
placeholder: t('activerecord.attributes.procedure.procedure_path_placeholder'),
required: true,
class: 'unstyled flex-1',
pattern: '[a-z0-9.\-_]{3,200}',
autocomplete: 'off',
data: { controller: 'turbo-input', turbo_input_url_value: admin_procedure_check_path_path }) %>
</div>
</div>

<div id="check_path"></div>
</div>

<div class="fr-input-group">
<%= form.label :lien_site_web, class: 'fr-label' do %>
<%= t('activerecord.attributes.procedure.lien_site_web') %>
<span class="fr-hint-text"><%= t('activerecord.attributes.procedure.hints.lien_site_web') %></span>
<% end %>
<%= form.text_field(:lien_site_web,
required: true,
class: 'fr-input',
autocomplete: 'off') %>
</div>

<div class="fr-input-group">
<%= render Dsfr::ToggleComponent.new(form:, target: :robots_indexable, extra_class_names: "fr-mt-4w",
title: "Cette démarche est référençable par les moteurs de recherche (Google, …) pour aider les usagers à la découvrir",
) %>
</div>

<% if closed_procedures.present? %>
<div class="fr-select-group">
<%= label_tag :old_procedure, class: 'fr-label' do %>
<%= t('activerecord.attributes.procedure.old_procedure') %>
<%= t('utils.no_mandatory') %>
<span class="fr-hint-text"><%= t('activerecord.attributes.procedure.hints.old_procedure') %></span>
<% end %>
<%= select_tag :old_procedure, options_for_select(@closed_procedures), include_blank: true, class: 'fr-select' %>
</div>
<% end %>
2 changes: 1 addition & 1 deletion app/views/administrateurs/procedures/edit.html.haml
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
= render NestedForms::FormOwnerComponent.new
= form_for @procedure,
url: url_for({ controller: 'administrateurs/procedures', action: :update, id: @procedure.id }),
html: { class: 'form procedure_tags_combo', multipart: true } do |f|
html: { class: 'procedure_tags_combo', multipart: true } do |f|
.fr-container
.fr-grid-row
.fr-col-12.fr-col-offset-md-2.fr-col-md-8
Expand Down
2 changes: 1 addition & 1 deletion app/views/administrateurs/procedures/new.html.haml
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
= render NestedForms::FormOwnerComponent.new
= form_for @procedure,
url: url_for({ controller: 'administrateurs/procedures', action: :create, id: @procedure.id }),
html: { class: 'form procedure_tags_combo', multipart: true } do |f|
html: { class: 'procedure_tags_combo', multipart: true } do |f|
.fr-container
.fr-grid-row
.fr-col-12.fr-col-offset-md-2.fr-col-md-8
Expand Down
1 change: 1 addition & 0 deletions app/views/commencer/show.html.haml
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
- content_for(:title, @procedure.libelle)
- content_for(:meta_robots, @procedure.publiee? && @procedure.robots_indexable? ? "index,follow" : "noindex,nofollow")

.commencer.form
- if !user_signed_in?
Expand Down
4 changes: 4 additions & 0 deletions app/views/layouts/application.html.herb
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,10 @@

<%= yield(:invisible_captcha_styles) %>
<%= render partial: 'layouts/setup_theme' %>

<% if content_for?(:meta_robots) %>
<meta name="robots" content="<%= content_for(:meta_robots) %>">
<% end %>
</head>
<body
id="<%= content_for(:page_id) %>"
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
# frozen_string_literal: true

class AddRobotsIndexableOnProcedures < ActiveRecord::Migration[7.2]
def change
add_column :procedures, :robots_indexable, :boolean, default: true, null: false
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Je comprends le raisonnement de mettre true pour le stock.

Tu te dis que de toutes façon les procédures dites privées/internes/confidentielles n'ont pas leur lien dispo sur internet et ne sont donc pas découvertes.

Et mm si qq liens étaient disponibles, notre configuration actuelle rend au moins le titre publique + lien vers la page indexé, donc on est déjà à moitié indexable par défaut (pas totalement remarque).

Je pense que cela peut surprendre les administrateurs des dites procédures de constater qu'elle sont passé par défaut en indexable.

A minima, il faudrait faire une comm pour que les admins puissent rapidement changer cette option.

end
end
3 changes: 2 additions & 1 deletion db/schema.rb
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
#
# It's strongly recommended that you check this file into your version control system.

ActiveRecord::Schema[7.1].define(version: 2025_09_22_200515) do
ActiveRecord::Schema[7.2].define(version: 2025_09_30_160810) do
# These are extensions that must be enabled in order to support this database
enable_extension "pg_buffercache"
enable_extension "pg_stat_statements"
Expand Down Expand Up @@ -1064,6 +1064,7 @@
t.bigint "published_revision_id"
t.boolean "rdv_enabled", default: false, null: false
t.bigint "replaced_by_procedure_id"
t.boolean "robots_indexable", default: true, null: false
t.boolean "routing_alert", default: false, null: false
t.boolean "routing_enabled"
t.bigint "service_id"
Expand Down
1 change: 0 additions & 1 deletion public/robots.txt
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@
#
# To ban all spiders from the entire site uncomment the next two lines:
User-agent: *
Disallow: /commencer*
Disallow: /rails/
Disallow: /super_admins/
Disallow: /manager/
Expand Down
43 changes: 23 additions & 20 deletions spec/controllers/administrateurs/procedures_controller_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -69,11 +69,17 @@
duree_conservation_dossiers_dans_ds: duree_conservation_dossiers_dans_ds,
monavis_embed: monavis_embed,
zone_ids: zone_ids,
lien_site_web: lien_site_web,
procedure_tag_names: ['Aao', 'Accompagnement']
}
}

let(:procedure_params_not_creatable) {
{
lien_site_web: lien_site_web,
robots_indexable: "0"
}
}

before do
sign_in(admin.user)
end
Expand Down Expand Up @@ -438,10 +444,8 @@
it 'is case insentivite and unaccented' do
expect(response_procedures).to include(matching_procedure)
expect(response_procedures).not_to include(unmatching_procedure)
end

it 'hide procedure if it is hidden as template' do
expect(response_procedures).to include(matching_procedure)
# hide procedure if it is hidden as template
expect(response_procedures).not_to include(unmatching_procedure_cause_hidden_as_template)
end
end
Expand Down Expand Up @@ -526,9 +530,8 @@
expect(subject.procedure_tags.pluck(:name)).to match_array(['Aao', 'Accompagnement'])
expect(response).to redirect_to(champs_admin_procedure_path(Procedure.last))
expect(flash[:notice]).to be_present
end

it "create generic labels" do
# creates generic labels
expect(subject.labels.size).to eq(5)
expect(subject.labels.first.name).to eq('À examiner')
end
Expand Down Expand Up @@ -569,24 +572,18 @@
context 'when many attributs are not valid' do
let(:libelle) { '' }
let(:description) { '' }
subject { post :create, params: { procedure: procedure_params } }

describe 'no new procedure in database' do
subject { post :create, params: { procedure: procedure_params } }

it { expect { subject }.to change { Procedure.count }.by(0) }
it do
expect { subject }.to change { Procedure.count }.by(0)
expect(flash[:alert]).to be_present
end

describe 'no new module api carto in database' do
it { expect { subject }.to change { ModuleAPICarto.count }.by(0) }
end
end

describe 'flash message is present' do
before do
post :create, params: { procedure: procedure_params }
end

it { expect(flash[:alert]).to be_present }
end
end
end

Expand All @@ -605,7 +602,7 @@

context 'when administrateur is connected' do
def update_procedure
put :update, params: { id: procedure.id, procedure: procedure_params.merge(procedure_expires_when_termine_enabled: true) }
put :update, params: { id: procedure.id, procedure: procedure_params.merge(procedure_params_not_creatable).merge(procedure_expires_when_termine_enabled: true) }
procedure.reload
end

Expand All @@ -627,6 +624,8 @@ def update_procedure
expect(subject.organisation).to eq(organisation)
expect(subject.duree_conservation_dossiers_dans_ds).to eq(duree_conservation_dossiers_dans_ds)
expect(subject.procedure_expires_when_termine_enabled).to eq(true)
expect(subject.lien_site_web).to eq(lien_site_web)
expect(subject.robots_indexable?).to eq(false)
end
end

Expand Down Expand Up @@ -1336,7 +1335,7 @@ def update_monavis

let(:procedure) { create(:procedure, :published, administrateur: admin) }

subject(:perform_request) { get :check_path, params: { procedure_id: procedure.id, path: path }, format: :turbo_stream }
subject(:perform_request) { get :check_path, params: { procedure_id: procedure.id, procedure: { path: } }, format: :turbo_stream }

context 'when path is not used' do
let(:path) { SecureRandom.uuid }
Expand Down Expand Up @@ -1466,8 +1465,9 @@ def update_monavis
let(:procedure2) { create(:procedure, :published, administrateur: admin, lien_site_web: lien_site_web) }
let(:procedure3) { create(:procedure, :published, :new_administrateur, lien_site_web: lien_site_web) }
let(:lien_site_web) { 'http://some.administration/' }
let(:robots_indexable) { "0" }

subject(:perform_request) { put :publish, params: { procedure_id: procedure.id, path: path, lien_site_web: lien_site_web } }
subject(:perform_request) { put :publish, params: { procedure_id: procedure.id, procedure: { path:, lien_site_web:, robots_indexable: } } }

context 'when admin is the owner of the procedure' do
context 'procedure path does not exist' do
Expand All @@ -1483,6 +1483,7 @@ def update_monavis
expect(procedure.publiee?).to be_truthy
expect(procedure.path).to eq(path)
expect(procedure.lien_site_web).to eq(lien_site_web)
expect(procedure.robots_indexable?).to be(false)

expect(response).to redirect_to(admin_procedure_confirmation_path(procedure))
end
Expand All @@ -1497,11 +1498,13 @@ def update_monavis

let(:path) { procedure2.path }
let(:lien_site_web) { 'http://mon-site.gouv.fr' }
let(:robots_indexable) { '1' }

it 'publishes the procedure, unpublishes the old one and redirects to confirmation page' do
expect(procedure.publiee?).to be_truthy
expect(procedure.path).to eq(path)
expect(procedure.lien_site_web).to eq(lien_site_web)
expect(procedure.robots_indexable?).to be(true)

expect(procedure2.depubliee?).to be_truthy

Expand Down
Loading
Loading