Skip to content
Snippets Groups Projects
Commit 76764c7a authored by LE DURAND Matteo's avatar LE DURAND Matteo
Browse files

Merge branch 'dev' into 'main'

Dev to main

See merge request !8
parents a3d38671 9781f255
No related branches found
No related tags found
2 merge requests!12création du datamart via la planification et utilisation,!8Dev to main
......@@ -2,37 +2,19 @@
# les packages nécessaire
library(gitlabr)
# install.packages("gitlabr")
library(DT)
# install.packages("DT")
library(shiny)
# install.packages("shiny")
library(shinydashboard)
# install.packages("shinydashboard")
library(shinythemes)
# install.packages("shinythemes")
library(dplyr)
# install.packages("dplyr")
library(tidyverse)
# install.packages("tidyverse")
library(randomcoloR)
# install.packages("randomcoloR")
library(ggplot2)
# install.packages("ggplot2")
library(plotly)
# install.packages("plotly")
# remotes::install_github("spyrales/shinygouv")
library(shinygouv)
# install.packages("shinygouv")
library(rvest)
# install.packages("rvest")
# remotes::install_github("spyrales/gouvdown")
library(gouvdown)
# install.packages("gouvdown")
library(purrr)
#install.packages("purrr")
library(httr)
#install.packages("httr")
library(jsonlite)
#install.package("jsonlite")
library(utils)
# inisialisation de connexion pour GitlabR
gitlabr::set_gitlab_connection(gitlab_url = "https://gitlab-forge.din.developpement-durable.gouv.fr", #adresse internet
......@@ -44,35 +26,31 @@ token <- Sys.getenv("GITLAB_COM_TOKEN")
# attention j'ai du modifier le filtre puisque les variable ne correspondait plus a ce de la veille on va peut etre partire sur le select()
group <- gitlabr::gl_list_group_projects(group_id = 1013, max_page = 10)
group <- group %>% dplyr::select(id,name,created_at,star_count,last_activity_at,open_issues_count,updated_at,description,contains("members")) # _links.members
group <- group %>% dplyr::select(id,name,created_at,star_count,last_activity_at,open_issues_count,updated_at,description,contains("members"),path) # _links.members
# premier filtre pour les groupes
groupf <- (group[as.numeric(group$open_issues_count) != 0, ])
groupf <- groupf %>%
mutate(
name_encoded = utils::URLencode(name), # Encode les espaces et autres caractères spéciaux
analyse = paste0(
"<a href='https://gitlab-forge.din.developpement-durable.gouv.fr/dreal-pdl/csd/",
name_encoded,
"/-/value_stream_analytics' target='_blank'>GitLab_analytics</a>"
)
) %>% dplyr::select(id,name,created_at,star_count,last_activity_at,open_issues_count,updated_at,description,analyse,contains("members"))
groupf$open_issues_count <- as.numeric(groupf$open_issues_count)
# choix par identifiant de projet
choice <- groupf$id %>% setNames(groupf$name)
#identifier les variables disponible
var_group <- names(gl_list_group_projects(group_id = 1013, max_page = 10))
var_issue <- names(gl_list_issues(project = 23034))
# parcourir la liste des identifiants ----
résultats <- base::lapply(groupf$id, function(x) {
base::return(x) # La fonction doit retourner une valeur pour fonctionner
})
choice <- groupf$id %>% stats::setNames(groupf$name)
#creation du df pour le journal d'activité ----
final_table <- résultats %>%
purrr::map_dfr(gl_list_issues)
final_table <- final_table %>%dplyr::mutate(id = project_id) %>%
dplyr::select(id,project_id,title,description,state,created_at,updated_at,labels,labels1,labels2,labels3,assignees.username,assignees.state,author.username,type,confidential,references.short,closed_at,closed_by.username)
final_table0 <- purrr::map_dfr(groupf$id, gitlabr::gl_list_issues)
final_table <- final_table %>%
left_join(select(groupf,id,name),by = "id") %>% dplyr::select(name,project_id,title,description,state,created_at,updated_at,labels,labels1,labels2,labels3,assignees.username,assignees.state,author.username,type,confidential,references.short,closed_at,closed_by.username)
final_table <- final_table0 %>%dplyr::mutate(id = project_id) %>%
dplyr::select(id,project_id,title,description,state,created_at,updated_at,labels,labels1,labels2,labels3,assignees.username,assignees.state,author.username,type,confidential,references.short,closed_at,closed_by.username) %>%
dplyr::left_join(dplyr::select(groupf,id,name),by = "id") %>%
dplyr::select(name,project_id,title,description,state,created_at,updated_at,labels,labels1,labels2,labels3,assignees.username,assignees.state,author.username,type,confidential,references.short,closed_at,closed_by.username)
# fonction API ----
# Fonction pour récupérer les événements GitLab pour un projet
......@@ -81,7 +59,7 @@ get_gitlab_events <- function(project_id, event_type = NULL) {
headers <- add_headers(`PRIVATE-TOKEN` = token)
# Construire la requête en fonction du type d'événement souhaité
params <- list(per_page = 100) # Limite à 100 événements par requête
params <- list(per_page = 1500) # Limite à 1500 événements par requête
if (!is.null(event_type)) {
params[["action"]] <- event_type
}
......@@ -97,49 +75,63 @@ get_gitlab_events <- function(project_id, event_type = NULL) {
events$project_id <- project_id # Ajouter l'identifiant du projet pour le suivi
return(events)
}
# Fonction pour récupérer les événements pour plusieurs projets----
get_events_for_projects <- function(project_ids, event_type = NULL) {
all_events <- list()
for (project_id in project_ids) {
cat("Récupération des événements pour le projet : ", project_id, "\n")
events <- tryCatch(
# Fonction pour récupérer les événements pour plusieurs projets
get_events_for_projects <- function(project_ids, event_type = NULL) {
all_events <- map(project_ids, ~{
cat("Récupération des événements pour le projet : ", .x, "\n")
tryCatch(
{
get_gitlab_events(project_id, event_type)
get_gitlab_events(.x, event_type)
},
error = function(e) {
message("Erreur lors de la récupération des événements pour le projet ", project_id, " : ", e$message)
message("Erreur lors de la récupération des événements pour le projet ", .x, " : ", e$message)
return(NULL) # Retourner NULL en cas d'erreur pour ce projet
}
)
if (!is.null(events)) {
all_events[[as.character(project_id)]] <- events
}
}
}) %>%
set_names(project_ids) %>%
discard(is.null)
all_events_df <- bind_rows(all_events, .id = "project_id")
return(all_events_df)
}
# Liste des identifiants de projets
project_ids <- résultats # Remplacez par vos identifiants de projets
project_ids <- as.list(groupf$id) # Remplacez par vos identifiants de projets
# Récupérer tous les événements pour tous les projets
all_events <- get_events_for_projects(project_ids)
# Convertir les données en un DataFrame
all_events_df <- as_tibble(all_events)
# pour le graphique temps/projet
data <- all_events_df %>%
## pour le graphique temps/projet
# traduction des type
traduction <- c(
"created" = "Création",
"DiffNote"= "Note d'information",
"DiscussionNote" = "Note de discussion" ,
"Issue" = "Ticket" ,
"joined" = "Rejoint" ,
"MergeRequest" = "Demande de fusion",
"pushed to" = "poussé vers",
"WikiPage::Meta" = "Page Wiki"
)
data_chronol <- all_events_df %>%
dplyr::mutate(
id = project_id,
type = ifelse(is.na(target_type), action_name, target_type),
temps = created_at,
info = ifelse(is.na(push_data.commit_title),target_title,push_data.commit_title)) %>%
dplyr::select(id, type, temps, info)
data$temps <- as.Date(data$temps)
data <- data %>%
dplyr::left_join(select(groupf,id,name),by = "id")
type = dplyr::coalesce(target_type,action_name),
type = as.factor(type),
temps = lubridate::as_datetime( created_at),
info = dplyr::coalesce(push_data.commit_title,target_title)) %>%
dplyr::select(id, type, temps, info) %>%
dplyr::left_join(dplyr::select(groupf,id,name),by = "id")
#au cas ou il reste des valeur manquante
data$info[is.na(data$info)] <- ""
data <- dplyr::distinct(data)
data <- data %>% dplyr::filter(!type %in% c("deleted", "pushed"))
data_chronol$info[is.na(data_chronol$info)] <- ""
data_chronol <- dplyr::distinct(data_chronol)
data_chronol <- data_chronol %>% dplyr::filter(!type %in% c("deleted", "pushed new"))
# Traduire les niveaux de facteur
data_chronol <- data_chronol %>%
dplyr::mutate(type = dplyr::recode(type, !!!traduction))
......@@ -4,7 +4,7 @@ server <- function(input, output) {
pageLength = 6 ,
order = list(6 , "desc"),
scrollY = 300, scrollX = 400, scroller = TRUE
)
), escape = FALSE
)
}
)
......@@ -46,13 +46,7 @@ server <- function(input, output) {
order = list(6 , "desc"),
scrollY = 600, scrollX = 400, scroller = TRUE))
})
dateinf <- shiny::reactive({
tail(groupid()$created_at, 1)
})
observeEvent(input$daterange1, {
print(dateinf())
})
output$dateinferieur <- renderText({dateinf()})
output$dateinferieur <- shiny::renderText({dateinf()})
output$activity <-
......@@ -71,23 +65,27 @@ server <- function(input, output) {
)
})
# utilisation du jeu de donnée data_chronol qui se trouve dans le global
filteredData <- reactive({
shiny::req(input$daterange)
data %>%
data_chronol %>%
dplyr::filter(temps >= as.Date(input$daterange[[1]]) & temps <= as.Date(input$daterange[[2]]))
})
output$filteredPlot <- plotly::renderPlotly({
p <- ggplot(filteredData(), aes(x = temps, y = as.factor(name))) +
geom_jitter(aes(shape = type, color = type, text = paste("",info)), size = 3, width = 0.1,height = 0.5) +
labs(x = "Temps", shape = "Type", color = "Type") +
theme_gouv() +
theme(axis.text.x = element_text(angle = 0, hjust = 1),
axis.title.y = element_blank())+
scale_color_gouv_discrete(palette = "pal_gouv_qual1")
p <- ggplot2::ggplot(filteredData(), ggplot2::aes(x = temps, y = as.factor(name))) +
ggplot2::geom_jitter(ggplot2::aes(shape = type,color = name,text = paste(temps, info, sep = "\n")),
size = 3,width = 0.75,height = 0,alpha = 0.5
) +
ggplot2::labs(x = "Temps") +
gouvdown::theme_gouv() +
ggplot2::theme(axis.text.x = ggplot2::element_text(angle = 0, hjust = 1), axis.title.y = ggplot2::element_blank())+
gouvdown::scale_color_gouv_discrete(palette = "pal_gouv_qual1")+
scale_shape_manual(values = 1 : 10)+
ggplot2::scale_x_datetime(date_labels = "%d %b", timezone = "Europe/Paris")
ggplotly(p, tooltip = "text")
plotly::ggplotly(p, tooltip = "text")
})
}
......@@ -2,23 +2,48 @@ ui <- shinygouv::navbarPage_dsfr(
title = "Dataviz GitlabR",
id = "nav",
header = shinygouv::header_dsfr(
intitule = c("République", "Française"),
intitule = c("DREAL", "Pays de la Loire"),
nom_site_service = "Tableau de bord GitLab-Forge",
baseline = "Les Projets du Centre de Service de la Donnée"
baseline = "Les Projets du Centre de Services de la Donnée"
),
footer = footer_dsfr(
intitule = c("Territoire", "Service"),
description = "une description",
accessibilite = "non",
add_extra_url_body = footer_extra_url_body_dsfr(
footer_li_dsfr(
href = "https://siteinternet.fr",
titre = "siteinternet.fr.fr - nouvelle fenêtre",
texte = "siteinternet.fr.fr", type = "body"
),
footer_li_dsfr(
href = "https://siteinternet.fr",
titre = "siteinternet.fr.fr - nouvelle fenêtre",
texte = "siteinternet.fr.fr", type = "body"
)
),
add_extra_url_bottom = footer_extra_url_bottom_dsfr(
footer_li_dsfr(
href = "https://siteinternet.fr",
titre = "siteinternet.fr.fr - nouvelle fenêtre",
texte = "siteinternet.fr.fr", type = "bottom"
)
)
),
# First tab Projet
shinygouv::navbarPanel_dsfr(
title = "Choix du projet à sélectionné",
shinygouv::fluidRow_dsfr(
shinygouv::column_dsfr(12, selectInput("ID1",
label = h3("Nom du projet séléctionné"),
label = h3("Nom du projet séléctionner"),
choices = choice ),
extra_class = "fr-my-6w")
),
shinygouv::fluidRow_dsfr(plotlyOutput(outputId = "issue_graph")),
shinygouv::fluidRow_dsfr(
shinygouv::column_dsfr(12,
DT::DTOutput(outputId = "tablef"),extra_class = "fr-mt-2w"))
DT::DTOutput(outputId = "tablef"),extra_class = "fr-my-1w"))
),
......@@ -38,13 +63,14 @@ ui <- shinygouv::navbarPage_dsfr(
start = "2016-01-01",
separator = "à"),
extra_class = "fr-my-6w"),
shinygouv::column_dsfr(12, DT::DTOutput(outputId = "issue")
shinygouv::column_dsfr(12, DT::DTOutput(outputId = "issue"),
extra_class = "fr-my-1w"
)
)
),
# third tab activity
shinygouv::navbarPanel_dsfr(
title = "Activité des projets",
title = "Activité des issues",
shinygouv::fluidRow_dsfr(
shinygouv::column_dsfr(12, DT::DTOutput(outputId = "activity")
,extra_class = "fr-my-6w")
......@@ -56,11 +82,11 @@ ui <- shinygouv::navbarPage_dsfr(
shinygouv::fluidRow_dsfr(
shinygouv::column_dsfr(12,shinygouv::dateRangeInput_dsfr(inputId = "daterange",
label = "Sélectionnez une période :",
start = "2024-07-01",
start = format(Sys.Date() - 7, format="%Y-%m-%d"),
separator = "à"),
extra_class = "fr-my-6w"),
shinygouv::column_dsfr(12,plotly::plotlyOutput("filteredPlot", height = "700px"),
extra_class = "fr-mt-1w")
extra_class = "fr-my-1w")
)
)
)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment