Skip to content
Snippets Groups Projects
Commit 6db434ac authored by lisasmah's avatar lisasmah
Browse files

#33 résolution des conflits de la branche 33 par rapport à la branche dev

Problème restant non résolu : après une recherche sans résultats, lorsque l'utilisateur sélectionne une nouvelle table ou un schéma, l'affichage des métadonnées et des données associées ne se met pas à jour correctement. Le bouton "Visualiser les données" apparaît, mais les informations ne sont pas chargées comme prévu.

Merge remote-tracking branch 'origin/dev' into 33-implementer-la-navigation-apres-la-recherche-plein-texte

# Conflicts:
#	README.md
#	data-raw/datamartage.R
#	datamart_catalogue.RData
#	global.R
#	server.R
#	ui.R
parents dc3b194a 7843e154
No related branches found
No related tags found
5 merge requests!55Draft: #30 Afficher la date de dernière mise à jour d'une table dans les métadonnées, si disponible,!51Draft: #65 Documentation du datamart de l'app avec un schéma + détails des tables,!38Mise à niveau par rapport à la version déployée début octobre,!36Mise à niveau de la branche de dev par rapport à la version déployée sur intranet mi sept,!31Draft: #33
https://app.moqups.com/k1K5vhD4tNIqdX403sCSy0auWvLPDNUk/edit/page/ac0c42cd4Test du nouveau dépôt
Prototype de catalogue interne, réalisée avec RShiny, pour un serveur de base de données RPostgreSQL/postgis.
https://app.moqups.com/k1K5vhD4tNIqdX403sCSy0auWvLPDNUk/edit/page/ac0c42cd4
......@@ -23,11 +23,12 @@ commentaires_base <- purrr::map_dfr(.x = db_liste, .f = function(db_name) {
# Création d'une liste combinée avec noms et commentaires
bases_avec_commentaires <- commentaires_base %>%
dplyr::mutate(display_name = paste(base, commentaire, sep = " - "))
dplyr::mutate(commentaire = tidyr::replace_na(commentaire, "")) %>%
dplyr::mutate(display_name = paste(base, commentaire, sep = " : "))
# 2- Schémas ----------------------------------------------------------------------------------
# Création de la liste des schémas chaque base à partir des connexions
db_schema_list <- purrr::map2_dfr(.x = db_list, .y = names(db_list),
db_schema_list0 <- purrr::map2_dfr(.x = db_list, .y = names(db_list),
.f = ~datalibaba::list_schemas(.x) %>%
tibble::enframe(name = NULL, value = "nom_schema") %>%
dplyr::arrange(nom_schema) %>%
......@@ -36,11 +37,20 @@ db_schema_list <- purrr::map2_dfr(.x = db_list, .y = names(db_list),
dplyr::filter(!(nom_schema %in% c("pg_catalog", "public", "information_schema")), nom_schema != "catalogue", !grepl("^zz_|^z_", nom_schema))
# Récupération des commentaires des schémas
commentaires_schema <- purrr::map2_dfr(.x = db_schema_list$nom_schema, .y = db_schema_list$base,
commentaires_schema <- purrr::map2_dfr(.x = db_schema_list0$nom_schema, .y = db_schema_list0$base,
.f = ~(datalibaba::get_schema_comment(schema = .x, db = .y, user = role) %>%
dplyr::mutate(base = .y))
)
db_schema_list <- db_schema_list0 %>%
dplyr::left_join(commentaires_schema %>% dplyr::mutate(commentaire = tidyr::replace_na(commentaire, "")), by = c("base", "nom_schema")) %>%
dplyr::select(-commentaire.y) %>%
dplyr::rename(commentaire = commentaire.x) %>%
dplyr::mutate(display_name = paste(nom_schema, commentaire, sep = " : ") %>%
gsub(": $", "", .))
rm(db_schema_list0)
#3- Tables ------------------------------------------------------------------------------------
## 3-1 Liste des tables accessibles pour le role
......@@ -55,7 +65,8 @@ lister_tables <- function(i = 1) {
dplyr::cross_join(db_schema_list[i, ])
}
# Creation de la table qui liste toutes les tables de tous les schémas des 4 bases
tb_sch_base_0 <- purrr::map_df(1:nrow(db_schema_list), .f = lister_tables)
tb_sch_base_0 <- purrr::map_df(1:nrow(db_schema_list), .f = lister_tables) %>%
dplyr::arrange(base, nom_schema, table)
# Vérif bonne pratique noms tables : on écarte les tables dont le nom comprend des majuscules car il faut les quoter dans les requêtes SQL
anomalies_noms_tables <- tb_sch_base_0 %>%
......@@ -105,8 +116,11 @@ base_recherche_txt <- tables_catalog %>%
# 4- Exports du datamart au format RData ---------------------------------------------------------
date_datamart <- Sys.Date() %>% format.Date("%d/%m/%Y")
tb_datamart <- c("commentaires_base","commentaires_schema", "tables_catalog", "base_recherche_txt","bases_avec_commentaires", "commentaires_tables",
"db_schema_list", "tb_sch_base", "date_datamart") # liste des objets à inclure
tb_datamart <- c("commentaires_schema", "tables_catalog", "base_recherche_txt","commentaires_base","db_schema_list","tb_sch_base") # liste des tables à inclure
nom_datamart <- "datamart_catalogue.RData" # nom du RData
# Sauvegarde dans le répertoire du projet et dans le répertoire du projet sur T:
......
No preview for this file type
# deploiement vers le sserveur interne de dataviz
library(RCurl)
# creation de l'adresse de connexion FTP au serveur
con_ftp_svr_dataviz <- paste0("ftp://", Sys.getenv("svr_dataviz_user"), ":", Sys.getenv("svr_dataviz_mdp"),
"@", Sys.getenv("svr_dataviz_ip"), "/catalogueR/")
# creation d'une fonction de transfert FTP vers le serveur à l'aide de ftpUpload de RCurl
## Les adresses des fichiers à transferer parte de la racine du projet RStudio
to_svr_dataviz_ftp <- function(fic = "datamart_catalogue.RData") {
ftpUpload(what = fic, to = paste0(con_ftp_svr_dataviz, fic))
}
# fichiers à transférer
app_files <- c("datamart_catalogue.RData", "global.R", list.files("R/", full.names = TRUE, recursive = TRUE),list.files("www/", full.names = TRUE, recursive = TRUE),
"server.R", "ui.R", "catalogue.Rproj")
# Exécution des transferts
lapply(X = app_files, FUN = to_svr_dataviz_ftp)
library(gmailr)
library(logging)
library(base64enc)
library(dplyr)
# Configuration du logging
basicConfig(level = 'DEBUG')
# Fonction pour encoder le sujet en Base64
encode_base64_utf8 <- function(string) {
raw_string <- charToRaw(string)
encoded_string <- base64encode(raw_string)
return(sprintf("=?UTF-8?B?%s?=", encoded_string))
}
# Fonction pour envoyer un email
send_email <- function(subject, body, to = "adl.dreal-pdl@developpement-durable.gouv.fr", cc = "lisa.smah@developpement-durable.gouv.fr") {
gm_auth_configure(path = "X:/SCTE/CSD/APPLICATIONS_SIG_BUREAUTIQUES/RESSOURCES_R/client_secret_api_gmail_csd.json")
gm_auth(
scopes = c(
"https://www.googleapis.com/auth/gmail.send",
"https://www.googleapis.com/auth/gmail.compose"
)
)
# Encoder le sujet en Base64 pour éviter les problèmes d'encodage
subject_base64 <- encode_base64_utf8(subject)
email <- gm_mime() %>%
gm_to(to) %>%
gm_cc(cc) %>%
gm_from("lisa.smah@developpement-durable.gouv.fr") %>%
gm_subject(subject_base64) %>%
gm_text_body(body)
gm_send_message(email)
}
# Fonction pour lire et filtrer les logs
read_logs <- function(log_file) {
logs <- readLines(log_file)
# Filtrer les lignes indésirables
filtered_logs <- logs[!grepl("Attaching core tidyverse packages", logs) &
!grepl("Conflicts", logs) &
!grepl("package ‘", logs) &
!grepl("✔", logs) &
!grepl("ℹ Use the conflicted package", logs) &
!grepl("─", logs) &
!grepl("✖", logs)&
!grepl("Messages d'avis", logs) &
!grepl("compilé avec la version R", logs) &
!grepl("Attachement du package", logs) &
!grepl("L'objet suivant est masqué depuis", logs)&
!grepl("complete", logs)]
return(filtered_logs)
}
# Fonction pour analyser les logs et préparer le contenu de l'email
prepare_email_content <- function(logs) {
tryCatch({
datamart_success <- any(grepl("Mise à jour du datamart catalogueR réussie", logs))
deploy_success <- any(grepl("Déploiement de l'application réussi", logs))
error_messages <- logs[grepl("Erreur|Échec", logs)]
date <- Sys.Date()
if (datamart_success && deploy_success) {
subject <- "Succès mise à jour datamart catalogueR et déploiement de l'application"
body <- paste(logs, collapse = "\n")
} else if (!datamart_success) {
subject <- "Échec mise à jour datamart catalogueR"
body <- sprintf("La mise à jour du datamart a échoué le %s. Erreurs:\n%s", date, paste(error_messages, collapse = "\n"))
} else if (!deploy_success) {
subject <- "Échec du déploiement de l'application"
body <- sprintf("Le déploiement de l'application a échoué le %s. Erreurs:\n%s", date, paste(error_messages, collapse = "\n"))
}
list(subject = subject, body = body)
}, error = function(e) {
subject <- "Erreur lors de l'analyse des logs"
body <- sprintf("Une erreur est survenue lors de l'analyse des logs le %s. Erreur:\n%s", Sys.Date(), e$message)
list(subject = subject, body = body)
})
}
# Chemin vers le fichier de log généré par script_routine
args <- commandArgs(trailingOnly = FALSE)
script_path <- sub("--file=", "", args[grep("--file=", args)])
project_path <- normalizePath(file.path(dirname(script_path), ".."))
setwd(project_path)
log_file <- "logs/script_routine.log"
# Lire et analyser les logs
logs <- read_logs(log_file)
# Préparer le sujet et le contenu de l'email basé sur l'analyse des logs
email_content <- prepare_email_content(logs)
# Envoi de l'email de notification
send_email(email_content$subject, email_content$body)
library(logging)
Sys.setenv("HTTP_PROXY" = "http://pfrie-std.proxy.e2.rie.gouv.fr:8080")
Sys.setenv("HTTPS_PROXY" = "http://pfrie-std.proxy.e2.rie.gouv.fr:8080")
# a n'utiliser que lorsque le fichier est exécuté par la tache planifiée
args <- commandArgs(trailingOnly = FALSE)
script_path <- sub("--file=", "", args[grep("--file=", args)])
project_path <- normalizePath(file.path(dirname(script_path), ".."))
setwd(project_path)
# Configuration du logging ------------------------------------------------------------------------------------------------------------
basicConfig(level = 'DEBUG')
log_file <- "logs/script_routine.log"
log_con <- file(log_file, open = "wt")
# Fonction pour exécuter un script et capturer les logs -------------------------------------------------------------------------------
execute_script <- function(script_path) {
tryCatch({
source(script_path)
loginfo("Script exécuté avec succès : %s", script_path)
return(TRUE)
}, error = function(e) {
logerror("Erreur lors de l'exécution du script %s : %s", script_path, e$message)
return(FALSE)
})
}
sink(log_con, type = "message")
sink(log_con, type = "output")
# Exécution de la mise à jour du datamart ---------------------------------------------------------------------------------------------
start_time <- Sys.time()
datamart_success <- execute_script("data-raw/datamartage.R")
end_time <- Sys.time()
if (datamart_success) {
execution_time <- end_time - start_time
loginfo("Mise à jour du datamart catalogueR réussie")
# Récupérer la taille du datamart
datamart_file <- "datamart_catalogue.RData"
datamart_size <- file.info(datamart_file)$size
loginfo("Taille du datamart : %s bytes", datamart_size)
loginfo("Temps d'exécution : %s minutes", execution_time)
} else {
logerror("Échec de la mise à jour du datamart catalogueR")
}
# Exécution du déploiement de l'application -------------------------------------------------------------------------------------------
deploy_success <- execute_script("dev/deploiemt_svr_dataviz.R")
if (deploy_success) {
loginfo("Déploiement de l'application réussi")
} else {
logerror("Échec du déploiement de l'application")
}
# Fermer les connexions de fichier ----------------------------------------------------------------------------------------------------
sink(type = "message")
sink(type = "output")
close(log_con)
......@@ -10,3 +10,6 @@ library(DBI)
nom_local <- "datamart_catalogue.RData"
adresse_T <- paste0("T:/datalab/SCTE/CATALOGUE/PRODUCTION/", nom_local)
if(file.exists(adresse_T)) load(file = adresse_T) else load(nom_local)
liste_bases <- bases_avec_commentaires$base %>% setNames(bases_avec_commentaires$display_name)
── Attaching core tidyverse packages ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── tidyverse 2.0.0 ──
✔ dplyr 1.1.4 ✔ readr 2.1.5
✔ forcats 1.0.0 ✔ stringr 1.5.1
✔ ggplot2 3.5.1 ✔ tibble 3.2.1
✔ lubridate 1.9.3 ✔ tidyr 1.3.1
✔ purrr 1.0.2
── Conflicts ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag() masks stats::lag()
ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
2024-08-01 15:35:51.133374 INFO::Script exécuté avec succès : data-raw/datamartage.R
Messages d'avis :
1: le package 'tidyverse' a été compilé avec la version R 4.3.3
2: le package 'tibble' a été compilé avec la version R 4.3.3
3: le package 'tidyr' a été compilé avec la version R 4.3.3
4: le package 'readr' a été compilé avec la version R 4.3.3
5: le package 'purrr' a été compilé avec la version R 4.3.3
6: le package 'dplyr' a été compilé avec la version R 4.3.3
7: le package 'stringr' a été compilé avec la version R 4.3.3
8: le package 'forcats' a été compilé avec la version R 4.3.3
9: le package 'lubridate' a été compilé avec la version R 4.3.3
2024-08-01 15:35:51.146315 INFO::Mise à jour du datamart catalogueR réussie
2024-08-01 15:35:51.161657 INFO::Taille du datamart : 613731 bytes
2024-08-01 15:35:51.163688 INFO::Temps d'exécution : 8.98370524644852 minutes
Attachement du package : 'RCurl'
L'objet suivant est masqué depuis 'package:tidyr':
complete
2024-08-01 15:35:52.923841 INFO::Script exécuté avec succès : dev/deploiemt_svr_dataviz.R
Message d'avis :
le package 'RCurl' a été compilé avec la version R 4.3.2
2024-08-01 15:35:52.925733 INFO::Déploiement de l'application réussi
This diff is collapsed.
......@@ -3,6 +3,7 @@ library(shiny)
library(leaflet)
library(DT)
library(shinyjs)
ui <- fluidPage_dsfr(
header = header_dsfr(
intitule = c("PREFET", "DE LA REGION", "PAYS DE LA LOIRE"),
......@@ -23,9 +24,10 @@ ui <- fluidPage_dsfr(
h3("Rechercher un lot de données dans le patrimoine de la DREAL"),
search_bar(),
DT::dataTableOutput("search_results")
)
),
DT::dataTableOutput("search_results"),
uiOutput("search_message")
)
),
tabPanel_dsfr(
id = "explorer",
title = "Explorer",
......@@ -33,18 +35,20 @@ ui <- fluidPage_dsfr(
sidebarLayout(
sidebarPanel(
h3("Explorer les bases de données du patrimoine de la DREAL"),
selectInput_dsfr("base", "Choisir la base", choices = NULL), # Sélection de la base
#selectInput_dsfr("base", "Choisir la base", choices = NULL), # Sélection de la base
selectInput_dsfr("base", "Choisir la base", choices = liste_bases, selected = NULL), # Sélection de la base
shinygouv::selectInput_dsfr("schema", "Choisir le schéma", NULL), # Sélection du nom du schéma
shinygouv::selectInput_dsfr("table", "Choisir la table", NULL), # Sélection du nom de la table
shinygouv::actionButton_dsfr("visualiserMetadata", "Visualiser les métadonnées")# Bouton de validation pour visualiser les métadonnées
),
mainPanel(
uiOutput("breadcrumb_metadata"),
uiOutput("title_metadata"), # Titre de l'objet sélectionné
uiOutput("commentaire_metadata"),
uiOutput("table_metadata"), #Nb de lignes et taille de la table
DT::dataTableOutput("data_table"),
#uiOutput("metadata_section"), # Section des métadonnées avec "Dictionnaire d'attributs"
uiOutput("viz_data"), # Visualisation de la table des données
downloadButton("downloadData", "Télécharger les données CSV"), # Bouton de téléchargement
# Mise en page pour les données et la carte côte à côte
fluidRow(
......@@ -53,7 +57,7 @@ ui <- fluidPage_dsfr(
div(
style = "width: 48%; margin-right: 2%; overflow-x: auto;", # Ajuster la taille pour la table
uiOutput("data_table_preview_title"),
shinygouv::tableOutput_dsfr("data_table_preview")
DT::dataTableOutput("data_table_preview"),
),
div(
style = "width: 48%;", # Ajuster la taille pour la carte
......@@ -70,8 +74,9 @@ ui <- fluidPage_dsfr(
id = "a_propos",
title = "À propos",
content = fluidPage_dsfr(
h3("À propos")
# Content for "À propos" tab goes here
h3("À propos"),
includeMarkdown("www/about.md"),
div(paste0("Date de mise à jour des métadonnées affichées : ", date_datamart))
)
),
......@@ -79,8 +84,8 @@ ui <- fluidPage_dsfr(
id = "mentions_legales",
title = "Mentions légales",
content = fluidPage_dsfr(
h3("Mentions légales")
# Content for "Mentions légales" tab goes here
h3("Mentions légales"),
includeMarkdown("www/legal_notice.md")
)
)
)
......
#### Objectif
Le Catalogue de données de la DREAL vise à faciliter la découverte et l'accès aux données stockées dans les bases de donnés internes de la DREAL.
#### Fonctionnalités
L'onglet **"Rechercher"** permet :
- d'effectuer une recherche textuelle à partir de mots-clés au d'expression,
- d'afficher en résultat un tableau de [tables](https://fr.wikipedia.org/wiki/Table_(base_de_donn%C3%A9es)) correspondant à la recherche.
L'onglet **"Explorer"** :
- de naviguer parmi les bases de données, schémas et tables associés,
- d'afficher en résultat un tableau de schémas ou de tables correspondants à la recherche.
Les deux options permettent ensuite de visualiser :
- le [dictionnaire des données](https://fr.wikipedia.org/wiki/Dictionnaire_des_donn%C3%A9es),
- le tableau des données,
- un aperçu des données spatiales.
#### Charte de nommage
Les noms de tous les objets des bases de données (schémas, tables, champs, etc.) doivent être choisis selon une charte présentée dans la fiche de procédure [Organisation des bases de données sur le SGBD PostgreSQL](http://set-pdl-wiki.dreal-pdl.ad.e2.rie.gouv.fr/outils/sgbd/organisation-bases-postgresql).
#### Service gestionnaire
**Direction Régionale de l’Environnement de l’Aménagement et du Logement des Pays de la Loire**
5 rue Françoise Giroud
CS 16326
44263 NANTES Cedex 2
**Tél :** 02 72 74 73 00
**Fax :** 02 72 74 73 09
**Courriel :** dreal-paysdelaloire@developpement-durable.gouv.fr
#### Directrice de publication
Anne Beauval, directrice régionale de l’environnement, de l’aménagement et du logement des Pays de la Loire.
#### Conception, Réalisation
- Charte graphique, ergonomie : [{shinygouv}](https://github.com/spyrales/shinygouv)
- Développement : Lisa SMAH, Juliette ENGELAERE-LEFEBVRE, DREAL Pays de la Loire
#### Hébergement
- DREAL Pays de la Loire
#### Droit d’auteur - Licence
Tous les contenus présents sur Ce site de la direction régionale de l’Environnement, de l’Aménagement et du Logement des Pays de la Loire sont couverts par le droit d’auteur. Toute reprise est dès lors conditionnée à l’accord de l’auteur en vertu de l’article L.122-4 du Code de la Propriété Intellectuelle.
#### Établir un lien
- Tout site public ou privé est autorisé à établir, sans autorisation préalable, un lien vers les informations diffusées par le Ministère de la Transition écologique et le Ministère de la Cohésion des Territoires et des Relations avec les Collectivités Territoriales.
- L’autorisation de mise en place d’un lien est valable pour tout support, à l’exception de ceux diffusant des informations à caractère polémique, pornographique, xénophobe ou pouvant, dans une plus large mesure porter atteinte à la sensibilité du plus grand nombre.
- Pour ce faire, et toujours dans le respect des droits de leurs auteurs, une icône "Marianne" est disponible sur le site de [la marque de l'Etat](https://www.gouvernement.fr/marque-Etat) pour agrémenter votre lien et préciser que le site d’origine est celui du Ministère de la Transition écologique ou du Ministère de la Cohésion des Territoires et des Relations avec les Collectivités Territoriales.
#### Usage
- Les utilisateurs sont responsables des interrogations qu’ils formulent ainsi que de l’interprétation et de l’utilisation qu’ils font des résultats. Il leur appartient d’en faire un usage conforme aux réglementations en vigueur et aux recommandations de la CNIL lorsque des données ont un caractère nominatif (loi n° 78.17 du 6 janvier 1978, relative à l’informatique, aux fichiers et aux libertés dite loi informatique et libertés).
- Il appartient à l’utilisateur de ce site de prendre toutes les mesures appropriées de façon à protéger ses propres données et/ou logiciels de la contamination par d’éventuels virus circulant sur le réseau Internet. De manière générale, la Direction Régionale de l’Environnement de l’Aménagement et du Logement des Pays de la Loire décline toute responsabilité à un éventuel dommage survenu pendant la consultation du présent site. Les messages que vous pouvez nous adresser transitant par un réseau ouvert de télécommunications, nous ne pouvons assurer leur confidentialité.
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment