From bbd23ce030e0223ed31533cc8dd349ce28c34a4d Mon Sep 17 00:00:00 2001 From: LE DURAND Matteo <matteo.le-durand@developpement-durable.gouv.fr> Date: Tue, 25 Feb 2025 13:59:05 +0100 Subject: [PATCH 01/27] correction grammaire --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 278519f..8aad2df 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ la connexion est prevue pour se connecter au site "https://gitlab-forge.din.deve ## But du projet : -le but principal est de d'obtenire un tableau de bord des projets des différent dépots disponible afin d'en extraire des données afin de réaliser un tableau de bord des suivie des différent projet mener par la DREAL Pays De Le Loire Datalab. +le but principal est de d'obtenir un tableau de bord des projets des différent dépots disponible afin d'en extraire des données afin de réaliser un tableau de bord des suivie des différent projet mener par la DREAL Pays De Le Loire Datalab. -- GitLab From 35a33ef81033e6da2310ca0a2f46fa47b7c52809 Mon Sep 17 00:00:00 2001 From: LE DURAND Matteo <matteo.le-durand@developpement-durable.gouv.fr> Date: Tue, 25 Feb 2025 14:00:51 +0100 Subject: [PATCH 02/27] =?UTF-8?q?fix:=20les=20MergeRequest=20sont=20mainte?= =?UTF-8?q?nant=20pris=20en=20compte=20uniquement=20si=20l'action=20est=20?= =?UTF-8?q?accept=C3=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dev/gitlab_classique.R | 22 ++++++++++++++++++---- dev/gitlab_forge.R | 24 +++++++++++++++++++----- 2 files changed, 37 insertions(+), 9 deletions(-) diff --git a/dev/gitlab_classique.R b/dev/gitlab_classique.R index bfb98f4..023964f 100644 --- a/dev/gitlab_classique.R +++ b/dev/gitlab_classique.R @@ -129,10 +129,24 @@ get_gitlab_events <- function(base_url, project_id, private_token) { data <- data %>% mutate( project_name = as.character(project_id), - type = if_else((is.null(target_type) | target_type == "") | as.character(target_type) == "Issue" | as.character(action_name) == "joined", # remplecer par | as.ch(target-type)=="Issue" - as.character(action_name), - as.character(target_type)), - message = note.body, + + type = case_when( + is.null(target_type) | target_type == "" ~ as.character(action_name), + as.character(action_name) == "joined" ~ as.character(action_name), + TRUE ~ as.character(target_type) + ), + + message = case_when( + # Cas spécifique : MergeRequest avec action_name == "accepted" + as.character(target_type) == "MergeRequest" & as.character(action_name) == "accepted" ~ as.character(target_title), + + # Cas général : autres MergeRequest ou WikiPage::Meta + as.character(target_type) %in% c("WikiPage::Meta") ~ as.character(target_title), + + # Si ce n'est pas un cas spécial, garder note.body + TRUE ~ as.character(note.body) + ), + updated_at = created_at, author = author.username ) %>% diff --git a/dev/gitlab_forge.R b/dev/gitlab_forge.R index 87158a1..6955bc6 100644 --- a/dev/gitlab_forge.R +++ b/dev/gitlab_forge.R @@ -170,13 +170,27 @@ get_gitlab_events <- function(base_url, project_id, private_token) { data <- data %>% mutate( project_name = as.character(project_id), - type = if_else((is.null(target_type) | target_type == "") | as.character(target_type) == "Issue" | as.character(action_name) == "joined", # remplecer par | as.ch(target-type)=="Issue" - as.character(action_name), - as.character(target_type)), - message = ifelse(as.character(target_type) == "WikiPage::Meta",as.character(target_title),as.character(note.body)), + + type = case_when( + is.null(target_type) | target_type == "" ~ as.character(action_name), + as.character(action_name) == "joined" ~ as.character(action_name), + TRUE ~ as.character(target_type) + ), + + message = case_when( + # Cas spécifique : MergeRequest avec action_name == "accepted" + as.character(target_type) == "MergeRequest" & as.character(action_name) == "accepted" ~ as.character(target_title), + + # Cas général : autres MergeRequest ou WikiPage::Meta + as.character(target_type) %in% c("WikiPage::Meta") ~ as.character(target_title), + + # Si ce n'est pas un cas spécial, garder note.body + TRUE ~ as.character(note.body) + ), + updated_at = created_at, author = author.username - ) %>% + )%>% left_join(name_gitlab, by = c("project_name" = "id")) %>% mutate(project_name = name) %>% select(-name) -- GitLab From 4883457e9bd76cd44513747419c725e8ec47392f Mon Sep 17 00:00:00 2001 From: LE DURAND Matteo <matteo.le-durand@developpement-durable.gouv.fr> Date: Thu, 6 Mar 2025 16:30:01 +0100 Subject: [PATCH 03/27] ajout des groupes --- dev/github_extraire.R | 7 ++++++- dev/gitlab_classique.R | 10 ++++++---- dev/gitlab_forge.R | 22 +++++++++++++++++----- 3 files changed, 29 insertions(+), 10 deletions(-) diff --git a/dev/github_extraire.R b/dev/github_extraire.R index e8763ce..167a81e 100644 --- a/dev/github_extraire.R +++ b/dev/github_extraire.R @@ -152,7 +152,12 @@ get_github_topics <- function(repo) { ) combined_data <- combined_data %>% left_join(topics_list, by = "project_name") %>% - mutate(origine = "Github") %>% + mutate(origine = "Github", + groupe = case_when( + str_detect(project_name, "parcours_r") ~ "r-formation", + str_detect(project_name, "spyrales") ~ "spyrales", + TRUE ~ "autre" + )) %>% unique() # Afficher les premières lignes du tableau combiné diff --git a/dev/gitlab_classique.R b/dev/gitlab_classique.R index 023964f..cd71b90 100644 --- a/dev/gitlab_classique.R +++ b/dev/gitlab_classique.R @@ -7,7 +7,7 @@ library(gitlabr) set_gitlab_connection( gitlab_url = "https://gitlab.com" , - private_token = Sys.getenv("GITLAB_PAT") + private_token = Sys.getenv("GITLAB_COM_TOKEN") ) project_ids <- c(41600697, 19859695, 49118792, 21138017, 44145525, 18441361, 17610613,18439010) @@ -27,12 +27,12 @@ get_project_name <- function(base_url, project_id, private_token) { # Boucle pour récupérer tous les noms de projets name_gitlab <- bind_rows(lapply(project_ids, get_project_name, base_url = "https://gitlab.com", - private_token = Sys.getenv("GITLAB_PAT"))) + private_token = Sys.getenv("GITLAB_COM_TOKEN"))) name_gitlab$id <- as.character(name_gitlab$id) # Variables pour l'API GitLab base_url <- "https://gitlab.com" -private_token <- Sys.getenv("GITLAB_PAT") # Récupération du token depuis Renviron +private_token <- Sys.getenv("GITLAB_COM_TOKEN") # Récupération du token depuis Renviron # Fonction pour gérer la pagination de l'API GitLab avec une limite stricte à 160 pages, en vérifiant la présence de pages suivantes @@ -242,7 +242,9 @@ all_data_gitlab <- all_data_gitlab %>% filter(!(is.na(all_data_gitlab$type) | is.na(all_data_gitlab$message)) | all_data_gitlab$type == "joined" | all_data_gitlab$type == "WikiPage::Meta") all_data_gitlab <- bind_rows(fg,all_data_gitlab) all_data_gitlab <- all_data_gitlab %>% - mutate(origine ="Gitlab") + mutate(origine ="Gitlab", + groupe = "RDES_DREAL") all_data_gitlab <- left_join(all_data_gitlab, projects_topics, by = c("project_name" = "id")) + # save.image("gitlab.RData") save(all_data_gitlab, file = "gitlab.RData") diff --git a/dev/gitlab_forge.R b/dev/gitlab_forge.R index 6955bc6..ff2f641 100644 --- a/dev/gitlab_forge.R +++ b/dev/gitlab_forge.R @@ -7,7 +7,7 @@ library(gitlabr) set_gitlab_connection( gitlab_url = "https://gitlab-forge.din.developpement-durable.gouv.fr" , - private_token = Sys.getenv("GITLAB_COM_TOKEN") + private_token = Sys.getenv("GITLAB_PAT") ) response <- data.frame() @@ -15,7 +15,7 @@ response <- data.frame() buildres <- function(i){ res_proj100 <- GET( "https://gitlab-forge.din.developpement-durable.gouv.fr/api/v4/groups/1013/projects", - add_headers(`PRIVATE-TOKEN` = Sys.getenv("GITLAB_COM_TOKEN")), + add_headers(`PRIVATE-TOKEN` = Sys.getenv("GITLAB_PAT")), query = list( include_subgroups = "true", per_page = 100, @@ -38,7 +38,7 @@ repeat { } # response <- GET( # "https://gitlab-forge.din.developpement-durable.gouv.fr/api/v4/groups/1013/projects", -# add_headers(`PRIVATE-TOKEN` = Sys.getenv("GITLAB_COM_TOKEN")), +# add_headers(`PRIVATE-TOKEN` = Sys.getenv("GITLAB_PAT")), # query = list( # include_subgroups = "true", # per_page = 1000 @@ -68,12 +68,12 @@ get_project_name <- function(base_url, project_id, private_token) { # Boucle pour récupérer tous les noms de projets name_gitlab <- bind_rows(lapply(project_ids, get_project_name, base_url = "https://gitlab-forge.din.developpement-durable.gouv.fr", - private_token = Sys.getenv("GITLAB_COM_TOKEN"))) + private_token = Sys.getenv("GITLAB_PAT"))) name_gitlab$id <- as.character(name_gitlab$id) # Variables pour l'API GitLab base_url <- "https://gitlab-forge.din.developpement-durable.gouv.fr" -private_token <- Sys.getenv("GITLAB_COM_TOKEN") # Récupération du token depuis Renviron +private_token <- Sys.getenv("GITLAB_PAT") # Récupération du token depuis Renviron # Fonction pour gérer la pagination de l'API GitLab avec une limite stricte à 160 pages, en vérifiant la présence de pages suivantes @@ -278,10 +278,22 @@ projects_topics <- bind_rows(lapply(project_ids, get_project_topics, base_url = # Récupérer les données pour tous les projets all_data_forge <- get_data_from_multiple_projects(base_url, project_ids, private_token) + all_data_forge <- all_data_forge %>% filter(!(is.na(all_data_forge$type) | is.na(all_data_forge$message)) | all_data_forge$type == "joined"|all_data_forge$type == "WikiPage::Meta") all_data_forge <- bind_rows(ff,all_data_forge) all_data_forge <- all_data_forge %>% mutate(origine ="Gitlab_Forge") all_data_forge <- left_join(all_data_forge, projects_topics, by = c("project_name" = "id")) + +#data.frame avec les groupes et le nom pour left join ----- +response_df <- data.frame( + name = response$name, + groupe = response$namespace$path +) +# Joindre les deux jeux de données +all_data_forge <- all_data_forge %>% + left_join(response_df, by = c("project_name" = "name")) + +# sauvegarde du jeu de donnée ----- save(all_data_forge, file = "gitlab_forge.RData") -- GitLab From 4774c2023c846b424735eb7641eb880ab58b9993 Mon Sep 17 00:00:00 2001 From: LE DURAND Matteo <matteo.le-durand@developpement-durable.gouv.fr> Date: Fri, 7 Mar 2025 15:18:09 +0100 Subject: [PATCH 04/27] ajout du package qui permet de faire la recherche de mot --- dev/github_extraire.R | 1 + 1 file changed, 1 insertion(+) diff --git a/dev/github_extraire.R b/dev/github_extraire.R index 167a81e..45ac033 100644 --- a/dev/github_extraire.R +++ b/dev/github_extraire.R @@ -3,6 +3,7 @@ library(httr) library(jsonlite) library(dplyr) library(DT) +library(stringr) # Récupérer le token GitHub depuis l'environnement extract_before_at <- function(email) { -- GitLab From f7a261f70f907a987934826013d146e09d606bde Mon Sep 17 00:00:00 2001 From: LE DURAND Matteo <matteo.le-durand@developpement-durable.gouv.fr> Date: Fri, 7 Mar 2025 15:19:08 +0100 Subject: [PATCH 05/27] =?UTF-8?q?certain=20projet=20on=20=C3=A9t=C3=A9=20r?= =?UTF-8?q?enomme=20et=20dans=20certain=20evenement=20git=20il=20garde=20l?= =?UTF-8?q?'ancien=20donc=20si=20il=20ne=20trouve=20pas=20le=20projet=20il?= =?UTF-8?q?=20test=20avec=20le=20nom=20d'origine?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dev/gitlab_forge.R | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/dev/gitlab_forge.R b/dev/gitlab_forge.R index ff2f641..3ac686a 100644 --- a/dev/gitlab_forge.R +++ b/dev/gitlab_forge.R @@ -286,14 +286,24 @@ all_data_forge <- all_data_forge %>% mutate(origine ="Gitlab_Forge") all_data_forge <- left_join(all_data_forge, projects_topics, by = c("project_name" = "id")) -#data.frame avec les groupes et le nom pour left join ----- +#data.frame avec les groupes et le nom pour left join----- response_df <- data.frame( name = response$name, + name2 = response$path, #name2 car si le projet à changé de nom alors la jointure ne se fait plus par le nom mais par le passage d'origine ce qui corrige grandement le manque d'information groupe = response$namespace$path ) # Joindre les deux jeux de données all_data_forge <- all_data_forge %>% - left_join(response_df, by = c("project_name" = "name")) - -# sauvegarde du jeu de donnée ----- + left_join(response_df, by = c("project_name" = "name")) # Faire un premier left_join() sur la colonne name +all_data_forge <- all_data_forge %>% # Compléter les lignes non appariées avec un second left_join() sur la colonne name2 + left_join( + response_df %>% + select(name2, groupe), # On ne conserve que les colonnes utiles + by = c("project_name" = "name2"), + na_matches = "never" # Empêche l'association des NA + ) %>% + mutate(groupe = coalesce(groupe.x, groupe.y)) %>% # Priorité au 1er join + select(-groupe.x, -groupe.y) # Nettoyage des colonnes temporaires + +# sauvegarde du jeu de donnée----- save(all_data_forge, file = "gitlab_forge.RData") -- GitLab From 0613c724a35700654b419890b409c4b2dad30657 Mon Sep 17 00:00:00 2001 From: LE DURAND Matteo <matteo.le-durand@developpement-durable.gouv.fr> Date: Thu, 13 Mar 2025 10:12:25 +0100 Subject: [PATCH 06/27] les groupes sont dans les fichiers d'extraction maintenants --- global.R | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/global.R b/global.R index d35e2cb..a852564 100644 --- a/global.R +++ b/global.R @@ -28,12 +28,7 @@ load("date_MAJ.RData") all_data <- bind_rows(all_data_gitlab, all_data_forge, combined_data) all_data$updated_at <- as.POSIXct(all_data$updated_at, format = ("%Y-%m-%dT%H:%M:%S")) -all_data <- all_data %>% mutate(message = paste0(type,sep = " : ",message), - categorie = case_when( - str_detect(project_name, "parcours_r") ~ "r-formation", - str_detect(project_name, "spyrales") ~ "spyrales", - TRUE ~ "autre" - )) +all_data <- all_data %>% mutate(message = paste0(type,sep = " : ",message)) # transformation author ---- all_data$author <- all_data$author %>% tolower() %>% @@ -51,7 +46,7 @@ traduction <- c( "WikiPage::Meta" = "Documentation", "joined" = "Gestion de projet" , "WorkItem" = "Gestion de projet" , - "MergeRequest" = "Code" , + "MergeRequest" = "Code" , # ajouter un "item" merge ? "Milestone" = "Gestion de projet" ) all_data <- all_data %>% dplyr::mutate(re_code = dplyr::recode(type , !!!traduction)) -- GitLab From 0266e07ff454b2b37150094165168eaaa16d2aa9 Mon Sep 17 00:00:00 2001 From: LE DURAND Matteo <matteo.le-durand@developpement-durable.gouv.fr> Date: Thu, 13 Mar 2025 10:13:29 +0100 Subject: [PATCH 07/27] =?UTF-8?q?changement=20de=20r=C3=A9cup=C3=A9ration,?= =?UTF-8?q?=20maintenant=20on=20gader=20que=20les=20id=20en=20nombre=20et?= =?UTF-8?q?=20ensuite=20on=20join=20grace=20=C3=A0=20response=20qui=20?= =?UTF-8?q?=C3=A0=20beaucoup=20d'info=20comme=20le=20nom,=20le=20groupe=20?= =?UTF-8?q?et=20le=20topics?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dev/gitlab_forge.R | 59 ++++++++++------------------------------------ 1 file changed, 13 insertions(+), 46 deletions(-) diff --git a/dev/gitlab_forge.R b/dev/gitlab_forge.R index 3ac686a..bafacb2 100644 --- a/dev/gitlab_forge.R +++ b/dev/gitlab_forge.R @@ -155,7 +155,7 @@ get_gitlab_issues <- function(base_url, project_id, private_token) { data <- get_all_pages(api_url, private_token) data <- data %>% mutate( - project_name = extract_project_name(web_url), + project_name = as.character(project_id), type = "issue", message = as.character(title), author = author.username @@ -191,7 +191,7 @@ get_gitlab_events <- function(base_url, project_id, private_token) { updated_at = created_at, author = author.username )%>% - left_join(name_gitlab, by = c("project_name" = "id")) %>% + # left_join(name_gitlab, by = c("project_name" = "id")) %>% mutate(project_name = name) %>% select(-name) return(data %>% select(project_name, type, message, updated_at, author)) @@ -212,29 +212,6 @@ get_data_from_multiple_projects <- function(base_url, project_ids, private_token return(bind_rows(all_data)) } -get_project_topics <- function(base_url, project_id, private_token) { - api_url <- paste0(base_url, "/api/v4/projects/", project_id) - response <- GET(api_url, add_headers("PRIVATE-TOKEN" = private_token)) - - if (status_code(response) == 200) { - project_info <- fromJSON(content(response, "text", encoding = "UTF-8"), flatten = TRUE) - return(data.frame( - id = as.character(project_info$name), - topics = paste(project_info$topics, collapse = ", "), # Combine les topics en une chaîne de caractères - stringsAsFactors = FALSE - )) - } else { - warning("Impossible de récupérer les topics pour le projet ID: ", project_id, " - Code: ", status_code(response)) - return(data.frame( - id = project_id, - topics = NA, - stringsAsFactors = FALSE - )) - } -} -extract_before_at <- function(email) { - sub("@.*", "", email) -} ########################################################### process_projects <- function(project_ids) { result_list <- lapply(project_ids, function(project_id) { @@ -265,17 +242,14 @@ process_projects <- function(project_ids) { final_result <- process_projects(project_ids) final_result$project_id <- as.character(final_result$project_id) -final_result <- final_result %>% left_join(name_gitlab, by = c("project_id" = "id")) %>% - mutate(project_name = name, type = "commit") %>% - select(-name) -final_result <- final_result %>% mutate(author = extract_before_at(committer_email)) -final_result <- final_result %>% rename( "updated_at" = 'committed_date' ) +# final_result <- final_result %>% left_join(name_gitlab, by = c("project_id" = "id")) %>% +# mutate(project_name = name, type = "commit") %>% +# select(-name) +final_result <- final_result %>% mutate(author = committer_email,type = "commit") +final_result <- final_result %>% rename( "updated_at" = 'committed_date', "project_name" = 'project_id' ) ff <- final_result %>% filter(is_duplicate == FALSE) %>% select(project_name,type , message ,updated_at,author) ########################################################### -# Récupérer les topics pour tous les projets -projects_topics <- bind_rows(lapply(project_ids, get_project_topics, base_url = base_url, private_token = private_token)) - # Récupérer les données pour tous les projets all_data_forge <- get_data_from_multiple_projects(base_url, project_ids, private_token) @@ -284,26 +258,19 @@ all_data_forge <- all_data_forge %>% all_data_forge <- bind_rows(ff,all_data_forge) all_data_forge <- all_data_forge %>% mutate(origine ="Gitlab_Forge") -all_data_forge <- left_join(all_data_forge, projects_topics, by = c("project_name" = "id")) #data.frame avec les groupes et le nom pour left join----- response_df <- data.frame( + id = as.character(response$id), name = response$name, - name2 = response$path, #name2 car si le projet à changé de nom alors la jointure ne se fait plus par le nom mais par le passage d'origine ce qui corrige grandement le manque d'information - groupe = response$namespace$path + groupe = response$namespace$name, + topics = sapply(response$topics, function(x) paste(x, collapse = ", ")) # on degroupe et regroupe ?? mais ca fonctionne ) # Joindre les deux jeux de données all_data_forge <- all_data_forge %>% - left_join(response_df, by = c("project_name" = "name")) # Faire un premier left_join() sur la colonne name -all_data_forge <- all_data_forge %>% # Compléter les lignes non appariées avec un second left_join() sur la colonne name2 - left_join( - response_df %>% - select(name2, groupe), # On ne conserve que les colonnes utiles - by = c("project_name" = "name2"), - na_matches = "never" # Empêche l'association des NA - ) %>% - mutate(groupe = coalesce(groupe.x, groupe.y)) %>% # Priorité au 1er join - select(-groupe.x, -groupe.y) # Nettoyage des colonnes temporaires + left_join(response_df, by = c("project_name" = "id")) # Faire un premier left_join() sur la colonne name + # sauvegarde du jeu de donnée----- +all_data_forge <- all_data_forge %>% select(name , type, message , updated_at , author , topics, origine,groupe) save(all_data_forge, file = "gitlab_forge.RData") -- GitLab From a905a4522cec012721b27cda27cc9b254269596d Mon Sep 17 00:00:00 2001 From: LE DURAND Matteo <matteo.le-durand@developpement-durable.gouv.fr> Date: Fri, 14 Mar 2025 16:18:28 +0100 Subject: [PATCH 08/27] les groupes, les topics sont automatiques et le noms des projets aussi , attention les auteurs sont encore sous formes de mail --- dev/gitlab_classique.R | 95 ++++++++++++++++++++++-------------------- 1 file changed, 50 insertions(+), 45 deletions(-) diff --git a/dev/gitlab_classique.R b/dev/gitlab_classique.R index cd71b90..780fde6 100644 --- a/dev/gitlab_classique.R +++ b/dev/gitlab_classique.R @@ -9,6 +9,32 @@ set_gitlab_connection( gitlab_url = "https://gitlab.com" , private_token = Sys.getenv("GITLAB_COM_TOKEN") ) +response <- data.frame() +# on charge les projets du groupe CSD +buildres <- function(i){ + res_proj100 <- GET( + "https://gitlab.com/api/v4/groups/6567080/projects", + add_headers(`PRIVATE-TOKEN` = Sys.getenv("GITLAB_COM_TOKEN")), + query = list( + include_subgroups = "true", + per_page = 100, + page = i + ), + timeout(120) # Timeout augmenté pour les projets + ) + res <- content(res_proj100, as = "text", encoding = "UTF-8") %>% fromJSON() + return(res) +} +#on réalise une boucle si plus de 100 projets +x <- 1 +repeat { + res <- buildres(x) + if (length(res) == 0) { + break + } + response <- bind_rows(response, res) + x <- x + 1 +} project_ids <- c(41600697, 19859695, 49118792, 21138017, 44145525, 18441361, 17610613,18439010) get_project_name <- function(base_url, project_id, private_token) { @@ -103,10 +129,7 @@ get_all_pages <- function(url, private_token, max_retries = 3, max_pages = 159) -# Fonction pour extraire le nom du projet à partir de l'URL -extract_project_name <- function(web_url) { - str_extract(web_url, "(?<=/)[^/]+(?=/-/)") -} + # Fonction pour récupérer les issues d'un projet GitLab get_gitlab_issues <- function(base_url, project_id, private_token) { @@ -114,10 +137,10 @@ get_gitlab_issues <- function(base_url, project_id, private_token) { data <- get_all_pages(api_url, private_token) data <- data %>% mutate( - project_name = extract_project_name(web_url), + project_name = as.character(project_id), type = "issue", message = title, - author = author.username + author = paste0(author.username,"@developpement-durable.gouv.fr") ) return(data %>% select(project_name, type, message, updated_at, author)) } @@ -148,11 +171,9 @@ get_gitlab_events <- function(base_url, project_id, private_token) { ), updated_at = created_at, - author = author.username - ) %>% - left_join(name_gitlab, by = c("project_name" = "id")) %>% - mutate(project_name = name) %>% - select(-name) + author = paste0(author.username,"@developpement-durable.gouv.fr") + ) + return(data %>% select(project_name, type, message, updated_at, author)) } @@ -171,30 +192,6 @@ get_data_from_multiple_projects <- function(base_url, project_ids, private_token return(bind_rows(all_data)) } -# Topics -get_project_topics <- function(base_url, project_id, private_token) { - api_url <- paste0(base_url, "/api/v4/projects/", project_id) - response <- GET(api_url, add_headers("PRIVATE-TOKEN" = private_token)) - - if (status_code(response) == 200) { - project_info <- fromJSON(content(response, "text", encoding = "UTF-8"), flatten = TRUE) - return(data.frame( - id = as.character(project_info$name), - topics = paste(project_info$topics, collapse = ", "), # Combine les topics en une chaîne de caractères - stringsAsFactors = FALSE - )) - } else { - warning("Impossible de récupérer les topics pour le projet ID: ", project_id, " - Code: ", status_code(response)) - return(data.frame( - id = project_id, - topics = NA, - stringsAsFactors = FALSE - )) - } -} -extract_before_at <- function(email) { - sub("@.*", "", email) -} ############################################################### ----- # Fonction générique process_projects <- function(project_ids) { @@ -225,16 +222,12 @@ process_projects <- function(project_ids) { final_result <- process_projects(project_ids) final_result$project_id <- as.character(final_result$project_id) -final_result <- final_result %>% left_join(name_gitlab, by = c("project_id" = "id")) %>% - mutate(project_name = name, type = "commit") %>% - select(-name) -final_result <- final_result %>% mutate(author = extract_before_at(committer_email)) -final_result <- final_result %>% rename( "updated_at" = 'committed_date' ) + +final_result <- final_result %>% mutate(author = committer_email, type = "commit") +final_result <- final_result %>% rename( "updated_at" = 'committed_date',"project_name" = 'project_id' ) fg <- final_result %>% filter(is_duplicate == FALSE) %>% select(project_name,type , message ,updated_at,author) ############################################################### -# Récupérer les topics pour tous les projets -projects_topics <- bind_rows(lapply(project_ids, get_project_topics, base_url = base_url, private_token = private_token)) # Récupérer les données pour tous les projets all_data_gitlab <- get_data_from_multiple_projects(base_url, project_ids, private_token) @@ -242,9 +235,21 @@ all_data_gitlab <- all_data_gitlab %>% filter(!(is.na(all_data_gitlab$type) | is.na(all_data_gitlab$message)) | all_data_gitlab$type == "joined" | all_data_gitlab$type == "WikiPage::Meta") all_data_gitlab <- bind_rows(fg,all_data_gitlab) all_data_gitlab <- all_data_gitlab %>% - mutate(origine ="Gitlab", - groupe = "RDES_DREAL") -all_data_gitlab <- left_join(all_data_gitlab, projects_topics, by = c("project_name" = "id")) + mutate(origine ="Gitlab") + +#data.frame avec les groupes et le nom pour left join----- +response_df <- data.frame( + id = as.character(response$id), + name = response$name, + groupe = response$namespace$name, + topics = sapply(response$topics, function(x) paste(x, collapse = ", ")) # on degroupe et regroupe ?? mais ca fonctionne +) +# Joindre les deux jeux de données +all_data_gitlab <- all_data_gitlab %>% + left_join(response_df, by = c("project_name" = "id")) # Faire un premier left_join() sur la colonne name +all_data_gitlab$author <- tolower(all_data_gitlab$author) +# sauvegarde du jeu de donnée----- +all_data_gitlab <- all_data_gitlab %>% select(name , type, message , updated_at , author , topics, origine,groupe) # save.image("gitlab.RData") save(all_data_gitlab, file = "gitlab.RData") -- GitLab From 20916ff772750c93abf5bd56f58b7ceac93a88f0 Mon Sep 17 00:00:00 2001 From: LE DURAND Matteo <matteo.le-durand@developpement-durable.gouv.fr> Date: Fri, 14 Mar 2025 16:19:00 +0100 Subject: [PATCH 09/27] les auteurs sont en mail pour plus tard avec l'annuaire les memttre en propre --- dev/gitlab_forge.R | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/dev/gitlab_forge.R b/dev/gitlab_forge.R index bafacb2..bb3396e 100644 --- a/dev/gitlab_forge.R +++ b/dev/gitlab_forge.R @@ -158,7 +158,7 @@ get_gitlab_issues <- function(base_url, project_id, private_token) { project_name = as.character(project_id), type = "issue", message = as.character(title), - author = author.username + author = paste0(author.username,"@developpement-durable.gouv.fr") ) return(data %>% select(project_name, type, message, updated_at, author)) } @@ -189,7 +189,7 @@ get_gitlab_events <- function(base_url, project_id, private_token) { ), updated_at = created_at, - author = author.username + author = paste0(author.username,"@developpement-durable.gouv.fr") )%>% # left_join(name_gitlab, by = c("project_name" = "id")) %>% mutate(project_name = name) %>% @@ -242,9 +242,7 @@ process_projects <- function(project_ids) { final_result <- process_projects(project_ids) final_result$project_id <- as.character(final_result$project_id) -# final_result <- final_result %>% left_join(name_gitlab, by = c("project_id" = "id")) %>% -# mutate(project_name = name, type = "commit") %>% -# select(-name) + final_result <- final_result %>% mutate(author = committer_email,type = "commit") final_result <- final_result %>% rename( "updated_at" = 'committed_date', "project_name" = 'project_id' ) ff <- final_result %>% filter(is_duplicate == FALSE) %>% select(project_name,type , message ,updated_at,author) @@ -269,7 +267,7 @@ response_df <- data.frame( # Joindre les deux jeux de données all_data_forge <- all_data_forge %>% left_join(response_df, by = c("project_name" = "id")) # Faire un premier left_join() sur la colonne name - +all_data_forge$author <- tolower(all_data_forge$author) # sauvegarde du jeu de donnée----- all_data_forge <- all_data_forge %>% select(name , type, message , updated_at , author , topics, origine,groupe) -- GitLab From 111ef8691ad298863f731e9015eb7c75622ee4e6 Mon Sep 17 00:00:00 2001 From: LE DURAND Matteo <matteo.le-durand@developpement-durable.gouv.fr> Date: Fri, 14 Mar 2025 16:20:06 +0100 Subject: [PATCH 10/27] =?UTF-8?q?ajout=20de=20l'annuaire=20qui=20sera=20re?= =?UTF-8?q?noubl=C3=A9=20prochainement=20grace=20au=20script=20puis=20emai?= =?UTF-8?q?l=20total=20qui=20permet=20de=20corriger=20certaine=20addresse?= =?UTF-8?q?=20qui=20ont=20eu=20des=20bugs(fait=20=C3=A0=20la=20main)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- annuaire/annuaire.csv | 33 +++++++++++++++++++++++++ annuaire/email_total.csv | 52 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 85 insertions(+) create mode 100644 annuaire/annuaire.csv create mode 100644 annuaire/email_total.csv diff --git a/annuaire/annuaire.csv b/annuaire/annuaire.csv new file mode 100644 index 0000000..baa1715 --- /dev/null +++ b/annuaire/annuaire.csv @@ -0,0 +1,33 @@ +"Civilité","Prénom","Nom","Observation","Unité","Adresse","Code postal","Ville","Messagerie","Téléphone","Mobile","Fax","Pièce","Description","Fonction hiérarchique","Fonction métier","Missions" +"Mme","Christelle","BELKACEM","Directrice de projet connaissance","DREAL Pays Loire/SCTE","5 rue Françoise Giroud CS 16326","44263","NANTES cedex 2","christelle.belkacem@developpement-durable.gouv.fr","02 72 74 74 50","06 20 58 46 22","","B 316","","","","", +"Mme","Anne","CAILLAUD","","DREAL Pays Loire/SCTE","5 rue Françoise Giroud CS 16326","44263","NANTES cedex 2","Anne.Caillaud@developpement-durable.gouv.fr","02 72 74 74 42","","","B 315","","","","", +"Mme","Malaurie","CHANUT","","DREAL Pays Loire/SCTE/DEE","5 rue Françoise Giroud CS 16326","44263","NANTES cedex 2","malaurie.chanut@developpement-durable.gouv.fr","02 72 74 74 62","","","A305","","","","", +"M.","Benoit","CORNIC","","DREAL Pays Loire/SCTE/DAP","5 rue Françoise Giroud CS 16326","44263","NANTES cedex 2","benoit.cornic@developpement-durable.gouv.fr","02 72 74 74 92","07 60 71 49 56","","B 309b","","","","", +"M.","Luc","DE ROSA","","DREAL Pays Loire/SCTE/DEE","5 rue Françoise Giroud CS 16326","44263","NANTES cedex 2","Luc.De-rosa@developpement-durable.gouv.fr","02 72 74 74 67","","02 72 74 74 49","A 315","Chef de projet géomatique","","","", +"M.","Denis","DOUILLARD","","DREAL Pays Loire/SCTE/CSD","5 rue Françoise Giroud CS 16326","44263","NANTES cedex 2","denis.douillard@developpement-durable.gouv.fr","02 72 74 74 51","","","B 310","Chargé d'études","","","", +"Mme","Valérie","DUBOURG-GOURTNER","","DREAL Pays Loire/SCTE/DEE","5 rue Françoise Giroud CS 16326","44263","NANTES cedex 2","Valerie.DUBOURG-GOURTNER@developpement-durable.gouv.fr","02 72 74 74 63","","","A 302","","","","", +"M.","Clément","DURMORT","Apprenti","DREAL Pays Loire/SCTE/DAP","5 rue Françoise Giroud CS 16326","44263","NANTES cedex 2","clement.durmort@developpement-durable.gouv.fr","02 72 74 74 93","","","B 309","Apprenti, arrivée le 11/09/2023, départ prévu le 27/06/2023","","","", +"Mme","Juliette","ENGELAERE-LEFEBVRE","Responsable du Centre de services de la donnée","DREAL Pays Loire/SCTE/CSD","5 rue Françoise Giroud CS 16326","44263","NANTES cedex 2","Juliette.Engelaere@developpement-durable.gouv.fr","02 72 74 74 55","","","A 309","","","","", +"Mme","Christine","GALLAIS-JOUADET","","DREAL Pays Loire/SCTE/CSD","5 rue Françoise Giroud CS 16326","44263","NANTES cedex 2","christine.gallais-jouadet@developpement-durable.gouv.fr","02 72 74 74 78","","","A311","Cheffe de projets géomatiques, spécialité données foncières","","","", +"M.","Franck","GASPARD","","DREAL Pays Loire/SCTE/CSD","5 rue Françoise Giroud CS 16326","44263","NANTES cedex 2","Franck.Gaspard@developpement-durable.gouv.fr","02 72 74 74 56","","","A 307","Analyste de données","","","", +"Mme","Gaëtane","GERGAUD","","DREAL Pays Loire/SCTE/DEE","5 rue Françoise Giroud CS 16326","44263","NANTES cedex 2","gaetane.gergaud@developpement-durable.gouv.fr","02 72 74 74 69","","","A301","","","","", +"Mme","Laurence","GUICHET","","DREAL Pays Loire/SCTE/DEE","5 rue Françoise Giroud CS 16326","44263","NANTES cedex 2","laurence.guichet@developpement-durable.gouv.fr","02 72 74 74 66","","","A304","","","","", +"M.","Daniel","KALIOUDJOGLOU","","DREAL Pays Loire/SCTE/CSD","5 rue Françoise Giroud CS 16326","44263","NANTES cedex 2","Daniel.Kalioudjoglou@developpement-durable.gouv.fr","02 72 74 74 52","","02 74 74 74 49","A 308","Analyste de données","","","", +"Mme","Pauline","KUPERMINC","","DREAL Pays Loire/SCTE","5 rue Françoise Giroud CS 16326","44263","NANTES cedex 2","pauline.kuperminc@developpement-durable.gouv.fr","02 72 74 74 43","","02 72 74 74 49","B 315","contractuelle jusqu'au 30/04/2027","","","", +"M.","Matteo","LE DURAND","Apprenti","DREAL Pays Loire/SCTE/CSD","5 rue Françoise Giroud CS 16326","44263","NANTES cedex 2","matteo.le-durand@developpement-durable.gouv.fr","02 72 74 74 57","","","A 309","","","","", +"Mme","Annaig","LE MEUR","Cheffe de service","DREAL Pays Loire/SCTE","5 rue Françoise Giroud CS 16326","44263","NANTES cedex 2","annaig.le-meur@developpement-durable.gouv.fr","02 72 74 74 44","06 03 57 55 11","","B312","","","","", +"M.","Stéphane","LE MOING","","DREAL Pays Loire/SCTE/DEE","5 rue Françoise Giroud CS 16326","44263","NANTES cedex 2","Stephane.Le-moing@developpement-durable.gouv.fr","02 72 74 74 60","06 99 98 47 77","","A318","","","","", +"M.","Xavier","MILARET","","DREAL Pays Loire/SCTE/DEE","5 rue Françoise Giroud CS 16326","44263","NANTES cedex 2","xavier.milaret@developpement-durable.gouv.fr","02 72 74 74 59","","","A306","","","","", +"M.","Edouard","MORIN","","DREAL Pays Loire/SCTE/CSD","5 rue Françoise Giroud CS 16326","44263","NANTES cedex 2","edouard.morin@developpement-durable.gouv.fr","02 72 74 74 76","","","A310","","","","", +"Mme","Célia","PEOC'H","","DREAL Pays Loire/SCTE/DAP","5 rue Françoise Giroud CS 16326","44263","NANTES cedex 2","celia.peoc-h@developpement-durable.gouv.fr","02 72 74 74 54","","","B 311","","","","", +"M.","David","PIERRE","","DREAL Pays Loire/SCTE/DEE","5 rue Françoise Giroud CS 16326","44263","NANTES cedex 2","david.pierre@developpement-durable.gouv.fr","02 72 74 74 68","06 58 35 98 59","02 72 74 74 49","A 303","Chargé de mission pour la Vendée hors littoral","","","", +"M.","Eric","RENAULT","","DREAL Pays Loire/SCTE/DEE","5 rue Françoise Giroud CS 16326","44263","NANTES cedex 2","eric.renault@developpement-durable.gouv.fr","02 72 74 74 65","07 64 40 70 99","","A 322","","","","", +"Mme","Enora","ROUSSE-DANAIS","Apprentie","DREAL Pays Loire/SCTE/DEE","5 rue Françoise Giroud CS 16326","44263","NANTES cedex 2","enora.rousse-danais@developpement-durable.gouv.fr","02 72 74 74 58","","","A 300","apprentie présente du 09/09/2024 au 10/09/2025","","","", +"M.","Alexis","ROY","","DREAL Pays Loire/SCTE/DEE","5 rue Françoise Giroud CS 16326","44263","NANTES cedex 2","alexis.roy@developpement-durable.gouv.fr","02 72 74 76 46","","","","","","","", +"Mme","Anne-Cécile","SIMON","","DREAL Pays Loire/SCTE/CSD","5 rue Françoise Giroud CS 16326","44263","NANTES cedex 2","anne-cecile.simon@developpement-durable.gouv.fr","02 72 74 74 75","","02 72 74 74 49","A313","Géomaticienne spécialiste data","","","", +"Mme","Lisa","SMAH","Apprentie","DREAL Pays Loire/SCTE/CSD","5 rue Françoise Giroud CS 16326","44263","NANTES cedex 2","lisa.smah@developpement-durable.gouv.fr","02 72 74 74 53","07 55 98 55 40","","A 300","","","","", +"M.","Philippe","TERME","Chef de projets et administrateur de données","DREAL Pays Loire/SCTE/CSD","5 rue Françoise Giroud CS 16326","44263","NANTES cedex 2","Philippe.Terme@developpement-durable.gouv.fr","02 72 74 74 83","","","A 314","Chef de projets et administrateur de données","","","", +"Mme","Guylène","THEBAULT","","DREAL Pays Loire/SCTE/DEE","5 rue Françoise Giroud CS 16326","44263","NANTES cedex 2","guylene.thebault@developpement-durable.gouv.fr","02 72 74 74 64","","","A 316","Chargée de mission pour le littoral","","","", +"Mme","Sandrine","VERHAEGHE","Chef de division","DREAL Pays Loire/SCTE/DAP","5 rue Françoise Giroud CS 16326","44263","NANTES cedex 2","sandrine.verhaeghe@developpement-durable.gouv.fr","02 72 74 74 90","06 21 93 12 06","02 72 74 74 40","B 313","","","","", +"Mme","Véronique","VEYSSEYRE-MAUPEU","","DREAL Pays Loire/SCTE/DEE","5 rue Françoise Giroud CS 16326","44263","NANTES cedex 2","veronique.veysseyre-maupeu@developpement-durable.gouv.fr","02 72 74 74 61","06 99 03 00 45","02 72 74 74 49","A 304","","","","", +"M.","Ronan","VIGNARD","Adjoint à la responsable du Centre de services de la donnée","DREAL Pays Loire/SCTE/CSD","5 rue Françoise Giroud CS 16326","44263","NANTES cedex 2","ronan.vignard@developpement-durable.gouv.fr","02 72 74 74 81","06 61 15 42 17","","A312","","","","", diff --git a/annuaire/email_total.csv b/annuaire/email_total.csv new file mode 100644 index 0000000..2f80010 --- /dev/null +++ b/annuaire/email_total.csv @@ -0,0 +1,52 @@ +author,email +denis.douillard@developpement-durable.gouv.frcd,denis.douillard@developpement-durable.gouv.fr +lisa.smah@developpemnt-durable.gouv.fr,lisa.smah@developpement-durable.gouv.fr +alexandra.prevot@developpement-durable.gouv.fr,NA +freddy.lemoux@developpement-durable.gouv.fr,NA +mael.theuliere@developpement-durable.gouv.fr,NA +dataviz@set-pdl-dataviz.dreal-pdl.ad.e2.rie.gouv.fr,NA +anh-van.lu@developpement-durable.gouv.fr,NA +anh-van.lu@dreal.est,NA +sophie.glatre@developpement-durable.gouv.fr,NA +lisa.smahlisa.smah@developpement-durable.gouv.fr,lisa.smah@developpement-durable.gouv.fr +ndeye-coumba.diallo@imt-atlantique.net,NA +nathalie.bourgeais@developpement-durable.gouv.fr,NA +jeanne.da-silveira@developpement-durable.gouv.fr,NA +Juliette.Engelaere@developpement-durable.gouv.fr,juliette.engelaere@developpement-durable.gouv.fr +Daniel.Kalioudjoglou@developpement-durable.gouv.fr,daniel.kalioudjoglou@developpement-durable.gouv.fr +mael.theuliere@gmail.com,NA +philippe.birchen@developpement-durable.gouv.fr,NA +couedel.charlotte@gmail.com,NA +juliette.engelaere@developpement.gouv.fr,juliette.engelaere@developpement-durable.gouv.fr +jean-baptiste.paroissien@anteagroup.fr,NA +sebastien.gilbert@anteagroup.fr,NA +Franck.Gaspard@developpement-durable.gouv.fr,franck.gaspard@developpement-durable.gouv.fr +you@example.com,NA +bruno.lenzi@developpement-durable.gouv.fr,NA +murielle.lethrosne@developpement-durable.gouv.fr,NA +julientaq@gmail.com,NA +diane@thinkr.fr,NA +âronan.vignard@developpement-durable.gouv.f,NA +jdaniel.lomenede@gmail.com,NA +jean-daniel.lomenede@developpement-durable.gouv.fr,NA +JulietteEngelaere@developpement-durable.gouv.fr,juliette.engelaere@developpement-durable.gouv.fr +aurelie.tisserand@developpement-durable.gouv.fr,NA +Philippe.BIRCHEN@developpement-durable.gouv.fr,NA +Philippe.Terme@developpement-durable.gouv.fr,philippe.terme@developpement-durable.gouv.fr +camille.campeon@developpement-durable.gouv.fr,NA +bruno.le-gonidec@developpement-durable.gouv.fr,NA +jean-baptiste.paroissien@developpement-durable.gouv.fr,NA +Francois-Jacques.chenais@developpement-durable.gouv.fr,NA +denis.douillard@developpement-durable.gouv.fr,denis.douillard@developpement-durable.gouv.fr +edouard.morin@developpement-durable.gouv.fr,edouard.morin@developpement-durable.gouv.fr +lisa.smah@developpement-durable.gouv.fr,lisa.smah@developpement-durable.gouv.fr +ronan.vignard@developpement-durable.gouv.fr,ronan.vignard@developpement-durable.gouv.fr +juliette.engelaere@developpement-durable.gouv.fr,juliette.engelaere@developpement-durable.gouv.fr +christine.gallais-jouadet@developpement-durable.gouv.fr,christine.gallais-jouadet@developpement-durable.gouv.fr +philippe.terme@developpement-durable.gouv.fr,philippe.terme@developpement-durable.gouv.fr +christelle.belkacem@developpement-durable.gouv.fr,christelle.belkacem@developpement-durable.gouv.fr +franck.gaspard@developpement-durable.gouv.fr,franck.gaspard@developpement-durable.gouv.fr +anne-cecile.simon@developpement-durable.gouv.fr,anne-cecile.simon@developpement-durable.gouv.fr +daniel.kalioudjoglou@developpement-durable.gouv.fr,daniel.kalioudjoglou@developpement-durable.gouv.fr +matteo.le-durand@developpement-durable.gouv.fr,matteo.le-durand@developpement-durable.gouv.fr +celia.peoc-h@developpement-durable.gouv.fr,celia.peoc-h@developpement-durable.gouv.fr -- GitLab From daf139509e535c45b7a63c679d6fff5672624c38 Mon Sep 17 00:00:00 2001 From: LE DURAND Matteo <matteo.le-durand@developpement-durable.gouv.fr> Date: Mon, 17 Mar 2025 16:18:29 +0100 Subject: [PATCH 11/27] ajout de la correspondance des nom avec l'annuaire et le filtre de l'annuaire --- global.R | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/global.R b/global.R index a852564..f93b16e 100644 --- a/global.R +++ b/global.R @@ -20,20 +20,28 @@ library(bizdays) library(shinyWidgets) library(textclean) library(stringi) +library(readr) # chargement des données (résultat du script "dev/script_chargement_rdata.R") load("github.RData") load("gitlab_forge.RData") load("gitlab.RData") load("date_MAJ.RData") + +email_table <- read_csv("annuaire/email_total.csv") + +annuaire <- read_csv("annuaire/annuaire.csv") +annuaire$Messagerie <- tolower(annuaire$Messagerie) +annuaire <- annuaire %>% rename( email = Messagerie) +annuaire <- annuaire %>% mutate(auteur = paste(Prénom, Nom))%>% select(email, auteur) + all_data <- bind_rows(all_data_gitlab, all_data_forge, combined_data) all_data$updated_at <- as.POSIXct(all_data$updated_at, format = ("%Y-%m-%dT%H:%M:%S")) all_data <- all_data %>% mutate(message = paste0(type,sep = " : ",message)) -# transformation author ---- -all_data$author <- all_data$author %>% - tolower() %>% - stri_trans_general("Latin-ASCII") %>% - str_replace_all("[^a-z ]", "") + +all_data <- all_data %>% left_join(email_table) # nettoyage de certaine adresse mail invalide +all_data <- all_data %>% left_join(annuaire) # ajout de auteur des membre du SCTE via l'annuaire + # transformation re_code ---- traduction <- c( @@ -50,6 +58,7 @@ traduction <- c( "Milestone" = "Gestion de projet" ) all_data <- all_data %>% dplyr::mutate(re_code = dplyr::recode(type , !!!traduction)) +all_data <- all_data %>% dplyr::rename(project_name = name) #transformation message all_data$message <- all_data$message %>% tolower() -- GitLab From 46b129a491401e274cf0108c939c8934edce964e Mon Sep 17 00:00:00 2001 From: LE DURAND Matteo <matteo.le-durand@developpement-durable.gouv.fr> Date: Mon, 17 Mar 2025 16:18:47 +0100 Subject: [PATCH 12/27] author -> auteur --- server.R | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/server.R b/server.R index 90e2c87..fe4dc3e 100644 --- a/server.R +++ b/server.R @@ -28,7 +28,7 @@ server <- function(input, output, session) { r$filteredData <- r$filteredByDate %>% filter( (if (length(input$topics)) sapply(input$topics, function(t) grepl(t, topics)) %>% rowSums() > 0 else TRUE) & - (if (length(input$author)) author %in% input$author else TRUE) & + (if (length(input$auteur)) auteur %in% input$auteur else TRUE) & (if (length(input$re_code)) re_code %in% input$re_code else TRUE) & (if (length(input$categorie)) categorie %in% input$categorie else TRUE) ) @@ -45,7 +45,7 @@ server <- function(input, output, session) { .[. != ""] %>% # Supprime les chaînes vides trimws() %>% # suppremie les espace avnt et apres unique() , selected = input$topics) - updateSelectizeInput(session, "author", choices = unique(r$filteredByDate$author), selected = input$author) + updateSelectizeInput(session, "author", choices = unique(r$filteredByDate$auteur), selected = input$auteur) updateSelectizeInput(session, "categorie", choices = unique(r$filteredByDate$categorie), selected = input$categorie) # Basé uniquement sur les données globales pour éviter que project_name soit affecté -- GitLab From c3665aa7adea38e5a0045c0794e47df82e6b49ab Mon Sep 17 00:00:00 2001 From: LE DURAND Matteo <matteo.le-durand@developpement-durable.gouv.fr> Date: Mon, 17 Mar 2025 16:19:02 +0100 Subject: [PATCH 13/27] author -> auteur --- ui.R | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/ui.R b/ui.R index 5411578..d2e1e24 100644 --- a/ui.R +++ b/ui.R @@ -31,15 +31,6 @@ ui <- shinygouv::navbarPage_dsfr( extra_class = "fr-mt-6w" ), shinygouv::column_dsfr( - 3, - selectizeInput( - inputId = "project_name", - label = "Projet : ", - choices = NULL, - multiple = TRUE - ),extra_class = "fr-mt-6w" - ), - column_dsfr( 3, selectizeInput( inputId = "topics", @@ -53,6 +44,15 @@ ui <- shinygouv::navbarPage_dsfr( unique() , # Extrait les éléments uniques multiple = TRUE + ),extra_class = "fr-mt-6w" + ), + column_dsfr( + 3, + selectizeInput( + inputId = "project_name", + label = "Projet : ", + choices = NULL, + multiple = TRUE ),extra_class = "fr-mt-6w" ), column_dsfr( @@ -60,7 +60,7 @@ ui <- shinygouv::navbarPage_dsfr( selectizeInput( inputId = "author", label = "Auteur :", - choices = unique(str_to_title(replace_non_ascii(all_data$author))), + choices = unique(str_to_title(replace_non_ascii(all_data$auteur))), selected = NULL, multiple = TRUE ),extra_class = "fr-mt-6w" -- GitLab From e708462b79fedd4b967652577ac09ea333f377df Mon Sep 17 00:00:00 2001 From: LE DURAND Matteo <matteo.le-durand@developpement-durable.gouv.fr> Date: Mon, 17 Mar 2025 16:19:22 +0100 Subject: [PATCH 14/27] ajout de quelque correspondance --- annuaire/email_total.csv | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/annuaire/email_total.csv b/annuaire/email_total.csv index 2f80010..07dcf0a 100644 --- a/annuaire/email_total.csv +++ b/annuaire/email_total.csv @@ -50,3 +50,8 @@ anne-cecile.simon@developpement-durable.gouv.fr,anne-cecile.simon@developpement- daniel.kalioudjoglou@developpement-durable.gouv.fr,daniel.kalioudjoglou@developpement-durable.gouv.fr matteo.le-durand@developpement-durable.gouv.fr,matteo.le-durand@developpement-durable.gouv.fr celia.peoc-h@developpement-durable.gouv.fr,celia.peoc-h@developpement-durable.gouv.fr +julietteengelaere@developpement-durable.gouv.fr,juliette.engelaere@developpement-durable.gouv.fr +christelle_b@developpement-durable.gouv.fr,christelle.belkacem@developpement-durable.gouv.fr +jengelaere@developpement-durable.gouv.fr,juliette.engelaere@developpement-durable.gouv.fr +juliette.engelaere@developpement-durable.gouv.fr,juliette.engelaere@developpement-durable.gouv.fr +juliette.engelaere@developpement.gouv.fr,juliette.engelaere@developpement-durable.gouv.fr -- GitLab From 353d22a6e7ab19938e1db23443021d622e7ae604 Mon Sep 17 00:00:00 2001 From: LE DURAND Matteo <matteo.le-durand@developpement-durable.gouv.fr> Date: Mon, 17 Mar 2025 16:19:59 +0100 Subject: [PATCH 15/27] on remplace le pseudo avec l'email --- dev/github_extraire.R | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/dev/github_extraire.R b/dev/github_extraire.R index 45ac033..c70d252 100644 --- a/dev/github_extraire.R +++ b/dev/github_extraire.R @@ -6,9 +6,7 @@ library(DT) library(stringr) # Récupérer le token GitHub depuis l'environnement -extract_before_at <- function(email) { - sub("@.*", "", email) -} + # Fonction pour récupérer les commits d'un projet GitHub avec clé API get_github_commits <- function(repo) { url <- paste0("https://api.github.com/repos/", repo, "/commits") @@ -18,12 +16,12 @@ get_github_commits <- function(repo) { } commits <- fromJSON(content(response, "text"), flatten = TRUE) commits <- commits %>% - mutate(project_name = repo, # Ajouter le nom du projet + mutate(name = repo, # Ajouter le nom du projet type = "commit", # Spécifier le type comme "commit" message = commit.message, # Utiliser le message du commit - author = extract_before_at(commit.committer.email) , # Ajout de l'auteur + author = commit.committer.email , # Ajout de l'auteur updated_at = commit.committer.date) %>% # Date de la dernière mise à jour - select(project_name, type, message, updated_at,author) # Conserver les colonnes pertinentes + select(name, type, message, updated_at,author) # Conserver les colonnes pertinentes return(commits) } @@ -36,12 +34,12 @@ get_github_issues <- function(repo) { } issues <- fromJSON(content(response, "text"), flatten = TRUE) issues <- issues %>% - mutate(project_name = repo, # Ajouter le nom du projet + mutate(name = repo, # Ajouter le nom du projet type = "issue", # Spécifier le type comme "issue" message = title, # Utiliser le titre de l'issue author = user.login , # Ajout de l'auteur updated_at = updated_at) %>% # Date de la dernière mise à jour - select(project_name, type, message, updated_at,author) # Conserver les colonnes pertinentes + select(name, type, message, updated_at,author) # Conserver les colonnes pertinentes return(issues) } @@ -52,7 +50,7 @@ get_github_topics <- function(repo) { stop("Failed to fetch topics from GitHub API for repo: ", repo) } topics <- fromJSON(content(response, "text"), flatten = TRUE)$names - return(data.frame(project_name = repo, topics = paste(topics, collapse = ", "))) # Combine topics en une chaîne unique + return(data.frame(name = repo, topics = paste(topics, collapse = ", "))) # Combine topics en une chaîne unique } @@ -152,11 +150,11 @@ get_github_topics <- function(repo) { commits_analyse_spatiale, issues_analyse_spatiale ) combined_data <- combined_data %>% - left_join(topics_list, by = "project_name") %>% + left_join(topics_list, by = "name") %>% mutate(origine = "Github", groupe = case_when( - str_detect(project_name, "parcours_r") ~ "r-formation", - str_detect(project_name, "spyrales") ~ "spyrales", + str_detect(name, "parcours_r") ~ "r-formation", + str_detect(name, "spyrales") ~ "spyrales", TRUE ~ "autre" )) %>% unique() -- GitLab From ba96092decc3e3f2c2f376f9a1ac14ff0330dd10 Mon Sep 17 00:00:00 2001 From: LE DURAND Matteo <matteo.le-durand@developpement-durable.gouv.fr> Date: Tue, 18 Mar 2025 11:08:32 +0100 Subject: [PATCH 16/27] ajout du filtre CSD sur l'annuaire + etiquette qui rassemble topics et groupe --- global.R | 2 ++ 1 file changed, 2 insertions(+) diff --git a/global.R b/global.R index f93b16e..3643d78 100644 --- a/global.R +++ b/global.R @@ -33,6 +33,7 @@ email_table <- read_csv("annuaire/email_total.csv") annuaire <- read_csv("annuaire/annuaire.csv") annuaire$Messagerie <- tolower(annuaire$Messagerie) annuaire <- annuaire %>% rename( email = Messagerie) +annuaire <- annuaire %>% filter( str_detect(Unité,"CSD" ) ) annuaire <- annuaire %>% mutate(auteur = paste(Prénom, Nom))%>% select(email, auteur) all_data <- bind_rows(all_data_gitlab, all_data_forge, combined_data) @@ -42,6 +43,7 @@ all_data <- all_data %>% mutate(message = paste0(type,sep = " : ",message)) all_data <- all_data %>% left_join(email_table) # nettoyage de certaine adresse mail invalide all_data <- all_data %>% left_join(annuaire) # ajout de auteur des membre du SCTE via l'annuaire +all_data <- all_data %>% dplyr::mutate(etiquette = paste(groupe,topics,sep = ",")) # transformation re_code ---- traduction <- c( -- GitLab From 1ff794ec5b9d0df524307d52bb4fac9a5a0f5d02 Mon Sep 17 00:00:00 2001 From: LE DURAND Matteo <matteo.le-durand@developpement-durable.gouv.fr> Date: Tue, 18 Mar 2025 11:09:13 +0100 Subject: [PATCH 17/27] topics remplacer par etiquette qui est = topics + groupe --- server.R | 10 +++++----- ui.R | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/server.R b/server.R index fe4dc3e..7e6b438 100644 --- a/server.R +++ b/server.R @@ -2,7 +2,7 @@ server <- function(input, output, session) { r <- reactiveValues( filteredData = all_data, filteredByProject = all_data, # Étape intermédiaire filtrée par daterange et project_name - filteredTopics = NULL, + filteredetiquette = NULL, filteredProjects = NULL, filteredAuthors = NULL, filteredReCodes = NULL, @@ -27,7 +27,7 @@ server <- function(input, output, session) { req(input$daterange) r$filteredData <- r$filteredByDate %>% filter( - (if (length(input$topics)) sapply(input$topics, function(t) grepl(t, topics)) %>% rowSums() > 0 else TRUE) & + (if (length(input$etiquette)) sapply(input$etiquette, function(t) grepl(t, etiquette)) %>% rowSums() > 0 else TRUE) & (if (length(input$auteur)) auteur %in% input$auteur else TRUE) & (if (length(input$re_code)) re_code %in% input$re_code else TRUE) & (if (length(input$categorie)) categorie %in% input$categorie else TRUE) @@ -38,13 +38,13 @@ server <- function(input, output, session) { # Fonction de mise à jour des choix pour les filtres updateFilters <- reactive({ # Basé sur les données filtrées par date et projet - updateSelectizeInput(session, "topics", choices = unique(r$filteredByDate$topics)%>% + updateSelectizeInput(session, "etiquette", choices = unique(r$filteredByDate$etiquette)%>% strsplit(split = ",") %>% # Divise les chaînes en éléments séparés unlist() %>% # Aplatit la liste obtenue na.omit() %>% # Supprime les NA (au cas où) .[. != ""] %>% # Supprime les chaînes vides trimws() %>% # suppremie les espace avnt et apres - unique() , selected = input$topics) + unique() , selected = input$etiquette) updateSelectizeInput(session, "author", choices = unique(r$filteredByDate$auteur), selected = input$auteur) updateSelectizeInput(session, "categorie", choices = unique(r$filteredByDate$categorie), selected = input$categorie) @@ -58,7 +58,7 @@ server <- function(input, output, session) { filter(updated_at >= as.Date(input$daterange[[1]]) & updated_at <= as.Date(input$daterange[[2]])) r$filteredData <- r$filteredByDate - updateSelectizeInput(session, "topics", selected = NULL) + updateSelectizeInput(session, "etiquette", selected = NULL) updateSelectizeInput(session, "author", selected = NULL) updateSelectizeInput(session, "categorie", selected = NULL) updateFilters() diff --git a/ui.R b/ui.R index d2e1e24..b61cb63 100644 --- a/ui.R +++ b/ui.R @@ -33,9 +33,9 @@ ui <- shinygouv::navbarPage_dsfr( shinygouv::column_dsfr( 3, selectizeInput( - inputId = "topics", + inputId = "etiquette", label = "Étiquette :", - choices = all_data$topics %>% + choices = all_data$etiquette %>% strsplit(split = ",") %>% # Divise les chaînes en éléments séparés unlist() %>% # Aplatit la liste obtenue na.omit() %>% # Supprime les NA (au cas où) -- GitLab From af81c2b9d2f2b64a1d9cb644c6d6c11f14ab9801 Mon Sep 17 00:00:00 2001 From: LE DURAND Matteo <matteo.le-durand@developpement-durable.gouv.fr> Date: Tue, 18 Mar 2025 16:17:56 +0100 Subject: [PATCH 18/27] ajout du package fuzzjoin, on retire la table de correspondance pour que ca soit au max automatique --- global.R | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/global.R b/global.R index 3643d78..f9d2c93 100644 --- a/global.R +++ b/global.R @@ -21,6 +21,7 @@ library(shinyWidgets) library(textclean) library(stringi) library(readr) +library(fuzzyjoin) # chargement des données (résultat du script "dev/script_chargement_rdata.R") load("github.RData") load("gitlab_forge.RData") @@ -32,18 +33,21 @@ email_table <- read_csv("annuaire/email_total.csv") annuaire <- read_csv("annuaire/annuaire.csv") annuaire$Messagerie <- tolower(annuaire$Messagerie) -annuaire <- annuaire %>% rename( email = Messagerie) +annuaire <- annuaire %>% rename( mail = Messagerie) annuaire <- annuaire %>% filter( str_detect(Unité,"CSD" ) ) -annuaire <- annuaire %>% mutate(auteur = paste(Prénom, Nom))%>% select(email, auteur) +annuaire <- annuaire %>% mutate(auteur = paste(Prénom, Nom), + mail_clean = str_remove(mail, "@.*") )%>% select(mail_clean, auteur) all_data <- bind_rows(all_data_gitlab, all_data_forge, combined_data) all_data$updated_at <- as.POSIXct(all_data$updated_at, format = ("%Y-%m-%dT%H:%M:%S")) -all_data <- all_data %>% mutate(message = paste0(type,sep = " : ",message)) +all_data <- all_data %>% mutate(message = paste0(type,sep = " : ",message), + email_clean = str_remove(author, "@.*")) -all_data <- all_data %>% left_join(email_table) # nettoyage de certaine adresse mail invalide -all_data <- all_data %>% left_join(annuaire) # ajout de auteur des membre du SCTE via l'annuaire +all_data <- all_data %>% stringdist_left_join(annuaire,by = c("email_clean" = "mail_clean"), method = "jw", max_dist = 0.25) # ajout de auteur des membre du SCTE via l'annuaire all_data <- all_data %>% dplyr::mutate(etiquette = paste(groupe,topics,sep = ",")) +df <- all_data %>% filter(!is.na(auteur)) %>% select(author,auteur) +distinct(df)%>% datatable() # transformation re_code ---- traduction <- c( -- GitLab From 509daf4623fce8ab427f543cc0b8ae7f183dcad6 Mon Sep 17 00:00:00 2001 From: LE DURAND Matteo <matteo.le-durand@developpement-durable.gouv.fr> Date: Tue, 18 Mar 2025 16:19:54 +0100 Subject: [PATCH 19/27] =?UTF-8?q?update=20:=20plus=20de=20table=20de=20cor?= =?UTF-8?q?respondance=20de=20filtrage=20=C3=A0=20la=20main?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- global.R | 2 -- 1 file changed, 2 deletions(-) diff --git a/global.R b/global.R index f9d2c93..915c8d7 100644 --- a/global.R +++ b/global.R @@ -29,8 +29,6 @@ load("gitlab.RData") load("date_MAJ.RData") -email_table <- read_csv("annuaire/email_total.csv") - annuaire <- read_csv("annuaire/annuaire.csv") annuaire$Messagerie <- tolower(annuaire$Messagerie) annuaire <- annuaire %>% rename( mail = Messagerie) -- GitLab From 1382e603446426e875ff6c0f31461bb07debc0ee Mon Sep 17 00:00:00 2001 From: LE DURAND Matteo <matteo.le-durand@developpement-durable.gouv.fr> Date: Thu, 20 Mar 2025 10:12:19 +0100 Subject: [PATCH 20/27] les auteurs sont maintenant automatique , mais attention il se peux qu'il reste des erreurs --- global.R | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/global.R b/global.R index 915c8d7..1637e9a 100644 --- a/global.R +++ b/global.R @@ -40,12 +40,9 @@ all_data <- bind_rows(all_data_gitlab, all_data_forge, combined_data) all_data$updated_at <- as.POSIXct(all_data$updated_at, format = ("%Y-%m-%dT%H:%M:%S")) all_data <- all_data %>% mutate(message = paste0(type,sep = " : ",message), email_clean = str_remove(author, "@.*")) - -all_data <- all_data %>% stringdist_left_join(annuaire,by = c("email_clean" = "mail_clean"), method = "jw", max_dist = 0.25) # ajout de auteur des membre du SCTE via l'annuaire +all_data <- all_data %>% stringdist_left_join(annuaire,by = c("email_clean" = "mail_clean"), method = "jw", max_dist = 0.265) # ajout de auteur des membre du SCTE via l'annuaire, 75% des auteurs sont du csd all_data <- all_data %>% dplyr::mutate(etiquette = paste(groupe,topics,sep = ",")) -df <- all_data %>% filter(!is.na(auteur)) %>% select(author,auteur) -distinct(df)%>% datatable() # transformation re_code ---- traduction <- c( -- GitLab From f62eeca584e20564516370c1601642635cbded30 Mon Sep 17 00:00:00 2001 From: LE DURAND Matteo <matteo.le-durand@developpement-durable.gouv.fr> Date: Thu, 27 Mar 2025 09:29:19 +0100 Subject: [PATCH 21/27] =?UTF-8?q?update=20de=20package=20et=20ajout=20de?= =?UTF-8?q?=20l'auteur=20dans=20le=20message=20de=20l'=C3=A9venement?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- global.R | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/global.R b/global.R index 1637e9a..6509e82 100644 --- a/global.R +++ b/global.R @@ -4,7 +4,7 @@ library(stringr) library(gitlabr) library(DT) library(shiny) -library(dplyr) +library(tidyverse) library(ggplot2) library(plotly) # remotes::install_github("spyrales/shinygouv") @@ -38,11 +38,12 @@ annuaire <- annuaire %>% mutate(auteur = paste(Prénom, Nom), all_data <- bind_rows(all_data_gitlab, all_data_forge, combined_data) all_data$updated_at <- as.POSIXct(all_data$updated_at, format = ("%Y-%m-%dT%H:%M:%S")) -all_data <- all_data %>% mutate(message = paste0(type,sep = " : ",message), - email_clean = str_remove(author, "@.*")) +all_data <- all_data %>% mutate(email_clean = str_remove(author, "@.*")) all_data <- all_data %>% stringdist_left_join(annuaire,by = c("email_clean" = "mail_clean"), method = "jw", max_dist = 0.265) # ajout de auteur des membre du SCTE via l'annuaire, 75% des auteurs sont du csd all_data <- all_data %>% dplyr::mutate(etiquette = paste(groupe,topics,sep = ",")) +all_data <- all_data %>% mutate(message = paste(type,sep = " : ",message,auteur), + auteur = replace_na(auteur,"autre")) # transformation re_code ---- traduction <- c( -- GitLab From 0ee4838025b84a047ec2ae8d00a876527ed83310 Mon Sep 17 00:00:00 2001 From: LE DURAND Matteo <matteo.le-durand@developpement-durable.gouv.fr> Date: Thu, 27 Mar 2025 09:29:57 +0100 Subject: [PATCH 22/27] =?UTF-8?q?ajout=20de=20COGiter=20et=20lib=C3=A9rati?= =?UTF-8?q?on=20d'espace?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dev/github_extraire.R | 28 ++++++++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/dev/github_extraire.R b/dev/github_extraire.R index c70d252..0e69eb2 100644 --- a/dev/github_extraire.R +++ b/dev/github_extraire.R @@ -118,6 +118,11 @@ get_github_topics <- function(repo) { commits_analyse_spatiale <- get_github_commits(repo_analyse_spatiale) issues_analyse_spatiale <- get_github_issues(repo_analyse_spatiale) + # COGiter + repo_cogiter <- "MaelTheuliere/COGiter" + commits_cogiter <- get_github_commits(repo_cogiter) + issues_cogiter <- get_github_issues(repo_cogiter) + repos <- c( "spyrales/shinygouv", "spyrales/gouvdown", "MTES-MCT/parcours_r_module_applications_shiny", @@ -129,7 +134,8 @@ get_github_topics <- function(repo) { "MTES-MCT/parcours_r_socle_preparation_des_donnees", "MTES-MCT/savoirfR", "MTES-MCT/parcours-r", "MTES-MCT/parcours_r_module_datavisualisation", - "MTES-MCT/parcours_r_module_analyse_spatiale" + "MTES-MCT/parcours_r_module_analyse_spatiale", + "MaelTheuliere/COGiter" ) topics_list <- do.call(rbind, lapply(repos, get_github_topics)) @@ -147,8 +153,26 @@ get_github_topics <- function(repo) { commits_savoirfR, issues_savoirfR, commits_parcours_r, issues_parcours_r, commits_datavisualisation, issues_datavisualisation, - commits_analyse_spatiale, issues_analyse_spatiale + commits_analyse_spatiale, issues_analyse_spatiale, + commits_cogiter,issues_cogiter ) + + rm(commits_shinygouv, issues_shinygouv, + commits_gouvdown, issues_gouvdown, + commits_app_shiny, issues_app_shiny, + commits_ateliers_rpackage, issues_ateliers_rpackage, + commits_multi_dim, issues_multi_dim, + commits_stat_desc, issues_stat_desc, + commits_rmarkdown, issues_rmarkdown, + commits_introduction, issues_introduction, + commits_preparation_des_donnees, issues_preparation_des_donnees, + commits_savoirfR, issues_savoirfR, + commits_parcours_r, issues_parcours_r, + commits_datavisualisation, issues_datavisualisation, + commits_analyse_spatiale, issues_analyse_spatiale, + commits_cogiter,issues_cogiter + ) + combined_data <- combined_data %>% left_join(topics_list, by = "name") %>% mutate(origine = "Github", -- GitLab From 05932f81bdbc7ba22343b254e8b9ae5974863e81 Mon Sep 17 00:00:00 2001 From: LE DURAND Matteo <matteo.le-durand@developpement-durable.gouv.fr> Date: Thu, 27 Mar 2025 11:43:36 +0100 Subject: [PATCH 23/27] ajout de l'annuaire automatique en fonction de celui de de l'annuaire pauline, UNIQUEMENT CSD --- annuaire/annuaire.csv | 33 ----------------- annuaire/email_total.csv | 57 ----------------------------- annuaire/export_pauline_2025-03.csv | 13 +++++++ 3 files changed, 13 insertions(+), 90 deletions(-) delete mode 100644 annuaire/annuaire.csv delete mode 100644 annuaire/email_total.csv create mode 100644 annuaire/export_pauline_2025-03.csv diff --git a/annuaire/annuaire.csv b/annuaire/annuaire.csv deleted file mode 100644 index baa1715..0000000 --- a/annuaire/annuaire.csv +++ /dev/null @@ -1,33 +0,0 @@ -"Civilité","Prénom","Nom","Observation","Unité","Adresse","Code postal","Ville","Messagerie","Téléphone","Mobile","Fax","Pièce","Description","Fonction hiérarchique","Fonction métier","Missions" -"Mme","Christelle","BELKACEM","Directrice de projet connaissance","DREAL Pays Loire/SCTE","5 rue Françoise Giroud CS 16326","44263","NANTES cedex 2","christelle.belkacem@developpement-durable.gouv.fr","02 72 74 74 50","06 20 58 46 22","","B 316","","","","", -"Mme","Anne","CAILLAUD","","DREAL Pays Loire/SCTE","5 rue Françoise Giroud CS 16326","44263","NANTES cedex 2","Anne.Caillaud@developpement-durable.gouv.fr","02 72 74 74 42","","","B 315","","","","", -"Mme","Malaurie","CHANUT","","DREAL Pays Loire/SCTE/DEE","5 rue Françoise Giroud CS 16326","44263","NANTES cedex 2","malaurie.chanut@developpement-durable.gouv.fr","02 72 74 74 62","","","A305","","","","", -"M.","Benoit","CORNIC","","DREAL Pays Loire/SCTE/DAP","5 rue Françoise Giroud CS 16326","44263","NANTES cedex 2","benoit.cornic@developpement-durable.gouv.fr","02 72 74 74 92","07 60 71 49 56","","B 309b","","","","", -"M.","Luc","DE ROSA","","DREAL Pays Loire/SCTE/DEE","5 rue Françoise Giroud CS 16326","44263","NANTES cedex 2","Luc.De-rosa@developpement-durable.gouv.fr","02 72 74 74 67","","02 72 74 74 49","A 315","Chef de projet géomatique","","","", -"M.","Denis","DOUILLARD","","DREAL Pays Loire/SCTE/CSD","5 rue Françoise Giroud CS 16326","44263","NANTES cedex 2","denis.douillard@developpement-durable.gouv.fr","02 72 74 74 51","","","B 310","Chargé d'études","","","", -"Mme","Valérie","DUBOURG-GOURTNER","","DREAL Pays Loire/SCTE/DEE","5 rue Françoise Giroud CS 16326","44263","NANTES cedex 2","Valerie.DUBOURG-GOURTNER@developpement-durable.gouv.fr","02 72 74 74 63","","","A 302","","","","", -"M.","Clément","DURMORT","Apprenti","DREAL Pays Loire/SCTE/DAP","5 rue Françoise Giroud CS 16326","44263","NANTES cedex 2","clement.durmort@developpement-durable.gouv.fr","02 72 74 74 93","","","B 309","Apprenti, arrivée le 11/09/2023, départ prévu le 27/06/2023","","","", -"Mme","Juliette","ENGELAERE-LEFEBVRE","Responsable du Centre de services de la donnée","DREAL Pays Loire/SCTE/CSD","5 rue Françoise Giroud CS 16326","44263","NANTES cedex 2","Juliette.Engelaere@developpement-durable.gouv.fr","02 72 74 74 55","","","A 309","","","","", -"Mme","Christine","GALLAIS-JOUADET","","DREAL Pays Loire/SCTE/CSD","5 rue Françoise Giroud CS 16326","44263","NANTES cedex 2","christine.gallais-jouadet@developpement-durable.gouv.fr","02 72 74 74 78","","","A311","Cheffe de projets géomatiques, spécialité données foncières","","","", -"M.","Franck","GASPARD","","DREAL Pays Loire/SCTE/CSD","5 rue Françoise Giroud CS 16326","44263","NANTES cedex 2","Franck.Gaspard@developpement-durable.gouv.fr","02 72 74 74 56","","","A 307","Analyste de données","","","", -"Mme","Gaëtane","GERGAUD","","DREAL Pays Loire/SCTE/DEE","5 rue Françoise Giroud CS 16326","44263","NANTES cedex 2","gaetane.gergaud@developpement-durable.gouv.fr","02 72 74 74 69","","","A301","","","","", -"Mme","Laurence","GUICHET","","DREAL Pays Loire/SCTE/DEE","5 rue Françoise Giroud CS 16326","44263","NANTES cedex 2","laurence.guichet@developpement-durable.gouv.fr","02 72 74 74 66","","","A304","","","","", -"M.","Daniel","KALIOUDJOGLOU","","DREAL Pays Loire/SCTE/CSD","5 rue Françoise Giroud CS 16326","44263","NANTES cedex 2","Daniel.Kalioudjoglou@developpement-durable.gouv.fr","02 72 74 74 52","","02 74 74 74 49","A 308","Analyste de données","","","", -"Mme","Pauline","KUPERMINC","","DREAL Pays Loire/SCTE","5 rue Françoise Giroud CS 16326","44263","NANTES cedex 2","pauline.kuperminc@developpement-durable.gouv.fr","02 72 74 74 43","","02 72 74 74 49","B 315","contractuelle jusqu'au 30/04/2027","","","", -"M.","Matteo","LE DURAND","Apprenti","DREAL Pays Loire/SCTE/CSD","5 rue Françoise Giroud CS 16326","44263","NANTES cedex 2","matteo.le-durand@developpement-durable.gouv.fr","02 72 74 74 57","","","A 309","","","","", -"Mme","Annaig","LE MEUR","Cheffe de service","DREAL Pays Loire/SCTE","5 rue Françoise Giroud CS 16326","44263","NANTES cedex 2","annaig.le-meur@developpement-durable.gouv.fr","02 72 74 74 44","06 03 57 55 11","","B312","","","","", -"M.","Stéphane","LE MOING","","DREAL Pays Loire/SCTE/DEE","5 rue Françoise Giroud CS 16326","44263","NANTES cedex 2","Stephane.Le-moing@developpement-durable.gouv.fr","02 72 74 74 60","06 99 98 47 77","","A318","","","","", -"M.","Xavier","MILARET","","DREAL Pays Loire/SCTE/DEE","5 rue Françoise Giroud CS 16326","44263","NANTES cedex 2","xavier.milaret@developpement-durable.gouv.fr","02 72 74 74 59","","","A306","","","","", -"M.","Edouard","MORIN","","DREAL Pays Loire/SCTE/CSD","5 rue Françoise Giroud CS 16326","44263","NANTES cedex 2","edouard.morin@developpement-durable.gouv.fr","02 72 74 74 76","","","A310","","","","", -"Mme","Célia","PEOC'H","","DREAL Pays Loire/SCTE/DAP","5 rue Françoise Giroud CS 16326","44263","NANTES cedex 2","celia.peoc-h@developpement-durable.gouv.fr","02 72 74 74 54","","","B 311","","","","", -"M.","David","PIERRE","","DREAL Pays Loire/SCTE/DEE","5 rue Françoise Giroud CS 16326","44263","NANTES cedex 2","david.pierre@developpement-durable.gouv.fr","02 72 74 74 68","06 58 35 98 59","02 72 74 74 49","A 303","Chargé de mission pour la Vendée hors littoral","","","", -"M.","Eric","RENAULT","","DREAL Pays Loire/SCTE/DEE","5 rue Françoise Giroud CS 16326","44263","NANTES cedex 2","eric.renault@developpement-durable.gouv.fr","02 72 74 74 65","07 64 40 70 99","","A 322","","","","", -"Mme","Enora","ROUSSE-DANAIS","Apprentie","DREAL Pays Loire/SCTE/DEE","5 rue Françoise Giroud CS 16326","44263","NANTES cedex 2","enora.rousse-danais@developpement-durable.gouv.fr","02 72 74 74 58","","","A 300","apprentie présente du 09/09/2024 au 10/09/2025","","","", -"M.","Alexis","ROY","","DREAL Pays Loire/SCTE/DEE","5 rue Françoise Giroud CS 16326","44263","NANTES cedex 2","alexis.roy@developpement-durable.gouv.fr","02 72 74 76 46","","","","","","","", -"Mme","Anne-Cécile","SIMON","","DREAL Pays Loire/SCTE/CSD","5 rue Françoise Giroud CS 16326","44263","NANTES cedex 2","anne-cecile.simon@developpement-durable.gouv.fr","02 72 74 74 75","","02 72 74 74 49","A313","Géomaticienne spécialiste data","","","", -"Mme","Lisa","SMAH","Apprentie","DREAL Pays Loire/SCTE/CSD","5 rue Françoise Giroud CS 16326","44263","NANTES cedex 2","lisa.smah@developpement-durable.gouv.fr","02 72 74 74 53","07 55 98 55 40","","A 300","","","","", -"M.","Philippe","TERME","Chef de projets et administrateur de données","DREAL Pays Loire/SCTE/CSD","5 rue Françoise Giroud CS 16326","44263","NANTES cedex 2","Philippe.Terme@developpement-durable.gouv.fr","02 72 74 74 83","","","A 314","Chef de projets et administrateur de données","","","", -"Mme","Guylène","THEBAULT","","DREAL Pays Loire/SCTE/DEE","5 rue Françoise Giroud CS 16326","44263","NANTES cedex 2","guylene.thebault@developpement-durable.gouv.fr","02 72 74 74 64","","","A 316","Chargée de mission pour le littoral","","","", -"Mme","Sandrine","VERHAEGHE","Chef de division","DREAL Pays Loire/SCTE/DAP","5 rue Françoise Giroud CS 16326","44263","NANTES cedex 2","sandrine.verhaeghe@developpement-durable.gouv.fr","02 72 74 74 90","06 21 93 12 06","02 72 74 74 40","B 313","","","","", -"Mme","Véronique","VEYSSEYRE-MAUPEU","","DREAL Pays Loire/SCTE/DEE","5 rue Françoise Giroud CS 16326","44263","NANTES cedex 2","veronique.veysseyre-maupeu@developpement-durable.gouv.fr","02 72 74 74 61","06 99 03 00 45","02 72 74 74 49","A 304","","","","", -"M.","Ronan","VIGNARD","Adjoint à la responsable du Centre de services de la donnée","DREAL Pays Loire/SCTE/CSD","5 rue Françoise Giroud CS 16326","44263","NANTES cedex 2","ronan.vignard@developpement-durable.gouv.fr","02 72 74 74 81","06 61 15 42 17","","A312","","","","", diff --git a/annuaire/email_total.csv b/annuaire/email_total.csv deleted file mode 100644 index 07dcf0a..0000000 --- a/annuaire/email_total.csv +++ /dev/null @@ -1,57 +0,0 @@ -author,email -denis.douillard@developpement-durable.gouv.frcd,denis.douillard@developpement-durable.gouv.fr -lisa.smah@developpemnt-durable.gouv.fr,lisa.smah@developpement-durable.gouv.fr -alexandra.prevot@developpement-durable.gouv.fr,NA -freddy.lemoux@developpement-durable.gouv.fr,NA -mael.theuliere@developpement-durable.gouv.fr,NA -dataviz@set-pdl-dataviz.dreal-pdl.ad.e2.rie.gouv.fr,NA -anh-van.lu@developpement-durable.gouv.fr,NA -anh-van.lu@dreal.est,NA -sophie.glatre@developpement-durable.gouv.fr,NA -lisa.smahlisa.smah@developpement-durable.gouv.fr,lisa.smah@developpement-durable.gouv.fr -ndeye-coumba.diallo@imt-atlantique.net,NA -nathalie.bourgeais@developpement-durable.gouv.fr,NA -jeanne.da-silveira@developpement-durable.gouv.fr,NA -Juliette.Engelaere@developpement-durable.gouv.fr,juliette.engelaere@developpement-durable.gouv.fr -Daniel.Kalioudjoglou@developpement-durable.gouv.fr,daniel.kalioudjoglou@developpement-durable.gouv.fr -mael.theuliere@gmail.com,NA -philippe.birchen@developpement-durable.gouv.fr,NA -couedel.charlotte@gmail.com,NA -juliette.engelaere@developpement.gouv.fr,juliette.engelaere@developpement-durable.gouv.fr -jean-baptiste.paroissien@anteagroup.fr,NA -sebastien.gilbert@anteagroup.fr,NA -Franck.Gaspard@developpement-durable.gouv.fr,franck.gaspard@developpement-durable.gouv.fr -you@example.com,NA -bruno.lenzi@developpement-durable.gouv.fr,NA -murielle.lethrosne@developpement-durable.gouv.fr,NA -julientaq@gmail.com,NA -diane@thinkr.fr,NA -âronan.vignard@developpement-durable.gouv.f,NA -jdaniel.lomenede@gmail.com,NA -jean-daniel.lomenede@developpement-durable.gouv.fr,NA -JulietteEngelaere@developpement-durable.gouv.fr,juliette.engelaere@developpement-durable.gouv.fr -aurelie.tisserand@developpement-durable.gouv.fr,NA -Philippe.BIRCHEN@developpement-durable.gouv.fr,NA -Philippe.Terme@developpement-durable.gouv.fr,philippe.terme@developpement-durable.gouv.fr -camille.campeon@developpement-durable.gouv.fr,NA -bruno.le-gonidec@developpement-durable.gouv.fr,NA -jean-baptiste.paroissien@developpement-durable.gouv.fr,NA -Francois-Jacques.chenais@developpement-durable.gouv.fr,NA -denis.douillard@developpement-durable.gouv.fr,denis.douillard@developpement-durable.gouv.fr -edouard.morin@developpement-durable.gouv.fr,edouard.morin@developpement-durable.gouv.fr -lisa.smah@developpement-durable.gouv.fr,lisa.smah@developpement-durable.gouv.fr -ronan.vignard@developpement-durable.gouv.fr,ronan.vignard@developpement-durable.gouv.fr -juliette.engelaere@developpement-durable.gouv.fr,juliette.engelaere@developpement-durable.gouv.fr -christine.gallais-jouadet@developpement-durable.gouv.fr,christine.gallais-jouadet@developpement-durable.gouv.fr -philippe.terme@developpement-durable.gouv.fr,philippe.terme@developpement-durable.gouv.fr -christelle.belkacem@developpement-durable.gouv.fr,christelle.belkacem@developpement-durable.gouv.fr -franck.gaspard@developpement-durable.gouv.fr,franck.gaspard@developpement-durable.gouv.fr -anne-cecile.simon@developpement-durable.gouv.fr,anne-cecile.simon@developpement-durable.gouv.fr -daniel.kalioudjoglou@developpement-durable.gouv.fr,daniel.kalioudjoglou@developpement-durable.gouv.fr -matteo.le-durand@developpement-durable.gouv.fr,matteo.le-durand@developpement-durable.gouv.fr -celia.peoc-h@developpement-durable.gouv.fr,celia.peoc-h@developpement-durable.gouv.fr -julietteengelaere@developpement-durable.gouv.fr,juliette.engelaere@developpement-durable.gouv.fr -christelle_b@developpement-durable.gouv.fr,christelle.belkacem@developpement-durable.gouv.fr -jengelaere@developpement-durable.gouv.fr,juliette.engelaere@developpement-durable.gouv.fr -juliette.engelaere@developpement-durable.gouv.fr,juliette.engelaere@developpement-durable.gouv.fr -juliette.engelaere@developpement.gouv.fr,juliette.engelaere@developpement-durable.gouv.fr diff --git a/annuaire/export_pauline_2025-03.csv b/annuaire/export_pauline_2025-03.csv new file mode 100644 index 0000000..c106563 --- /dev/null +++ b/annuaire/export_pauline_2025-03.csv @@ -0,0 +1,13 @@ +"Civilité","Prénom","Nom","Observation","Unité","Adresse","Code postal","Ville","Messagerie","Téléphone","Mobile","Fax","Pièce","Description","Fonction hiérarchique","Fonction métier","Missions" +"Mme","Christelle","BELKACEM","Directrice de projet connaissance","DREAL Pays Loire/SCTE","5 rue Françoise Giroud CS 16326","44263","NANTES cedex 2","christelle.belkacem@developpement-durable.gouv.fr","02 72 74 74 50","06 20 58 46 22","","B 316","","","","", +"M.","Denis","DOUILLARD","","DREAL Pays Loire/SCTE/CSD","5 rue Françoise Giroud CS 16326","44263","NANTES cedex 2","denis.douillard@developpement-durable.gouv.fr","02 72 74 74 51","","","B 310","Chargé d'études","","","", +"Mme","Juliette","ENGELAERE-LEFEBVRE","Responsable du Centre de services de la donnée","DREAL Pays Loire/SCTE/CSD","5 rue Françoise Giroud CS 16326","44263","NANTES cedex 2","Juliette.Engelaere@developpement-durable.gouv.fr","02 72 74 74 55","","","A 309","","","","", +"Mme","Christine","GALLAIS-JOUADET","","DREAL Pays Loire/SCTE/CSD","5 rue Françoise Giroud CS 16326","44263","NANTES cedex 2","christine.gallais-jouadet@developpement-durable.gouv.fr","02 72 74 74 78","","","A311","Cheffe de projets géomatiques, spécialité données foncières","","","", +"M.","Franck","GASPARD","","DREAL Pays Loire/SCTE/CSD","5 rue Françoise Giroud CS 16326","44263","NANTES cedex 2","Franck.Gaspard@developpement-durable.gouv.fr","02 72 74 74 56","","","A 307","Analyste de données","","","", +"M.","Daniel","KALIOUDJOGLOU","","DREAL Pays Loire/SCTE/CSD","5 rue Françoise Giroud CS 16326","44263","NANTES cedex 2","Daniel.Kalioudjoglou@developpement-durable.gouv.fr","02 72 74 74 52","","02 74 74 74 49","A 308","Analyste de données","","","", +"M.","Matteo","LE DURAND","Apprenti","DREAL Pays Loire/SCTE/CSD","5 rue Françoise Giroud CS 16326","44263","NANTES cedex 2","matteo.le-durand@developpement-durable.gouv.fr","02 72 74 74 57","","","A 309","","","","", +"M.","Edouard","MORIN","","DREAL Pays Loire/SCTE/CSD","5 rue Françoise Giroud CS 16326","44263","NANTES cedex 2","edouard.morin@developpement-durable.gouv.fr","02 72 74 74 76","","","A310","","","","", +"Mme","Anne-Cécile","SIMON","","DREAL Pays Loire/SCTE/CSD","5 rue Françoise Giroud CS 16326","44263","NANTES cedex 2","anne-cecile.simon@developpement-durable.gouv.fr","02 72 74 74 75","","02 72 74 74 49","A313","Géomaticienne spécialiste data","","","", +"Mme","Lisa","SMAH","Apprentie","DREAL Pays Loire/SCTE/CSD","5 rue Françoise Giroud CS 16326","44263","NANTES cedex 2","lisa.smah@developpement-durable.gouv.fr","02 72 74 74 53","07 55 98 55 40","","A 300","","","","", +"M.","Philippe","TERME","Chef de projets et administrateur de données","DREAL Pays Loire/SCTE/CSD","5 rue Françoise Giroud CS 16326","44263","NANTES cedex 2","Philippe.Terme@developpement-durable.gouv.fr","02 72 74 74 83","","","A 314","Chef de projets et administrateur de données","","","", +"M.","Ronan","VIGNARD","Adjoint à la responsable du Centre de services de la donnée","DREAL Pays Loire/SCTE/CSD","5 rue Françoise Giroud CS 16326","44263","NANTES cedex 2","ronan.vignard@developpement-durable.gouv.fr","02 72 74 74 81","06 61 15 42 17","","A312","","","","", -- GitLab From 8268751154ecd9350df0acf4f60f1efb384a87b2 Mon Sep 17 00:00:00 2001 From: LE DURAND Matteo <matteo.le-durand@developpement-durable.gouv.fr> Date: Thu, 27 Mar 2025 11:44:11 +0100 Subject: [PATCH 24/27] Import de l'annuaire --- dev/script_routine.R | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/dev/script_routine.R b/dev/script_routine.R index e145d03..637455f 100644 --- a/dev/script_routine.R +++ b/dev/script_routine.R @@ -1,10 +1,22 @@ 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") +Sys.setenv("NO_PROXY" = "127.0.0.1,localhost,.i2,.rie.gouv.fr,192.168.,10.,172.") + setwd("T:\\datalab\\SCTE_CSD\\dataviz_gitlabr") +library(stringr) +library(lubridate) # etape de mise à jour des données sur T------------- source(file = "dev/github_extraire.R") source(file = "dev/gitlab_classique.R") source(file = "dev/gitlab_forge.R") source(file = "dev/deploiment_sur_dataviz.R", verbose = TRUE) + +path_annuaire <- paste0("annuaire/export_pauline_", str_sub(today(), 1, 7), ".csv") +if (!file.exists(path_annuaire)) { + unlink("annuaire", recursive = TRUE) + dir.create("annuaire") + download.file(url = "http://annuaire.e2.rie.gouv.fr/index.php?vue=exportcsv&dn=ou=CSD,ou=SCTE,ou=DREAL%20Pays%20Loire,ou=DR,ou=melanie", + destfile = path_annuaire, method = "libcurl") +} -- GitLab From c328ddac72438d1ff67d8668840996979146f529 Mon Sep 17 00:00:00 2001 From: LE DURAND Matteo <matteo.le-durand@developpement-durable.gouv.fr> Date: Thu, 27 Mar 2025 11:44:36 +0100 Subject: [PATCH 25/27] =?UTF-8?q?Mise=20=C3=A0=20jour=20de=20l'UI=20en=20a?= =?UTF-8?q?joutant=20l'onglet=20indicateur?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ui.R | 48 ++++++++++++++++++++++++++++-------------------- 1 file changed, 28 insertions(+), 20 deletions(-) diff --git a/ui.R b/ui.R index b61cb63..7fc7323 100644 --- a/ui.R +++ b/ui.R @@ -4,7 +4,7 @@ ui <- shinygouv::navbarPage_dsfr( id = "nav", header = shinygouv::header_dsfr( intitule = c("DREAL", "Pays de la Loire"), - nom_site_service = "Tableau de bord GitLab-Forge", + nom_site_service = "Visualisation des projets du CSD gérés avec git", baseline = "Les Projets du Centre de Services de la Donnée" ), footer = footer_dsfr( @@ -16,8 +16,7 @@ ui <- shinygouv::navbarPage_dsfr( ), # First tab Projet --------- shinygouv::navbarPanel_dsfr( - title = "Graphique des projets par durée", - + title = "Graphique par période", htmltools::tags$head(tags$style(".fr-container { max-width: calc(100% - 2rem); }")), shinygouv::fluidRow_dsfr( shinygouv::column_dsfr( @@ -44,21 +43,23 @@ ui <- shinygouv::navbarPage_dsfr( unique() , # Extrait les éléments uniques multiple = TRUE - ),extra_class = "fr-mt-6w" + ), + extra_class = "fr-mt-6w" ), column_dsfr( 3, selectizeInput( inputId = "project_name", - label = "Projet : ", + label = "Sélectionnez projet : ", choices = NULL, multiple = TRUE - ),extra_class = "fr-mt-6w" + ), + extra_class = "fr-mt-6w" ), column_dsfr( 3, selectizeInput( - inputId = "author", + inputId = "auteur", label = "Auteur :", choices = unique(str_to_title(replace_non_ascii(all_data$auteur))), selected = NULL, @@ -83,12 +84,8 @@ ui <- shinygouv::navbarPage_dsfr( 4, selectizeInput( inputId = "categorie", - label = "Groupe: ", - choices = c( - "Autre" = "tous", - "Spyrales" = "spyrale", - "R Formation" = "github" - ), + label = " Évenement (précis) ", + choices = unique(all_data$type), selected = NULL, multiple = TRUE ) @@ -106,24 +103,35 @@ ui <- shinygouv::navbarPage_dsfr( plotly::plotlyOutput("filteredPlot2", height = "700px"), extra_class = "fr-my-1w" ) - ) ),# tab graphique par choix ↑ tabPanel_dsfr( id = "indicateur" , title = "Indicateurs", shinygouv::fluidRow_dsfr( - shinygouv::column_dsfr(12) + column_dsfr(3, + textOutput("nb_projet"), + textOutput("nb_commit"), + textOutput("nb_temps"), extra_class = "fr-my-1w" + ), + shinygouv::column_dsfr(9, + plotlyOutput("bar_chart"), + extra_class = "fr-my-1w"), + + column_dsfr(12,textOutput("min_value")), + column_dsfr(12,textOutput("temps")), + column_dsfr(12,plotOutput("bar"), + extra_class = "fr-my-1w") ) - ), + ),# tab indicateur par choix ↑ tabPanel_dsfr( - id = "table" , - title = "tableau", + id = "Table" , + title = "Table", shinygouv::fluidRow_dsfr( shinygouv::column_dsfr(12, - DT::dataTableOutput("table")) - ) + DTOutput('table')) ) + )# tab table par choix ↑ )#↑ tableau_proj )# ↑ Navbar )# ↑ UI -- GitLab From 4cc8504f1f1a72f747a3947c1f5e0f3f15b8dd95 Mon Sep 17 00:00:00 2001 From: LE DURAND Matteo <matteo.le-durand@developpement-durable.gouv.fr> Date: Thu, 27 Mar 2025 11:45:18 +0100 Subject: [PATCH 26/27] =?UTF-8?q?fix:=20r=C3=A9solution=20des=20filtres=20?= =?UTF-8?q?et=20du=20clignotment?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server.R | 278 +++++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 209 insertions(+), 69 deletions(-) diff --git a/server.R b/server.R index 7e6b438..9a7b8cc 100644 --- a/server.R +++ b/server.R @@ -1,118 +1,258 @@ server <- function(input, output, session) { + # Stocker les valeurs réactives r <- reactiveValues( - filteredData = all_data, - filteredByProject = all_data, # Étape intermédiaire filtrée par daterange et project_name - filteredetiquette = NULL, - filteredProjects = NULL, - filteredAuthors = NULL, - filteredReCodes = NULL, - filteredCategories = NULL, - filteredByDate = NULL, + filteredByDate = NULL, # Filtrage uniquement par date + filteredData = NULL # Filtrage final après application de tous les filtres + ) - # Filtrage par date et project_name uniquement + # 1ï¸âƒ£ Filtrage prioritaire par date ---- observeEvent(input$daterange, { - req(input$daterange) + req(input$daterange) # Vérifier que la sélection est valide + + # Filtrage initial sur la plage de dates r$filteredByDate <- all_data %>% filter( updated_at >= as.Date(input$daterange[[1]]) & - updated_at <= as.Date(input$daterange[[2]]) & - (if (length(input$project_name)) project_name %in% input$project_name else TRUE) + updated_at <= as.Date(input$daterange[[2]]) ) - updateFilters() # Mise à jour des choix basés sur le filtrage intermédiaire + # Mise à jour dynamique des autres filtres en fonction des données filtrées par date + updateFilters() }) - # Mise à jour des autres filtres + # 2ï¸âƒ£ Mise à jour dynamique des filtres ---- + updateFilters <- reactive({ + req(r$filteredByDate) # Vérifier que les données sont disponibles + isolate({ + updateSelectizeInput(session, "project_name", + choices = unique(r$filteredByDate$project_name), + selected = input$project_name) + + updateSelectizeInput(session, "etiquette", + choices = r$filteredByDate$etiquette %>% + strsplit(split = ",") %>% + unlist() %>% + na.omit() %>% + .[. != ""] %>% + trimws() %>% + unique(), + selected = input$etiquette) + + updateSelectizeInput(session, "auteur", + choices = unique(r$filteredByDate$auteur), + selected = input$auteur) + + updateSelectizeInput(session, "categorie", + choices = unique(r$filteredByDate$type), + selected = input$categorie) + + updateCheckboxGroupInput_dsfr( inputId = "re_code", + label = "Type d'évènement :", + choices = unique(r$filteredByDate$re_code), + selected = input$re_code, + inline = TRUE) + }) + }) + # 3ï¸âƒ£ Filtrage final en fonction des autres filtres ---- observe({ - req(input$daterange) + req(r$filteredByDate) # Vérifier que les données de base sont filtrées par date + r$filteredData <- r$filteredByDate %>% filter( - (if (length(input$etiquette)) sapply(input$etiquette, function(t) grepl(t, etiquette)) %>% rowSums() > 0 else TRUE) & + (if (length(input$project_name)) project_name %in% input$project_name else TRUE) & + (if (length(input$etiquette)) sapply(input$etiquette, function(t) grepl(t, etiquette)) %>% rowSums() > 0 else TRUE) & (if (length(input$auteur)) auteur %in% input$auteur else TRUE) & (if (length(input$re_code)) re_code %in% input$re_code else TRUE) & - (if (length(input$categorie)) categorie %in% input$categorie else TRUE) + (if (length(input$categorie)) type %in% input$categorie else TRUE) ) - updateFilters() - }) - # Fonction de mise à jour des choix pour les filtres - updateFilters <- reactive({ - # Basé sur les données filtrées par date et projet - updateSelectizeInput(session, "etiquette", choices = unique(r$filteredByDate$etiquette)%>% - strsplit(split = ",") %>% # Divise les chaînes en éléments séparés - unlist() %>% # Aplatit la liste obtenue - na.omit() %>% # Supprime les NA (au cas où) - .[. != ""] %>% # Supprime les chaînes vides - trimws() %>% # suppremie les espace avnt et apres - unique() , selected = input$etiquette) - updateSelectizeInput(session, "author", choices = unique(r$filteredByDate$auteur), selected = input$auteur) - updateSelectizeInput(session, "categorie", choices = unique(r$filteredByDate$categorie), selected = input$categorie) - - # Basé uniquement sur les données globales pour éviter que project_name soit affecté - updateSelectizeInput(session, "project_name", choices = sort(unique(r$filteredByDate$project_name)), selected = input$project_name) + # Mettre à jour les filtres restants + updateFilters() }) - # Réinitialisation des filtres + # 4ï¸âƒ£ Réinitialisation des filtres ---- observeEvent(input$reset, { r$filteredByDate <- all_data %>% - filter(updated_at >= as.Date(input$daterange[[1]]) & - updated_at <= as.Date(input$daterange[[2]])) - r$filteredData <- r$filteredByDate + filter( + updated_at >= as.Date(input$daterange[[1]]) & + updated_at <= as.Date(input$daterange[[2]]) + ) + r$filteredData <- r$filteredByDate # Reset total + updateSelectizeInput(session, "project_name", selected = NULL) updateSelectizeInput(session, "etiquette", selected = NULL) - updateSelectizeInput(session, "author", selected = NULL) + updateSelectizeInput(session, "auteur", selected = NULL) updateSelectizeInput(session, "categorie", selected = NULL) + updateCheckboxGroupInput_dsfr( "re_code", selected = NULL,inline = TRUE) updateFilters() }) - output$lien <- renderUI({ - projects_with_links <- r$filteredData %>% - filter(origine == "Gitlab_Forge" & project_name %in% input$project_name) - - if (nrow(projects_with_links) == 0) { - return(NULL) # Aucun lien à afficher - } - - urls <- paste0("https://gitlab-forge.din.developpement-durable.gouv.fr/dreal-pdl/csd/", projects_with_links$project_name) - links <- lapply(seq_along(unique(projects_with_links$project_name)), function(i) { - a(href = urls[i], target = "_blank", projects_with_links$project_name[i]) - }) - do.call(tagList, links) - }) - # Graphique interactif + # 5ï¸âƒ£ Graphique interactif ---- output$filteredPlot2 <- plotly::renderPlotly({ - req(r$filteredData) + req(r$filteredData) # Vérifier qu'on a des données filtrées p <- ggplot2::ggplot(r$filteredData, ggplot2::aes(x = updated_at, y = as.factor(project_name))) + ggplot2::geom_point(ggplot2::aes(color = re_code, text = paste(updated_at, message, sep = "\n")), size = 3, alpha = 0.5) + ggplot2::labs(shape = "Événement", color = "Événement", x = "") + ggplot2::scale_x_datetime(timezone = "Europe/Paris") + - gouvdown::theme_gouv()+ + gouvdown::theme_gouv() + ggplot2::theme( axis.text.x = ggplot2::element_text(angle = 0, hjust = 1), axis.title.y = ggplot2::element_blank() ) - plotly::ggplotly(p, tooltip = "text") + plotly::ggplotly(p, tooltip = "text", dynamicTicks = TRUE) %>% + plotly::config(locale = "fr", displaylogo = FALSE) }) - - output$table <- renderDataTable({ + # 6ï¸âƒ£ Graphique des indicateurs ---- + output$bar_chart <- renderPlotly({ req(r$filteredData) - datatable(r$filteredData , - options = list( - pageLength = 10, # Nombre de lignes affichées par page - lengthMenu = c(5, 10, 25, 50), # Choix du nombre de lignes - autoWidth = TRUE, # Ajuste automatiquement la largeur des colonnes - scrollX = TRUE, # Active le défilement horizontal - class = "display", # Ajoute du style CSS - rownames = FALSE, # Supprime les numéros de ligne, - searchHighlight = TRUE - ) + + percent_time <- as.numeric(max(r$filteredData$updated_at) - min(r$filteredData$updated_at)) / + as.numeric(max(all_data$updated_at) - min(all_data$updated_at)) * 100 + + # Création du dataset + data <- data.frame( + dataset = c("Commit", "Projet", "Heure"), + total = c(sum(r$filteredData$type == "commit"), + length(unique(r$filteredData$project_name)), + percent_time) ) + plotly::ggplotly( + ggplot(data, aes(x = dataset, y = total, fill = dataset)) + + geom_bar(stat = "identity") + + coord_flip() + + scale_fill_manual(values = c("#3498db", "#e74c3c", "#2ecc71")) + + labs( + x = "Comparaison", + y = "Pourcentage / Nombre", + title = "Comparaison des Commits, Projets et Temps" + ) + + theme_minimal() + + theme(legend.position = "none") + + geom_text( + aes(label = paste0(round(total, 1),"%")), + hjust = -0.2 + ) + ) %>% + plotly::config(locale = "fr", + displaylogo = FALSE) }) + output$nb_projet <- renderText({ + req(r$filteredData) + paste("Nombre de projets visualisés",length(unique(r$filteredData$project_name)),sep = " : ") + }) + output$nb_commit <- renderText({ + req(r$filteredData) + paste("Nombre de commits",sum(r$filteredData$type == "commit"),sep = " : ") + }) + output$nb_temps <- renderText({ + req(r$filteredData) + paste("Estimation du temps passé sur la période :",sep = " ",round(difftime( + max(r$filteredData$updated_at) , min(r$filteredData$updated_at),units = "hours")), " heures") + }) + + + # 7ï¸âƒ£ Table des résultats ---- + output$table <- renderDT({ + req(r$filteredData) + datatable(r$filteredData, options = list( + pageLength = 10, + lengthMenu = c(5, 10, 25, 50), + autoWidth = TRUE, + scrollX = TRUE, + class = "display", + rownames = FALSE, + searchHighlight = TRUE + )) + }) + + # 8ï¸âƒ£ Graphique des indicateurs ----- + + output$min_value <- renderText({ + req(input$project_name) # Vérifie que l'input existe + + # Nombre de projets sélectionnés + selected_projects <- length(unique(input$project_name)) + + # Condition : Si 1 seul projet est sélectionné + if (selected_projects == 1) { + # Filtrer les données pour ce projet spécifique + projet_data <- all_data %>% + filter(project_name == input$project_name) + + min_value <- min(projet_data$updated_at, na.rm = TRUE) + + paste("Date de création du projet : ", format(min_value, "%d %B %Y, %H:%M")) + } else { + "Sélectionnez un seul projet pour voir la date de création." + } + }) + + + output$temps <- renderText({ + req(input$project_name) # Vérifie que l'input existe + + # Nombre de projets sélectionnés + selected_projects <- length(unique(input$project_name)) + # Condition : Si 1 seul projet est sélectionné + if (selected_projects == 1) { + # Filtrer les données pour ce projet spécifique + projet_data <- all_data %>% + filter(project_name == input$project_name) + + temps <- difftime(max(projet_data$updated_at), min(projet_data$updated_at), units = "secs") + + jours <- as.numeric(temps, units = "days") %/% 1 + heures <- (as.numeric(temps, units = "hours") %% 24) %/% 1 + minutes <- (as.numeric(temps, units = "mins") %% 60) %/% 1 + print(temps) + paste("Estimation du temps passé : ", jours, "jours,", heures, "heures,", minutes, "minutes") + } else { + "Sélectionnez un seul projet pour voir l'estimation." + } + }) + + output$bar <- renderPlot({ + req(input$project_name) # Vérifie que l'input existe + + selected_projects <- length(unique(input$project_name)) + if (selected_projects == 1) { + # Filtrer les données pour le project_name sélectionné + filtered_data <- all_data %>% + filter(project_name == input$project_name) %>% + mutate(month = format(as.Date(updated_at), "%Y-%m")) + # Définir la plage de mois spécifique au projet sélectionné + first_month <- floor_date(min(as.Date(filtered_data$updated_at)), "month") + last_month <- ceiling_date(max(as.Date(filtered_data$updated_at)), "month") + # Générer tous les mois entre le premier et le dernier + full_months <- seq(first_month, last_month, by = "month") %>% + tibble(month = format(., "%Y-%m")) + # Compter les entrées par mois et compléter les mois manquants + complete_data <- full_months %>% + left_join(filtered_data %>% count(month), by = "month") %>% + replace_na(list(n = 0)) + + # Créer le bar plot + ggplot(complete_data, aes(x = month, y = n)) + + geom_bar(stat = "identity", fill = "#ff7f27", width = 0.7) + + theme_minimal() + + scale_x_discrete( + name = "Mois", + labels = function(x) format(as.Date(paste0(x, "-01")), "%B %Y") + ) + + labs(y = "Nombre d'entrées") + + gouvdown::theme_gouv() + + theme(axis.text.x = element_text(angle = 45, hjust = 1)) + }else{ + ggplot() + + annotate("text", x = 1, y = 1, label = "Sélectionnez un seul projet pour voir la timeline", size = 5) + + theme_void() + } + }) } -- GitLab From fca62d71fc22416f4fd17288f5ec2152d95fb863 Mon Sep 17 00:00:00 2001 From: LE DURAND Matteo <matteo.le-durand@developpement-durable.gouv.fr> Date: Thu, 27 Mar 2025 11:45:31 +0100 Subject: [PATCH 27/27] importation de l'annuaire --- global.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/global.R b/global.R index 6509e82..0e42336 100644 --- a/global.R +++ b/global.R @@ -29,7 +29,7 @@ load("gitlab.RData") load("date_MAJ.RData") -annuaire <- read_csv("annuaire/annuaire.csv") +annuaire <- read_csv(path_annuaire,col_types = "c") annuaire$Messagerie <- tolower(annuaire$Messagerie) annuaire <- annuaire %>% rename( mail = Messagerie) annuaire <- annuaire %>% filter( str_detect(Unité,"CSD" ) ) -- GitLab