From 6257a0383c7af874936a10e0bc6c015820d769b2 Mon Sep 17 00:00:00 2001 From: Fred <98240+farnoux@users.noreply.github.com> Date: Tue, 25 Jun 2024 11:18:02 +0200 Subject: [PATCH 1/2] TDB: Fixe le filtre des indicateurs par plan action MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixe en supprimant la vérification de droits sur les axes liés aux indicateurs, qui est déjà faite sur la vue `indicateur_definitions`. --- .../sqitch/deploy/indicateur/detail.sql | 39 +-- .../deploy/indicateur/detail@v3.5.0.sql | 28 ++ .../sqitch/deploy/indicateur/filtre.sql | 218 +-------------- .../deploy/indicateur/filtre@v3.5.0.sql | 250 ++++++++++++++++++ .../sqitch/revert/indicateur/detail.sql | 3 +- .../revert/indicateur/detail@v3.5.0.sql | 27 ++ .../sqitch/revert/indicateur/filtre.sql | 206 +-------------- .../revert/indicateur/filtre@v3.5.0.sql | 235 ++++++++++++++++ data_layer/sqitch/sqitch.plan | 3 + .../verify/indicateur/detail@v3.5.0.sql | 9 + .../sqitch/verify/indicateur/filtre.sql | 10 - .../verify/indicateur/filtre@v3.5.0.sql | 17 ++ 12 files changed, 600 insertions(+), 445 deletions(-) create mode 100644 data_layer/sqitch/deploy/indicateur/detail@v3.5.0.sql create mode 100644 data_layer/sqitch/deploy/indicateur/filtre@v3.5.0.sql create mode 100644 data_layer/sqitch/revert/indicateur/detail@v3.5.0.sql create mode 100644 data_layer/sqitch/revert/indicateur/filtre@v3.5.0.sql create mode 100644 data_layer/sqitch/verify/indicateur/detail@v3.5.0.sql create mode 100644 data_layer/sqitch/verify/indicateur/filtre@v3.5.0.sql diff --git a/data_layer/sqitch/deploy/indicateur/detail.sql b/data_layer/sqitch/deploy/indicateur/detail.sql index e96ba6af9f..b302140591 100644 --- a/data_layer/sqitch/deploy/indicateur/detail.sql +++ b/data_layer/sqitch/deploy/indicateur/detail.sql @@ -4,24 +4,27 @@ BEGIN; create or replace view indicateur_definitions as -select c.id as collectivite_id, - definition.id as indicateur_id, - null::integer as indicateur_perso_id, - definition.nom as nom, - definition.description, - definition.unite -from collectivite c - cross join indicateur_definition definition -where is_authenticated() -union all -select definition.collectivite_id as collectivite_id, - null::indicateur_id as indicateur_id, - definition.id as indicateur_perso_id, - definition.titre, - definition.description, - definition.unite -from indicateur_personnalise_definition definition -where can_read_acces_restreint(collectivite_id); +SELECT * FROM ( + select c.id as collectivite_id, + definition.id as indicateur_id, + null::integer as indicateur_perso_id, + definition.nom as nom, + definition.description, + definition.unite + from collectivite c + cross join indicateur_definition definition + where is_authenticated() + union all + select definition.collectivite_id as collectivite_id, + null::indicateur_id as indicateur_id, + definition.id as indicateur_perso_id, + definition.titre, + definition.description, + definition.unite + from indicateur_personnalise_definition definition +) AS f +WHERE can_read_acces_restreint(f.collectivite_id); + comment on view indicateur_definitions is 'Les définitions des indicateurs prédéfinis et personnalisés'; diff --git a/data_layer/sqitch/deploy/indicateur/detail@v3.5.0.sql b/data_layer/sqitch/deploy/indicateur/detail@v3.5.0.sql new file mode 100644 index 0000000000..e96ba6af9f --- /dev/null +++ b/data_layer/sqitch/deploy/indicateur/detail@v3.5.0.sql @@ -0,0 +1,28 @@ +-- Deploy tet:indicateur/detail to pg + +BEGIN; + +create or replace view indicateur_definitions +as +select c.id as collectivite_id, + definition.id as indicateur_id, + null::integer as indicateur_perso_id, + definition.nom as nom, + definition.description, + definition.unite +from collectivite c + cross join indicateur_definition definition +where is_authenticated() +union all +select definition.collectivite_id as collectivite_id, + null::indicateur_id as indicateur_id, + definition.id as indicateur_perso_id, + definition.titre, + definition.description, + definition.unite +from indicateur_personnalise_definition definition +where can_read_acces_restreint(collectivite_id); +comment on view indicateur_definitions + is 'Les définitions des indicateurs prédéfinis et personnalisés'; + +COMMIT; diff --git a/data_layer/sqitch/deploy/indicateur/filtre.sql b/data_layer/sqitch/deploy/indicateur/filtre.sql index 5a10c9863e..c196948db6 100644 --- a/data_layer/sqitch/deploy/indicateur/filtre.sql +++ b/data_layer/sqitch/deploy/indicateur/filtre.sql @@ -2,51 +2,9 @@ BEGIN; -create or replace function - thematiques(indicateur_definitions) - returns setof thematique - language sql - security definer - stable -begin - atomic - select t.* - from ( - select thematique - from indicateur_definition definition - join thematique - on thematique.md_id = any (definition.thematiques) - where definition.id = $1.indicateur_id - union - select thematique - from indicateur_personnalise_definition definition - join indicateur_personnalise_thematique it - on definition.id = it.indicateur_id - join thematique on it.thematique_id = thematique.id - where definition.id = $1.indicateur_perso_id - ) t - where can_read_acces_restreint($1.collectivite_id); -end; -comment on function thematiques(indicateur_definitions) is - 'Les thématiques associées à un indicateur.'; - -create or replace function - definition_referentiel(indicateur_definitions) - returns setof indicateur_definition - rows 1 - language sql - security definer - stable -begin - atomic - select ist - from indicateur_definition ist - where ist.id = $1.indicateur_id - and is_authenticated(); -end; -comment on function definition_referentiel(indicateur_definitions) is - 'La définition de l''indicateur provenant du référentiel.'; - +-- Recrée la même fonction sans la vérification des droits +-- qui pose des problèmes de performance lors du `fetchFilteredIndicateurs` +-- (requête +30s qui timeout sur l'app) create or replace function axes(indicateur_definitions) @@ -73,178 +31,10 @@ begin -- indicateur perso or ($1.indicateur_perso_id is not null and fai.indicateur_personnalise_id = $1.indicateur_perso_id)) - and can_read_acces_restreint(axe.collectivite_id); + ; end; comment on function axes(indicateur_definitions) is 'Les axes (plans d''action) associés à un indicateur.'; -create or replace function - fiches_non_classees(indicateur_definitions) - returns setof fiche_action_indicateur - language sql - security definer - stable -begin - atomic - select fai - from fiche_action_indicateur fai - join fiche_action fa on fa.id = fai.fiche_id and fa.collectivite_id = $1.collectivite_id - left join definition_referentiel($1) def on true - where not exists (select from fiche_action_axe faa where faa.fiche_id = fai.fiche_id) - and ( - -- indicateur prédéfini - fai.indicateur_id = $1.indicateur_id - -- indicateur perso - or fai.indicateur_personnalise_id = $1.indicateur_perso_id - -- indicateur prédéfini dont les valeurs sont celles d'un autre - or def.valeur_indicateur = $1.indicateur_id - ) - and can_read_acces_restreint(fa.collectivite_id); -end; -comment on function fiches_non_classees(indicateur_definitions) is - 'Les fiches non classées (sans plan d''action) associées à un indicateur.'; - -create or replace function - pilotes(indicateur_definitions) - returns setof indicateur_pilote - language sql - security definer - stable -begin - atomic - select ip - from indicateur_pilote ip - left join definition_referentiel($1) def on true - where - -- indicateur prédéfini - (($1.indicateur_id is not null - and ip.indicateur_id = $1.indicateur_id - and collectivite_id = $1.collectivite_id) - -- indicateur prédéfini dont les valeurs sont celles d'un autre - or ($1.indicateur_id is not null - and ip.indicateur_id = def.valeur_indicateur - and collectivite_id = $1.collectivite_id) - -- indicateur perso - or ($1.indicateur_perso_id is not null - and ip.indicateur_perso_id = $1.indicateur_perso_id)) - and can_read_acces_restreint(ip.collectivite_id); -end; -comment on function pilotes(indicateur_definitions) is - 'Les personnes pilotes associées à un indicateur.'; - -create or replace function - personne(indicateur_pilote) - returns setof personne - rows 1 - language sql - security definer - stable -begin - atomic - select private.get_personne($1) - where can_read_acces_restreint($1.collectivite_id); -end; -comment on function personne(indicateur_pilote) is - 'Une personne associée comme personne pilote d''un indicateur.'; - -create or replace function - services(indicateur_definitions) - returns setof indicateur_service_tag - language sql - security definer - stable -begin - atomic - select ist - from indicateur_service_tag ist - left join definition_referentiel($1) def on true - where - -- indicateur prédéfini - (($1.indicateur_id is not null - and ist.indicateur_id = $1.indicateur_id - and collectivite_id = $1.collectivite_id) - -- indicateur prédéfini dont les valeurs sont celles d'un autre - or ($1.indicateur_id is not null - and ist.indicateur_id = def.valeur_indicateur - and collectivite_id = $1.collectivite_id) - -- indicateur perso - or ($1.indicateur_perso_id is not null - and ist.indicateur_perso_id = $1.indicateur_perso_id)) - and can_read_acces_restreint(ist.collectivite_id); -end; -comment on function services(indicateur_definitions) is - 'Les services associés à un indicateur.'; - - -create or replace function - definition_perso(indicateur_definitions) - returns setof indicateur_personnalise_definition - rows 1 - language sql - security definer - stable -begin - atomic - select ipd - from indicateur_personnalise_definition ipd - where ipd.id = $1.indicateur_perso_id - and can_read_acces_restreint(ipd.collectivite_id); -end; -comment on function definition_perso(indicateur_definitions) is - 'La définition de l''indicateur personnalisé.'; - - -create or replace function - enfants(indicateur_definitions) - returns setof indicateur_definitions - language sql - security definer - stable -begin - atomic - select $1.collectivite_id as collectivite_id, - definition.id as indicateur_id, - null::integer as indicateur_perso_id, - definition.nom as nom, - definition.description, - definition.unite - from indicateur_definition definition - where definition.parent = $1.indicateur_id - and is_authenticated(); -end; -comment on function enfants(indicateur_definitions) is - 'Définitions des indicateurs enfants d''un indicateur composé.'; - -create or replace function - enfants(indicateur_definition) - returns setof indicateur_definition - language sql - security definer - stable -begin - atomic - select def - from indicateur_definition def - where def.parent = $1.id - and is_authenticated(); -end; -comment on function enfants(indicateur_definition) is - 'Définitions des indicateurs enfants d''un indicateur composé.'; - -create or replace function - indicateur_action(indicateur_definitions) - returns setof indicateur_action - language sql - security definer - stable -begin - atomic - select ia - from indicateur_action ia - where ia.indicateur_id = $1.indicateur_id - and is_authenticated(); -end; -comment on function indicateur_action(indicateur_definitions) is - 'La relation entre un indicateur prédéfini et des actions des référentiels.'; COMMIT; diff --git a/data_layer/sqitch/deploy/indicateur/filtre@v3.5.0.sql b/data_layer/sqitch/deploy/indicateur/filtre@v3.5.0.sql new file mode 100644 index 0000000000..5a10c9863e --- /dev/null +++ b/data_layer/sqitch/deploy/indicateur/filtre@v3.5.0.sql @@ -0,0 +1,250 @@ +-- Deploy tet:indicateur/filtre to pg + +BEGIN; + +create or replace function + thematiques(indicateur_definitions) + returns setof thematique + language sql + security definer + stable +begin + atomic + select t.* + from ( + select thematique + from indicateur_definition definition + join thematique + on thematique.md_id = any (definition.thematiques) + where definition.id = $1.indicateur_id + union + select thematique + from indicateur_personnalise_definition definition + join indicateur_personnalise_thematique it + on definition.id = it.indicateur_id + join thematique on it.thematique_id = thematique.id + where definition.id = $1.indicateur_perso_id + ) t + where can_read_acces_restreint($1.collectivite_id); +end; +comment on function thematiques(indicateur_definitions) is + 'Les thématiques associées à un indicateur.'; + +create or replace function + definition_referentiel(indicateur_definitions) + returns setof indicateur_definition + rows 1 + language sql + security definer + stable +begin + atomic + select ist + from indicateur_definition ist + where ist.id = $1.indicateur_id + and is_authenticated(); +end; +comment on function definition_referentiel(indicateur_definitions) is + 'La définition de l''indicateur provenant du référentiel.'; + + +create or replace function + axes(indicateur_definitions) + returns setof axe + language sql + security definer + stable +begin + atomic + select axe + from fiche_action_indicateur fai + join fiche_action_axe faa using (fiche_id) + join axe on faa.axe_id = axe.id + left join definition_referentiel($1) def on true + where + -- indicateur prédéfini + (($1.indicateur_id is not null + and fai.indicateur_id = $1.indicateur_id + and collectivite_id = $1.collectivite_id) + -- indicateur prédéfini dont les valeurs sont celles d'un autre + or ($1.indicateur_id is not null + and fai.indicateur_id = def.valeur_indicateur + and collectivite_id = $1.collectivite_id) + -- indicateur perso + or ($1.indicateur_perso_id is not null + and fai.indicateur_personnalise_id = $1.indicateur_perso_id)) + and can_read_acces_restreint(axe.collectivite_id); +end; +comment on function axes(indicateur_definitions) is + 'Les axes (plans d''action) associés à un indicateur.'; + +create or replace function + fiches_non_classees(indicateur_definitions) + returns setof fiche_action_indicateur + language sql + security definer + stable +begin + atomic + select fai + from fiche_action_indicateur fai + join fiche_action fa on fa.id = fai.fiche_id and fa.collectivite_id = $1.collectivite_id + left join definition_referentiel($1) def on true + where not exists (select from fiche_action_axe faa where faa.fiche_id = fai.fiche_id) + and ( + -- indicateur prédéfini + fai.indicateur_id = $1.indicateur_id + -- indicateur perso + or fai.indicateur_personnalise_id = $1.indicateur_perso_id + -- indicateur prédéfini dont les valeurs sont celles d'un autre + or def.valeur_indicateur = $1.indicateur_id + ) + and can_read_acces_restreint(fa.collectivite_id); +end; +comment on function fiches_non_classees(indicateur_definitions) is + 'Les fiches non classées (sans plan d''action) associées à un indicateur.'; + +create or replace function + pilotes(indicateur_definitions) + returns setof indicateur_pilote + language sql + security definer + stable +begin + atomic + select ip + from indicateur_pilote ip + left join definition_referentiel($1) def on true + where + -- indicateur prédéfini + (($1.indicateur_id is not null + and ip.indicateur_id = $1.indicateur_id + and collectivite_id = $1.collectivite_id) + -- indicateur prédéfini dont les valeurs sont celles d'un autre + or ($1.indicateur_id is not null + and ip.indicateur_id = def.valeur_indicateur + and collectivite_id = $1.collectivite_id) + -- indicateur perso + or ($1.indicateur_perso_id is not null + and ip.indicateur_perso_id = $1.indicateur_perso_id)) + and can_read_acces_restreint(ip.collectivite_id); +end; +comment on function pilotes(indicateur_definitions) is + 'Les personnes pilotes associées à un indicateur.'; + +create or replace function + personne(indicateur_pilote) + returns setof personne + rows 1 + language sql + security definer + stable +begin + atomic + select private.get_personne($1) + where can_read_acces_restreint($1.collectivite_id); +end; +comment on function personne(indicateur_pilote) is + 'Une personne associée comme personne pilote d''un indicateur.'; + +create or replace function + services(indicateur_definitions) + returns setof indicateur_service_tag + language sql + security definer + stable +begin + atomic + select ist + from indicateur_service_tag ist + left join definition_referentiel($1) def on true + where + -- indicateur prédéfini + (($1.indicateur_id is not null + and ist.indicateur_id = $1.indicateur_id + and collectivite_id = $1.collectivite_id) + -- indicateur prédéfini dont les valeurs sont celles d'un autre + or ($1.indicateur_id is not null + and ist.indicateur_id = def.valeur_indicateur + and collectivite_id = $1.collectivite_id) + -- indicateur perso + or ($1.indicateur_perso_id is not null + and ist.indicateur_perso_id = $1.indicateur_perso_id)) + and can_read_acces_restreint(ist.collectivite_id); +end; +comment on function services(indicateur_definitions) is + 'Les services associés à un indicateur.'; + + +create or replace function + definition_perso(indicateur_definitions) + returns setof indicateur_personnalise_definition + rows 1 + language sql + security definer + stable +begin + atomic + select ipd + from indicateur_personnalise_definition ipd + where ipd.id = $1.indicateur_perso_id + and can_read_acces_restreint(ipd.collectivite_id); +end; +comment on function definition_perso(indicateur_definitions) is + 'La définition de l''indicateur personnalisé.'; + + +create or replace function + enfants(indicateur_definitions) + returns setof indicateur_definitions + language sql + security definer + stable +begin + atomic + select $1.collectivite_id as collectivite_id, + definition.id as indicateur_id, + null::integer as indicateur_perso_id, + definition.nom as nom, + definition.description, + definition.unite + from indicateur_definition definition + where definition.parent = $1.indicateur_id + and is_authenticated(); +end; +comment on function enfants(indicateur_definitions) is + 'Définitions des indicateurs enfants d''un indicateur composé.'; + +create or replace function + enfants(indicateur_definition) + returns setof indicateur_definition + language sql + security definer + stable +begin + atomic + select def + from indicateur_definition def + where def.parent = $1.id + and is_authenticated(); +end; +comment on function enfants(indicateur_definition) is + 'Définitions des indicateurs enfants d''un indicateur composé.'; + +create or replace function + indicateur_action(indicateur_definitions) + returns setof indicateur_action + language sql + security definer + stable +begin + atomic + select ia + from indicateur_action ia + where ia.indicateur_id = $1.indicateur_id + and is_authenticated(); +end; +comment on function indicateur_action(indicateur_definitions) is + 'La relation entre un indicateur prédéfini et des actions des référentiels.'; + +COMMIT; diff --git a/data_layer/sqitch/revert/indicateur/detail.sql b/data_layer/sqitch/revert/indicateur/detail.sql index 341f011fb6..e96ba6af9f 100644 --- a/data_layer/sqitch/revert/indicateur/detail.sql +++ b/data_layer/sqitch/revert/indicateur/detail.sql @@ -12,6 +12,7 @@ select c.id as collectivite_id, definition.unite from collectivite c cross join indicateur_definition definition +where is_authenticated() union all select definition.collectivite_id as collectivite_id, null::indicateur_id as indicateur_id, @@ -20,7 +21,7 @@ select definition.collectivite_id as collectivite_id, definition.description, definition.unite from indicateur_personnalise_definition definition -where have_edition_acces(collectivite_id); +where can_read_acces_restreint(collectivite_id); comment on view indicateur_definitions is 'Les définitions des indicateurs prédéfinis et personnalisés'; diff --git a/data_layer/sqitch/revert/indicateur/detail@v3.5.0.sql b/data_layer/sqitch/revert/indicateur/detail@v3.5.0.sql new file mode 100644 index 0000000000..341f011fb6 --- /dev/null +++ b/data_layer/sqitch/revert/indicateur/detail@v3.5.0.sql @@ -0,0 +1,27 @@ +-- Deploy tet:indicateur/detail to pg + +BEGIN; + +create or replace view indicateur_definitions +as +select c.id as collectivite_id, + definition.id as indicateur_id, + null::integer as indicateur_perso_id, + definition.nom as nom, + definition.description, + definition.unite +from collectivite c + cross join indicateur_definition definition +union all +select definition.collectivite_id as collectivite_id, + null::indicateur_id as indicateur_id, + definition.id as indicateur_perso_id, + definition.titre, + definition.description, + definition.unite +from indicateur_personnalise_definition definition +where have_edition_acces(collectivite_id); +comment on view indicateur_definitions + is 'Les définitions des indicateurs prédéfinis et personnalisés'; + +COMMIT; diff --git a/data_layer/sqitch/revert/indicateur/filtre.sql b/data_layer/sqitch/revert/indicateur/filtre.sql index 46fa1aef86..3df2c94b67 100644 --- a/data_layer/sqitch/revert/indicateur/filtre.sql +++ b/data_layer/sqitch/revert/indicateur/filtre.sql @@ -2,45 +2,7 @@ BEGIN; -create or replace function - thematiques(indicateur_definitions) - returns setof thematique - language sql - security definer - stable -begin - atomic - select thematique - from indicateur_definition definition - join thematique - on thematique.md_id = any (definition.thematiques) - where definition.id = $1.indicateur_id - union - select thematique - from indicateur_personnalise_definition definition - join indicateur_personnalise_thematique it - on definition.id = it.indicateur_id - join thematique on it.thematique_id = thematique.id - where definition.id = $1.indicateur_perso_id; -end; -comment on function thematiques(indicateur_definitions) is - 'Les thématiques associées à un indicateur.'; - -create or replace function - definition_referentiel(indicateur_definitions) - returns setof indicateur_definition - rows 1 - language sql - security definer - stable -begin - atomic - select ist - from indicateur_definition ist - where ist.id = $1.indicateur_id; -end; -comment on function definition_referentiel(indicateur_definitions) is - 'La définition de l''indicateur provenant du référentiel.'; +-- Revert les axes pour appliquer de nouveau la verification de droits create or replace function axes(indicateur_definitions) @@ -57,7 +19,7 @@ begin left join definition_referentiel($1) def on true where -- indicateur prédéfini - ($1.indicateur_id is not null + (($1.indicateur_id is not null and fai.indicateur_id = $1.indicateur_id and collectivite_id = $1.collectivite_id) -- indicateur prédéfini dont les valeurs sont celles d'un autre @@ -66,170 +28,10 @@ begin and collectivite_id = $1.collectivite_id) -- indicateur perso or ($1.indicateur_perso_id is not null - and fai.indicateur_personnalise_id = $1.indicateur_perso_id); + and fai.indicateur_personnalise_id = $1.indicateur_perso_id)) + and can_read_acces_restreint(axe.collectivite_id); end; comment on function axes(indicateur_definitions) is 'Les axes (plans d''action) associés à un indicateur.'; -create or replace function - fiches_non_classees(indicateur_definitions) - returns setof fiche_action_indicateur - language sql - security definer - stable -begin - atomic - select fai - from fiche_action_indicateur fai - join fiche_action fa on fa.id = fai.fiche_id and fa.collectivite_id = $1.collectivite_id - left join definition_referentiel($1) def on true - where not exists (select from fiche_action_axe faa where faa.fiche_id = fai.fiche_id) - and ( - -- indicateur prédéfini - fai.indicateur_id = $1.indicateur_id - -- indicateur perso - or fai.indicateur_personnalise_id = $1.indicateur_perso_id - -- indicateur prédéfini dont les valeurs sont celles d'un autre - or def.valeur_indicateur = $1.indicateur_id - ); -end; -comment on function fiches_non_classees(indicateur_definitions) is - 'Les fiches non classées (sans plan d''action) associées à un indicateur.'; - -create or replace function - pilotes(indicateur_definitions) - returns setof indicateur_pilote - language sql - security definer - stable -begin - atomic - select ip - from indicateur_pilote ip - left join definition_referentiel($1) def on true - where - -- indicateur prédéfini - ($1.indicateur_id is not null - and ip.indicateur_id = $1.indicateur_id - and collectivite_id = $1.collectivite_id) - -- indicateur prédéfini dont les valeurs sont celles d'un autre - or ($1.indicateur_id is not null - and ip.indicateur_id = def.valeur_indicateur - and collectivite_id = $1.collectivite_id) - -- indicateur perso - or ($1.indicateur_perso_id is not null - and ip.indicateur_perso_id = $1.indicateur_perso_id); -end; -comment on function pilotes(indicateur_definitions) is - 'Les personnes pilotes associées à un indicateur.'; - -create or replace function - personne(indicateur_pilote) - returns setof personne - rows 1 - language sql - security definer - stable -begin - atomic - select private.get_personne($1); -end; -comment on function personne(indicateur_pilote) is - 'Une personne associée comme personne pilote d''un indicateur.'; - -create or replace function - services(indicateur_definitions) - returns setof indicateur_service_tag - language sql - security definer - stable -begin - atomic - select ist - from indicateur_service_tag ist - left join definition_referentiel($1) def on true - where - -- indicateur prédéfini - ($1.indicateur_id is not null - and ist.indicateur_id = $1.indicateur_id - and collectivite_id = $1.collectivite_id) - -- indicateur prédéfini dont les valeurs sont celles d'un autre - or ($1.indicateur_id is not null - and ist.indicateur_id = def.valeur_indicateur - and collectivite_id = $1.collectivite_id) - -- indicateur perso - or ($1.indicateur_perso_id is not null - and ist.indicateur_perso_id = $1.indicateur_perso_id); -end; -comment on function services(indicateur_definitions) is - 'Les services associés à un indicateur.'; - - -create or replace function - definition_perso(indicateur_definitions) - returns setof indicateur_personnalise_definition - rows 1 - language sql - security definer - stable -begin - atomic - select ipd - from indicateur_personnalise_definition ipd - where ipd.id = $1.indicateur_perso_id; -end; -comment on function definition_perso(indicateur_definitions) is - 'La définition de l''indicateur personnalisé.'; - - -create or replace function - enfants(indicateur_definitions) - returns setof indicateur_definitions - language sql - security definer - stable -begin - atomic - select $1.collectivite_id as collectivite_id, - definition.id as indicateur_id, - null::integer as indicateur_perso_id, - definition.nom as nom, - definition.description, - definition.unite - from indicateur_definition definition - where definition.parent = $1.indicateur_id; -end; -comment on function enfants(indicateur_definitions) is - 'Définitions des indicateurs enfants d''un indicateur composé.'; - -create or replace function - enfants(indicateur_definition) - returns setof indicateur_definition - language sql - security definer - stable -begin - atomic - select def - from indicateur_definition def - where def.parent = $1.id; -end; -comment on function enfants(indicateur_definition) is - 'Définitions des indicateurs enfants d''un indicateur composé.'; - -create or replace function - indicateur_action(indicateur_definitions) - returns setof indicateur_action - language sql - security definer - stable -begin - atomic - select ia - from indicateur_action ia - where ia.indicateur_id = $1.indicateur_id; -end; -comment on function indicateur_action(indicateur_definitions) is - 'La relation entre un indicateur prédéfini et des actions des référentiels.'; - COMMIT; diff --git a/data_layer/sqitch/revert/indicateur/filtre@v3.5.0.sql b/data_layer/sqitch/revert/indicateur/filtre@v3.5.0.sql new file mode 100644 index 0000000000..46fa1aef86 --- /dev/null +++ b/data_layer/sqitch/revert/indicateur/filtre@v3.5.0.sql @@ -0,0 +1,235 @@ +-- Deploy tet:indicateur/filtre to pg + +BEGIN; + +create or replace function + thematiques(indicateur_definitions) + returns setof thematique + language sql + security definer + stable +begin + atomic + select thematique + from indicateur_definition definition + join thematique + on thematique.md_id = any (definition.thematiques) + where definition.id = $1.indicateur_id + union + select thematique + from indicateur_personnalise_definition definition + join indicateur_personnalise_thematique it + on definition.id = it.indicateur_id + join thematique on it.thematique_id = thematique.id + where definition.id = $1.indicateur_perso_id; +end; +comment on function thematiques(indicateur_definitions) is + 'Les thématiques associées à un indicateur.'; + +create or replace function + definition_referentiel(indicateur_definitions) + returns setof indicateur_definition + rows 1 + language sql + security definer + stable +begin + atomic + select ist + from indicateur_definition ist + where ist.id = $1.indicateur_id; +end; +comment on function definition_referentiel(indicateur_definitions) is + 'La définition de l''indicateur provenant du référentiel.'; + +create or replace function + axes(indicateur_definitions) + returns setof axe + language sql + security definer + stable +begin + atomic + select axe + from fiche_action_indicateur fai + join fiche_action_axe faa using (fiche_id) + join axe on faa.axe_id = axe.id + left join definition_referentiel($1) def on true + where + -- indicateur prédéfini + ($1.indicateur_id is not null + and fai.indicateur_id = $1.indicateur_id + and collectivite_id = $1.collectivite_id) + -- indicateur prédéfini dont les valeurs sont celles d'un autre + or ($1.indicateur_id is not null + and fai.indicateur_id = def.valeur_indicateur + and collectivite_id = $1.collectivite_id) + -- indicateur perso + or ($1.indicateur_perso_id is not null + and fai.indicateur_personnalise_id = $1.indicateur_perso_id); +end; +comment on function axes(indicateur_definitions) is + 'Les axes (plans d''action) associés à un indicateur.'; + +create or replace function + fiches_non_classees(indicateur_definitions) + returns setof fiche_action_indicateur + language sql + security definer + stable +begin + atomic + select fai + from fiche_action_indicateur fai + join fiche_action fa on fa.id = fai.fiche_id and fa.collectivite_id = $1.collectivite_id + left join definition_referentiel($1) def on true + where not exists (select from fiche_action_axe faa where faa.fiche_id = fai.fiche_id) + and ( + -- indicateur prédéfini + fai.indicateur_id = $1.indicateur_id + -- indicateur perso + or fai.indicateur_personnalise_id = $1.indicateur_perso_id + -- indicateur prédéfini dont les valeurs sont celles d'un autre + or def.valeur_indicateur = $1.indicateur_id + ); +end; +comment on function fiches_non_classees(indicateur_definitions) is + 'Les fiches non classées (sans plan d''action) associées à un indicateur.'; + +create or replace function + pilotes(indicateur_definitions) + returns setof indicateur_pilote + language sql + security definer + stable +begin + atomic + select ip + from indicateur_pilote ip + left join definition_referentiel($1) def on true + where + -- indicateur prédéfini + ($1.indicateur_id is not null + and ip.indicateur_id = $1.indicateur_id + and collectivite_id = $1.collectivite_id) + -- indicateur prédéfini dont les valeurs sont celles d'un autre + or ($1.indicateur_id is not null + and ip.indicateur_id = def.valeur_indicateur + and collectivite_id = $1.collectivite_id) + -- indicateur perso + or ($1.indicateur_perso_id is not null + and ip.indicateur_perso_id = $1.indicateur_perso_id); +end; +comment on function pilotes(indicateur_definitions) is + 'Les personnes pilotes associées à un indicateur.'; + +create or replace function + personne(indicateur_pilote) + returns setof personne + rows 1 + language sql + security definer + stable +begin + atomic + select private.get_personne($1); +end; +comment on function personne(indicateur_pilote) is + 'Une personne associée comme personne pilote d''un indicateur.'; + +create or replace function + services(indicateur_definitions) + returns setof indicateur_service_tag + language sql + security definer + stable +begin + atomic + select ist + from indicateur_service_tag ist + left join definition_referentiel($1) def on true + where + -- indicateur prédéfini + ($1.indicateur_id is not null + and ist.indicateur_id = $1.indicateur_id + and collectivite_id = $1.collectivite_id) + -- indicateur prédéfini dont les valeurs sont celles d'un autre + or ($1.indicateur_id is not null + and ist.indicateur_id = def.valeur_indicateur + and collectivite_id = $1.collectivite_id) + -- indicateur perso + or ($1.indicateur_perso_id is not null + and ist.indicateur_perso_id = $1.indicateur_perso_id); +end; +comment on function services(indicateur_definitions) is + 'Les services associés à un indicateur.'; + + +create or replace function + definition_perso(indicateur_definitions) + returns setof indicateur_personnalise_definition + rows 1 + language sql + security definer + stable +begin + atomic + select ipd + from indicateur_personnalise_definition ipd + where ipd.id = $1.indicateur_perso_id; +end; +comment on function definition_perso(indicateur_definitions) is + 'La définition de l''indicateur personnalisé.'; + + +create or replace function + enfants(indicateur_definitions) + returns setof indicateur_definitions + language sql + security definer + stable +begin + atomic + select $1.collectivite_id as collectivite_id, + definition.id as indicateur_id, + null::integer as indicateur_perso_id, + definition.nom as nom, + definition.description, + definition.unite + from indicateur_definition definition + where definition.parent = $1.indicateur_id; +end; +comment on function enfants(indicateur_definitions) is + 'Définitions des indicateurs enfants d''un indicateur composé.'; + +create or replace function + enfants(indicateur_definition) + returns setof indicateur_definition + language sql + security definer + stable +begin + atomic + select def + from indicateur_definition def + where def.parent = $1.id; +end; +comment on function enfants(indicateur_definition) is + 'Définitions des indicateurs enfants d''un indicateur composé.'; + +create or replace function + indicateur_action(indicateur_definitions) + returns setof indicateur_action + language sql + security definer + stable +begin + atomic + select ia + from indicateur_action ia + where ia.indicateur_id = $1.indicateur_id; +end; +comment on function indicateur_action(indicateur_definitions) is + 'La relation entre un indicateur prédéfini et des actions des référentiels.'; + +COMMIT; diff --git a/data_layer/sqitch/sqitch.plan b/data_layer/sqitch/sqitch.plan index 2405774058..09301dba85 100644 --- a/data_layer/sqitch/sqitch.plan +++ b/data_layer/sqitch/sqitch.plan @@ -672,3 +672,6 @@ collectivite/collectivite [collectivite/collectivite@v3.1.0] 2024-05-27T09:20:41 utilisateur/droits_v2 [utilisateur/droits_v2@v3.0.0] 2024-05-30T10:08:04Z Marc Rutkowski # Ajoute l'id d'invitation dans la rpc collectivite_membres utilisateur/membre [utilisateur/membre@v3.4.0] 2024-06-04T12:58:19Z Marc Rutkowski # Répare la suppression d'un utilisateur pré-existant à son rattachement à une collectivité @v3.5.0 2024-06-12T07:34:41Z Marc Rutkowski # Améliore la gestion des invitations depuis la page Membres + +indicateur/filtre [indicateur/filtre@v3.5.0] 2024-06-25T09:00:01Z Frederic Arnoux # Supprime la vérification des droits sur la fonction axes +indicateur/detail [indicateur/detail@v3.5.0] 2024-06-25T09:07:06Z Frederic Arnoux # Bouge la vérification des droits sur la vue indicateur_definitions diff --git a/data_layer/sqitch/verify/indicateur/detail@v3.5.0.sql b/data_layer/sqitch/verify/indicateur/detail@v3.5.0.sql new file mode 100644 index 0000000000..e1f2f12e0d --- /dev/null +++ b/data_layer/sqitch/verify/indicateur/detail@v3.5.0.sql @@ -0,0 +1,9 @@ +-- Verify tet:indicateur/detail on pg + +BEGIN; + +select collectivite_id, indicateur_id, indicateur_perso_id, nom, description, unite +from indicateur_definitions +where false; + +ROLLBACK; diff --git a/data_layer/sqitch/verify/indicateur/filtre.sql b/data_layer/sqitch/verify/indicateur/filtre.sql index fd7b2af418..cccae566bc 100644 --- a/data_layer/sqitch/verify/indicateur/filtre.sql +++ b/data_layer/sqitch/verify/indicateur/filtre.sql @@ -2,16 +2,6 @@ BEGIN; -select has_function_privilege('thematiques(indicateur_definitions)', 'execute'); -select has_function_privilege('thematiques(indicateur_definitions)', 'execute'); select has_function_privilege('axes(indicateur_definitions)', 'execute'); -select has_function_privilege('fiches_non_classees(indicateur_definitions)', 'execute'); -select has_function_privilege('pilotes(indicateur_definitions)', 'execute'); -select has_function_privilege('services(indicateur_definitions)', 'execute'); -select has_function_privilege('definition_referentiel(indicateur_definitions)', 'execute'); -select has_function_privilege('definition_perso(indicateur_definitions)', 'execute'); -select has_function_privilege('rempli(indicateur_definitions)', 'execute'); -select has_function_privilege('enfants(indicateur_definitions)', 'execute'); -select has_function_privilege('personne(indicateur_pilote)', 'execute'); ROLLBACK; diff --git a/data_layer/sqitch/verify/indicateur/filtre@v3.5.0.sql b/data_layer/sqitch/verify/indicateur/filtre@v3.5.0.sql new file mode 100644 index 0000000000..fd7b2af418 --- /dev/null +++ b/data_layer/sqitch/verify/indicateur/filtre@v3.5.0.sql @@ -0,0 +1,17 @@ +-- Verify tet:indicateur/filtre on pg + +BEGIN; + +select has_function_privilege('thematiques(indicateur_definitions)', 'execute'); +select has_function_privilege('thematiques(indicateur_definitions)', 'execute'); +select has_function_privilege('axes(indicateur_definitions)', 'execute'); +select has_function_privilege('fiches_non_classees(indicateur_definitions)', 'execute'); +select has_function_privilege('pilotes(indicateur_definitions)', 'execute'); +select has_function_privilege('services(indicateur_definitions)', 'execute'); +select has_function_privilege('definition_referentiel(indicateur_definitions)', 'execute'); +select has_function_privilege('definition_perso(indicateur_definitions)', 'execute'); +select has_function_privilege('rempli(indicateur_definitions)', 'execute'); +select has_function_privilege('enfants(indicateur_definitions)', 'execute'); +select has_function_privilege('personne(indicateur_pilote)', 'execute'); + +ROLLBACK; From 60a020340e6afe88bb2e0458f03e3e658a238437 Mon Sep 17 00:00:00 2001 From: Fred <98240+farnoux@users.noreply.github.com> Date: Tue, 25 Jun 2024 14:53:36 +0200 Subject: [PATCH 2/2] Revert du changement sur la vue indicateur_definitions This partially reverts commit 6257a0383c7af874936a10e0bc6c015820d769b2. --- .../sqitch/deploy/indicateur/detail.sql | 39 +++++++++---------- .../deploy/indicateur/detail@v3.5.0.sql | 28 ------------- .../sqitch/revert/indicateur/detail.sql | 3 +- .../revert/indicateur/detail@v3.5.0.sql | 27 ------------- data_layer/sqitch/sqitch.plan | 1 - .../verify/indicateur/detail@v3.5.0.sql | 9 ----- 6 files changed, 19 insertions(+), 88 deletions(-) delete mode 100644 data_layer/sqitch/deploy/indicateur/detail@v3.5.0.sql delete mode 100644 data_layer/sqitch/revert/indicateur/detail@v3.5.0.sql delete mode 100644 data_layer/sqitch/verify/indicateur/detail@v3.5.0.sql diff --git a/data_layer/sqitch/deploy/indicateur/detail.sql b/data_layer/sqitch/deploy/indicateur/detail.sql index b302140591..e96ba6af9f 100644 --- a/data_layer/sqitch/deploy/indicateur/detail.sql +++ b/data_layer/sqitch/deploy/indicateur/detail.sql @@ -4,27 +4,24 @@ BEGIN; create or replace view indicateur_definitions as -SELECT * FROM ( - select c.id as collectivite_id, - definition.id as indicateur_id, - null::integer as indicateur_perso_id, - definition.nom as nom, - definition.description, - definition.unite - from collectivite c - cross join indicateur_definition definition - where is_authenticated() - union all - select definition.collectivite_id as collectivite_id, - null::indicateur_id as indicateur_id, - definition.id as indicateur_perso_id, - definition.titre, - definition.description, - definition.unite - from indicateur_personnalise_definition definition -) AS f -WHERE can_read_acces_restreint(f.collectivite_id); - +select c.id as collectivite_id, + definition.id as indicateur_id, + null::integer as indicateur_perso_id, + definition.nom as nom, + definition.description, + definition.unite +from collectivite c + cross join indicateur_definition definition +where is_authenticated() +union all +select definition.collectivite_id as collectivite_id, + null::indicateur_id as indicateur_id, + definition.id as indicateur_perso_id, + definition.titre, + definition.description, + definition.unite +from indicateur_personnalise_definition definition +where can_read_acces_restreint(collectivite_id); comment on view indicateur_definitions is 'Les définitions des indicateurs prédéfinis et personnalisés'; diff --git a/data_layer/sqitch/deploy/indicateur/detail@v3.5.0.sql b/data_layer/sqitch/deploy/indicateur/detail@v3.5.0.sql deleted file mode 100644 index e96ba6af9f..0000000000 --- a/data_layer/sqitch/deploy/indicateur/detail@v3.5.0.sql +++ /dev/null @@ -1,28 +0,0 @@ --- Deploy tet:indicateur/detail to pg - -BEGIN; - -create or replace view indicateur_definitions -as -select c.id as collectivite_id, - definition.id as indicateur_id, - null::integer as indicateur_perso_id, - definition.nom as nom, - definition.description, - definition.unite -from collectivite c - cross join indicateur_definition definition -where is_authenticated() -union all -select definition.collectivite_id as collectivite_id, - null::indicateur_id as indicateur_id, - definition.id as indicateur_perso_id, - definition.titre, - definition.description, - definition.unite -from indicateur_personnalise_definition definition -where can_read_acces_restreint(collectivite_id); -comment on view indicateur_definitions - is 'Les définitions des indicateurs prédéfinis et personnalisés'; - -COMMIT; diff --git a/data_layer/sqitch/revert/indicateur/detail.sql b/data_layer/sqitch/revert/indicateur/detail.sql index e96ba6af9f..341f011fb6 100644 --- a/data_layer/sqitch/revert/indicateur/detail.sql +++ b/data_layer/sqitch/revert/indicateur/detail.sql @@ -12,7 +12,6 @@ select c.id as collectivite_id, definition.unite from collectivite c cross join indicateur_definition definition -where is_authenticated() union all select definition.collectivite_id as collectivite_id, null::indicateur_id as indicateur_id, @@ -21,7 +20,7 @@ select definition.collectivite_id as collectivite_id, definition.description, definition.unite from indicateur_personnalise_definition definition -where can_read_acces_restreint(collectivite_id); +where have_edition_acces(collectivite_id); comment on view indicateur_definitions is 'Les définitions des indicateurs prédéfinis et personnalisés'; diff --git a/data_layer/sqitch/revert/indicateur/detail@v3.5.0.sql b/data_layer/sqitch/revert/indicateur/detail@v3.5.0.sql deleted file mode 100644 index 341f011fb6..0000000000 --- a/data_layer/sqitch/revert/indicateur/detail@v3.5.0.sql +++ /dev/null @@ -1,27 +0,0 @@ --- Deploy tet:indicateur/detail to pg - -BEGIN; - -create or replace view indicateur_definitions -as -select c.id as collectivite_id, - definition.id as indicateur_id, - null::integer as indicateur_perso_id, - definition.nom as nom, - definition.description, - definition.unite -from collectivite c - cross join indicateur_definition definition -union all -select definition.collectivite_id as collectivite_id, - null::indicateur_id as indicateur_id, - definition.id as indicateur_perso_id, - definition.titre, - definition.description, - definition.unite -from indicateur_personnalise_definition definition -where have_edition_acces(collectivite_id); -comment on view indicateur_definitions - is 'Les définitions des indicateurs prédéfinis et personnalisés'; - -COMMIT; diff --git a/data_layer/sqitch/sqitch.plan b/data_layer/sqitch/sqitch.plan index 09301dba85..29937c562f 100644 --- a/data_layer/sqitch/sqitch.plan +++ b/data_layer/sqitch/sqitch.plan @@ -674,4 +674,3 @@ utilisateur/membre [utilisateur/membre@v3.4.0] 2024-06-04T12:58:19Z Marc Rutkows @v3.5.0 2024-06-12T07:34:41Z Marc Rutkowski # Améliore la gestion des invitations depuis la page Membres indicateur/filtre [indicateur/filtre@v3.5.0] 2024-06-25T09:00:01Z Frederic Arnoux # Supprime la vérification des droits sur la fonction axes -indicateur/detail [indicateur/detail@v3.5.0] 2024-06-25T09:07:06Z Frederic Arnoux # Bouge la vérification des droits sur la vue indicateur_definitions diff --git a/data_layer/sqitch/verify/indicateur/detail@v3.5.0.sql b/data_layer/sqitch/verify/indicateur/detail@v3.5.0.sql deleted file mode 100644 index e1f2f12e0d..0000000000 --- a/data_layer/sqitch/verify/indicateur/detail@v3.5.0.sql +++ /dev/null @@ -1,9 +0,0 @@ --- Verify tet:indicateur/detail on pg - -BEGIN; - -select collectivite_id, indicateur_id, indicateur_perso_id, nom, description, unite -from indicateur_definitions -where false; - -ROLLBACK;