feat(procedure): hide as template

This commit is contained in:
seb-by-ouidou 2023-07-21 14:15:25 +00:00
parent a4b8ad8f3c
commit 0d2cd0fe5d
14 changed files with 120 additions and 8 deletions

View file

@ -79,6 +79,7 @@ module Administrateurs
significant_procedure_ids = Procedure significant_procedure_ids = Procedure
.publiees_ou_closes .publiees_ou_closes
.where(hidden_at_as_template: nil)
.where('unaccent(libelle) ILIKE unaccent(?)', "%#{query}%") .where('unaccent(libelle) ILIKE unaccent(?)', "%#{query}%")
.joins(:dossiers) .joins(:dossiers)
.group("procedures.id") .group("procedures.id")
@ -384,6 +385,7 @@ module Administrateurs
end end
def all def all
params[:hidden_at_as_template] = nil
@filter = ProceduresFilter.new(current_administrateur, params) @filter = ProceduresFilter.new(current_administrateur, params)
all_procedures = filter_procedures(@filter).map { |p| ProcedureDetail.new(p) } all_procedures = filter_procedures(@filter).map { |p| ProcedureDetail.new(p) }
@ -400,9 +402,10 @@ module Administrateurs
end end
def administrateurs def administrateurs
params[:hidden_at_as_template] = nil
@filter = ProceduresFilter.new(current_administrateur, params) @filter = ProceduresFilter.new(current_administrateur, params)
pids = AdministrateursProcedure.select(:administrateur_id).where(procedure: filter_procedures(@filter).map { |p| p["id"] }) pids = AdministrateursProcedure.select(:administrateur_id).where(procedure: filter_procedures(@filter).map { |p| p["id"] })
@admins = Administrateur.includes(:user, :procedures).where(id: pids) @admins = Administrateur.includes(:user, :procedures).where(id: pids, procedures: { hidden_at_as_template: nil })
@admins = @admins.where('unaccent(users.email) ILIKE unaccent(?)', "%#{@filter.email}%") if @filter.email.present? @admins = @admins.where('unaccent(users.email) ILIKE unaccent(?)', "%#{@filter.email}%") if @filter.email.present?
@admins = paginate(@admins, 'users.email') @admins = paginate(@admins, 'users.email')
end end
@ -417,6 +420,7 @@ module Administrateurs
procedures_result = Procedure.select(:id).left_joins(:procedures_zones).distinct.publiees_ou_closes procedures_result = Procedure.select(:id).left_joins(:procedures_zones).distinct.publiees_ou_closes
procedures_result = procedures_result.where(procedures_zones: { zone_id: filter.zone_ids }) if filter.zone_ids.present? procedures_result = procedures_result.where(procedures_zones: { zone_id: filter.zone_ids }) if filter.zone_ids.present?
procedures_result = procedures_result.where(hidden_at_as_template: nil) if filter.only_not_hidden_as_template?
procedures_result = procedures_result.where(aasm_state: filter.statuses) if filter.statuses.present? procedures_result = procedures_result.where(aasm_state: filter.statuses) if filter.statuses.present?
procedures_result = procedures_result.where("tags @> ARRAY[?]::text[]", filter.tags) if filter.tags.present? procedures_result = procedures_result.where("tags @> ARRAY[?]::text[]", filter.tags) if filter.tags.present?
procedures_result = procedures_result.where('published_at >= ?', filter.from_publication_date) if filter.from_publication_date.present? procedures_result = procedures_result.where('published_at >= ?', filter.from_publication_date) if filter.from_publication_date.present?

View file

@ -27,6 +27,18 @@ module Manager
redirect_to manager_procedure_path(procedure) redirect_to manager_procedure_path(procedure)
end end
def hide_as_template
procedure.hide_as_template!
flash[:notice] = "Démarche non visible dans les modèles."
redirect_to manager_procedure_path(procedure)
end
def unhide_as_template
procedure.unhide_as_template!
flash[:notice] = "Démarche visible dans les modèles."
redirect_to manager_procedure_path(procedure)
end
def discard def discard
procedure.discard_and_keep_track!(current_super_admin) procedure.discard_and_keep_track!(current_super_admin)

View file

@ -5,8 +5,9 @@ class DubiousProcedureDashboard < Administrate::BaseDashboard
id: Field::Number, id: Field::Number,
libelle: Field::String, libelle: Field::String,
dubious_champs: Field::String, dubious_champs: Field::String,
aasm_state: Field::String aasm_state: Field::String,
hidden_at_as_template: Field::DateTime.with_options(format: "%d/%m/%Y")
}.freeze }.freeze
COLLECTION_ATTRIBUTES = [:id, :libelle, :dubious_champs, :aasm_state].freeze COLLECTION_ATTRIBUTES = [:id, :libelle, :dubious_champs, :aasm_state, :hidden_at_as_template].freeze
COLLECTION_FILTERS = {}.freeze COLLECTION_FILTERS = {}.freeze
end end

View file

@ -29,6 +29,7 @@ class ProcedureDashboard < Administrate::BaseDashboard
hidden_at: Field::DateTime, hidden_at: Field::DateTime,
closed_at: Field::DateTime, closed_at: Field::DateTime,
whitelisted_at: Field::DateTime, whitelisted_at: Field::DateTime,
hidden_at_as_template: Field::DateTime,
service: Field::BelongsTo, service: Field::BelongsTo,
initiated_mail_template: MailTemplateField, initiated_mail_template: MailTemplateField,
received_mail_template: MailTemplateField, received_mail_template: MailTemplateField,
@ -80,6 +81,7 @@ class ProcedureDashboard < Administrate::BaseDashboard
:published_at, :published_at,
:whitelisted_at, :whitelisted_at,
:hidden_at, :hidden_at,
:hidden_at_as_template,
:closed_at, :closed_at,
:unpublished_at, :unpublished_at,
:published_types_de_champ_public, :published_types_de_champ_public,

View file

@ -2,7 +2,7 @@ class DubiousProcedure
extend ActiveModel::Naming extend ActiveModel::Naming
extend ActiveModel::Translation extend ActiveModel::Translation
attr_accessor :id, :libelle, :dubious_champs, :aasm_state attr_accessor :id, :libelle, :dubious_champs, :aasm_state, :hidden_at_as_template
FORBIDDEN_KEYWORDS = [ FORBIDDEN_KEYWORDS = [
'NIR', 'RNIPP', 'race', 'religion', 'RIB', 'NIR', 'RNIPP', 'race', 'religion', 'RIB',
@ -19,7 +19,7 @@ class DubiousProcedure
def self.all def self.all
procedures_with_forbidden_tdcs_sql = TypeDeChamp procedures_with_forbidden_tdcs_sql = TypeDeChamp
.joins(:procedure) .joins(:procedure)
.select("string_agg(types_de_champ.libelle, ' - ') as dubious_champs, procedures.id as procedure_id, procedures.libelle as procedure_libelle, procedures.aasm_state as procedure_aasm_state") .select("string_agg(types_de_champ.libelle, ' - ') as dubious_champs, procedures.id as procedure_id, procedures.libelle as procedure_libelle, procedures.aasm_state as procedure_aasm_state, procedures.hidden_at_as_template as procedure_hidden_at_as_template")
.where("unaccent(types_de_champ.libelle) ~* unaccent(?)", forbidden_regexp) .where("unaccent(types_de_champ.libelle) ~* unaccent(?)", forbidden_regexp)
.where(type_champ: [TypeDeChamp.type_champs.fetch(:text), TypeDeChamp.type_champs.fetch(:textarea)]) .where(type_champ: [TypeDeChamp.type_champs.fetch(:text), TypeDeChamp.type_champs.fetch(:textarea)])
.where(procedures: { closed_at: nil, whitelisted_at: nil }) .where(procedures: { closed_at: nil, whitelisted_at: nil })
@ -33,6 +33,7 @@ class DubiousProcedure
p.dubious_champs = procedure["dubious_champs"] p.dubious_champs = procedure["dubious_champs"]
p.libelle = procedure["procedure_libelle"] p.libelle = procedure["procedure_libelle"]
p.aasm_state = procedure["procedure_aasm_state"] p.aasm_state = procedure["procedure_aasm_state"]
p.hidden_at_as_template = procedure["procedure_hidden_at_as_template"]
p p
end end
end end

View file

@ -604,6 +604,19 @@ class Procedure < ApplicationRecord
whitelisted_at.present? whitelisted_at.present?
end end
def hidden_as_template?
hidden_at_as_template.present?
end
def hide_as_template!
touch(:hidden_at_as_template)
end
def unhide_as_template!
self.hidden_at_as_template = nil
save
end
def total_dossier def total_dossier
self.dossiers.state_not_brouillon.size self.dossiers.state_not_brouillon.size
end end

View file

@ -5,7 +5,7 @@ class ProceduresFilter
def initialize(admin, params) def initialize(admin, params)
@admin = admin @admin = admin
@params = params.permit(:page, :libelle, :email, :from_publication_date, :service_siret, tags: [], zone_ids: [], statuses: []) @params = params.permit(:page, :libelle, :email, :from_publication_date, :hidden_at_as_template, :service_siret, tags: [], zone_ids: [], statuses: [])
end end
def admin_zones def admin_zones
@ -36,6 +36,10 @@ class ProceduresFilter
params[:service_siret].presence params[:service_siret].presence
end end
def only_not_hidden_as_template?
params.key?(:hidden_at_as_template) && params[:hidden_at_as_template].nil?
end
def from_publication_date def from_publication_date
return if params[:from_publication_date].blank? return if params[:from_publication_date].blank?

View file

@ -42,7 +42,7 @@
%td %td
%button.fr-icon-add-line.fr-icon--sm.fr-mr-1w.fr-mb-1w.fr-text-action-high--blue-france{ 'aria-hidden': 'true', 'data-expand-target': 'icon' } %button.fr-icon-add-line.fr-icon--sm.fr-mr-1w.fr-mb-1w.fr-text-action-high--blue-france{ 'aria-hidden': 'true', 'data-expand-target': 'icon' }
%td= admin.email %td= admin.email
%td= admin.procedures.count %td= admin.procedures.size
%td= l(admin.created_at, format: :message_date_without_time) %td= l(admin.created_at, format: :message_date_without_time)
%tr.hidden{ 'data-expand-target': 'content' } %tr.hidden{ 'data-expand-target': 'content' }
%td.fr-highlight--beige-gris-galet{ colspan: '6' } %td.fr-highlight--beige-gris-galet{ colspan: '6' }

View file

@ -41,6 +41,12 @@ as well as a link to its edit page.
<%= link_to 'whitelister', whitelist_manager_procedure_path(procedure), method: :post, class: 'button' %> <%= link_to 'whitelister', whitelist_manager_procedure_path(procedure), method: :post, class: 'button' %>
<% end %> <% end %>
<% if procedure.hidden_as_template? %>
<%= link_to 'autoriser l\'affichage dans les modèles', unhide_as_template_manager_procedure_path(procedure), method: :post, class: 'button' %>
<% else %>
<%= link_to 'masquer l\'affichage dans les modèles', hide_as_template_manager_procedure_path(procedure), method: :post, class: 'button' %>
<% end %>
<% if procedure.can_be_deleted_by_manager? %> <% if procedure.can_be_deleted_by_manager? %>
<%= link_to 'Supprimer la démarche', discard_manager_procedure_path(procedure), method: :post, class: 'button', data: { confirm: "Confirmez-vous la suppression de la démarche ?" } %> <%= link_to 'Supprimer la démarche', discard_manager_procedure_path(procedure), method: :post, class: 'button', data: { confirm: "Confirmez-vous la suppression de la démarche ?" } %>
<% elsif procedure.discarded? %> <% elsif procedure.discarded? %>

View file

@ -12,6 +12,8 @@ Rails.application.routes.draw do
namespace :manager do namespace :manager do
resources :procedures, only: [:index, :show, :edit, :update] do resources :procedures, only: [:index, :show, :edit, :update] do
post 'whitelist', on: :member post 'whitelist', on: :member
post 'hide_as_template', on: :member
post 'unhide_as_template', on: :member
post 'draft', on: :member post 'draft', on: :member
post 'discard', on: :member post 'discard', on: :member
post 'restore', on: :member post 'restore', on: :member

View file

@ -0,0 +1,5 @@
class AddHiddenAtAsTemplateToProcedure < ActiveRecord::Migration[6.1]
def change
add_column :procedures, :hidden_at_as_template, :datetime
end
end

View file

@ -10,7 +10,7 @@
# #
# It's strongly recommended that you check this file into your version control system. # It's strongly recommended that you check this file into your version control system.
ActiveRecord::Schema[7.0].define(version: 2023_07_18_113920) do ActiveRecord::Schema[7.0].define(version: 2023_08_14_091648) do
# These are extensions that must be enabled in order to support this database # These are extensions that must be enabled in order to support this database
enable_extension "pgcrypto" enable_extension "pgcrypto"
enable_extension "plpgsql" enable_extension "plpgsql"
@ -754,6 +754,7 @@ ActiveRecord::Schema[7.0].define(version: 2023_07_18_113920) do
t.boolean "experts_require_administrateur_invitation", default: false t.boolean "experts_require_administrateur_invitation", default: false
t.boolean "for_individual", default: false t.boolean "for_individual", default: false
t.datetime "hidden_at", precision: 6 t.datetime "hidden_at", precision: 6
t.datetime "hidden_at_as_template", precision: 6
t.boolean "instructeurs_self_management_enabled" t.boolean "instructeurs_self_management_enabled"
t.boolean "juridique_required", default: true t.boolean "juridique_required", default: true
t.string "libelle" t.string "libelle"

View file

@ -172,6 +172,19 @@ describe Administrateurs::ProceduresController, type: :controller do
end end
end end
context 'only_not_hidden_as_template' do
let!(:procedure1) { create(:procedure, :published) }
let!(:procedure2) { create(:procedure, :published, hidden_at_as_template: Time.zone.now) }
let!(:procedure3) { create(:procedure, :published) }
it 'display only procedures which are not hidden as template' do
get :all
expect(assigns(:procedures).any? { |p| p.id == procedure1.id }).to be_truthy
expect(assigns(:procedures).any? { |p| p.id == procedure2.id }).to be_falsey
expect(assigns(:procedures).any? { |p| p.id == procedure3.id }).to be_truthy
end
end
context 'with specific service' do context 'with specific service' do
let(:requested_siret) { '13001501900024' } let(:requested_siret) { '13001501900024' }
let(:another_siret) { '11000004900012' } let(:another_siret) { '11000004900012' }
@ -233,6 +246,7 @@ describe Administrateurs::ProceduresController, type: :controller do
describe 'GET #administrateurs' do describe 'GET #administrateurs' do
let!(:draft_procedure) { create(:procedure, administrateur: admin3) } let!(:draft_procedure) { create(:procedure, administrateur: admin3) }
let!(:published_procedure) { create(:procedure_with_dossiers, :published, dossiers_count: 2, administrateur: admin1) } let!(:published_procedure) { create(:procedure_with_dossiers, :published, dossiers_count: 2, administrateur: admin1) }
let!(:antoher_published_procedure_for_admin1) { create(:procedure_with_dossiers, :published, dossiers_count: 2, administrateur: admin1) }
let!(:antoher_published_procedure) { create(:procedure_with_dossiers, :published, dossiers_count: 2, administrateur: admin4) } let!(:antoher_published_procedure) { create(:procedure_with_dossiers, :published, dossiers_count: 2, administrateur: admin4) }
let!(:closed_procedure) { create(:procedure, :closed, administrateur: admin2) } let!(:closed_procedure) { create(:procedure, :closed, administrateur: admin2) }
let(:admin1) { create(:administrateur, email: 'jesuis.surmene@education.gouv.fr') } let(:admin1) { create(:administrateur, email: 'jesuis.surmene@education.gouv.fr') }
@ -257,6 +271,24 @@ describe Administrateurs::ProceduresController, type: :controller do
expect(assigns(:admins)).not_to include(admin4) expect(assigns(:admins)).not_to include(admin4)
end end
end end
context 'only_not_hidden_as_template' do
before do
published_procedure.update(hidden_at_as_template: Time.zone.now)
closed_procedure.update(hidden_at_as_template: Time.zone.now)
antoher_published_procedure.update(hidden_at_as_template: Time.zone.now)
end
it 'displays admins of the procedures' do
get :administrateurs
expect(assigns(:admins)).to include(admin1)
expect(assigns(:admins)).not_to include(admin2)
expect(assigns(:admins)).not_to include(admin4)
expect(assigns(:admins)).not_to include(admin3)
expect(assigns(:admins)[0].procedures).not_to include(published_procedure)
expect(assigns(:admins)[0].procedures).to include(antoher_published_procedure_for_admin1)
end
end
end end
describe 'POST #search' do describe 'POST #search' do
@ -306,6 +338,7 @@ describe Administrateurs::ProceduresController, type: :controller do
describe 'searching' do describe 'searching' do
let!(:matching_procedure) { create(:procedure_with_dossiers, :published, dossiers_count: 2, libelle: 'éléctriCITE') } let!(:matching_procedure) { create(:procedure_with_dossiers, :published, dossiers_count: 2, libelle: 'éléctriCITE') }
let!(:unmatching_procedure_cause_hidden_as_template) { create(:procedure_with_dossiers, :published, dossiers_count: 2, libelle: 'éléctriCITE', hidden_at_as_template: Time.zone.now) }
let!(:unmatching_procedure) { create(:procedure_with_dossiers, :published, dossiers_count: 2, libelle: 'temoin') } let!(:unmatching_procedure) { create(:procedure_with_dossiers, :published, dossiers_count: 2, libelle: 'temoin') }
let(:query) { 'ELECTRIcité' } let(:query) { 'ELECTRIcité' }
@ -314,6 +347,11 @@ describe Administrateurs::ProceduresController, type: :controller do
expect(response_procedures).to include(matching_procedure) expect(response_procedures).to include(matching_procedure)
expect(response_procedures).not_to include(unmatching_procedure) expect(response_procedures).not_to include(unmatching_procedure)
end end
it 'hide procedure if it is hidden as template' do
expect(response_procedures).to include(matching_procedure)
expect(response_procedures).not_to include(unmatching_procedure_cause_hidden_as_template)
end
end end
end end

View file

@ -15,6 +15,28 @@ describe Manager::ProceduresController, type: :controller do
it { expect(procedure.whitelisted?).to be_truthy } it { expect(procedure.whitelisted?).to be_truthy }
end end
describe '#hide_as_template' do
let(:procedure) { create(:procedure) }
before do
post :hide_as_template, params: { id: procedure.id }
procedure.reload
end
it { expect(procedure.hidden_as_template?).to be_truthy }
end
describe '#unhide_as_template' do
let(:procedure) { create(:procedure) }
before do
post :unhide_as_template, params: { id: procedure.id }
procedure.reload
end
it { expect(procedure.hidden_as_template?).to be_falsey }
end
describe '#show' do describe '#show' do
render_views render_views
@ -25,6 +47,7 @@ describe Manager::ProceduresController, type: :controller do
end end
it { expect(response.body).to include('sub type de champ') } it { expect(response.body).to include('sub type de champ') }
it { expect(response.body).to include('Hidden At As Template') }
end end
describe '#discard' do describe '#discard' do