Skip to content

Commit c32bf75

Browse files
authored
Merge pull request #47 from ReseauBiodiversiteQuebec/adne_refactor
Adne refactor
2 parents 7ff7b25 + d6d5d10 commit c32bf75

10 files changed

+90
-116
lines changed

DESCRIPTION

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
Package: rcoleo
22
Title: rcoleo
3-
Version: 2.3.0
3+
Version: 2.3.1
44
Authors@R: c(
55
person("Steve", "Vissault", , "steve.vissault@usherbrooke.ca", role = "aut",
66
comment = c(ORCID = "0000-0002-0866-4376")),

R/coleo_api_utils.R

+32
Original file line numberDiff line numberDiff line change
@@ -61,3 +61,35 @@ coleo_begin_req <- function(schema){
6161
"useragent" = "rcoleo") |>
6262
httr2::req_error(body = coleo_error_message)
6363
}
64+
65+
66+
####################
67+
# Fonctions de base pour les médias
68+
####################
69+
70+
# Config de base pour les médias
71+
media_server <- function(){
72+
s <- Sys.getenv("COLEOMEDIA_SERVER")
73+
if (s==''){
74+
if(file.exists(".local-server")){
75+
s <- as.character(readRDS(".local-server"))
76+
}else{
77+
s <- "https://coleo.biodiversite-quebec.ca/upload/"
78+
}
79+
}
80+
return(s)
81+
}
82+
83+
#' Pépare une requête générique à l'API de coleo-media
84+
#'
85+
#' @param server_dir Dossier sur le serveur où faire la requête
86+
#'
87+
#' @return Un objet httr2 request
88+
coleo_media_begin_req <- function(server_dir){
89+
paste0(media_server(), server_dir, "/") |>
90+
httr2::request() |>
91+
httr2::req_headers("Accept" = "application/json",
92+
`Content-type` = "multipart/form-data",
93+
"Authorization" = paste("Bearer", bearer())) |>
94+
httr2::req_error(body = coleo_error_message)
95+
}

R/coleo_inject.R

+12-67
Original file line numberDiff line numberDiff line change
@@ -120,12 +120,6 @@ coleo_inject <- function(df, media_path = NULL, schema = 'public') {
120120
### 1. Inject media files into coleo
121121
df_id <- coleo_inject_media(df_id, server_dir = 'observation', media_path)
122122

123-
} else if (campaign_type == "ADNe" & table == "landmarks") {
124-
## Obervations at the lake scale for "ADNe" campaigns do not have landmarks
125-
## Landmarks are injected even if there is no data with NA lat lon
126-
## It is necessary to skip their injection
127-
df_id <- coleo_inject_adne_landmarks(df_id, campaign_type)
128-
129123
} else {
130124
## Regular table injections
131125
df_id <- coleo_inject_table(df_id, table, schema = schema)
@@ -292,18 +286,18 @@ coleo_injection_prep <- function(df, db_table, schema = 'public'){
292286
colnames_of_tbl <- coleo_get_column_names(tbl = db_table)$column_name
293287

294288
df_prep <- df |>
295-
coleo_prep_input_data(db_table) |>
289+
coleo_prep_input_data(db_table, schema = schema) |>
296290
dplyr::mutate(inject_request = list(coleo_inject_general_df(dplyr::across(dplyr::any_of(colnames_of_tbl)), endpoint = db_table, schema = schema)))
297291

298292
} else if (db_table == "ref_species") {
299293
# ref_species is the only table where the table name and the endpoint name are NOT THE SAME
300294
# here we hard-code the difference. This lets us stay with the convention of using the table name as the argument (not the endpoint name)
301295
df_prep <- df |>
302-
coleo_prep_input_data(db_table) |>
296+
coleo_prep_input_data(db_table, schema = schema) |>
303297
dplyr::mutate(inject_request = list(coleo_inject_general_df(dplyr::cur_data_all(), endpoint = "taxa", schema = schema)))
304298
} else {
305299
df_prep <- df |>
306-
coleo_prep_input_data(db_table) |>
300+
coleo_prep_input_data(db_table, schema = schema) |>
307301
dplyr::mutate(inject_request = list(coleo_inject_general_df(dplyr::cur_data_all(), endpoint = db_table, schema = schema)))
308302

309303
}
@@ -520,27 +514,19 @@ coleo_inject_cells <- function(df, schema = 'public') {
520514
coleo_inject_media <- function(df_id, server_dir = "observation", file_dir) {
521515
#--------------------------------------------------------------------------
522516
# 1. Prep request
523-
#--------------------------lures------------------------------------------------
524-
url <- paste0(server(), "/upload/", server_dir, "/")
525-
517+
#--------------------------------------------------------------------------
526518
medias_requests <- df_id |>
527519
dplyr::rowwise() |>
528520
dplyr::mutate(inject_request = list(
529521
## Form request
530-
httr2::request(url) |>
531-
httr2::req_headers(
532-
`Content-type` = "multipart/form-data",
533-
Authorization = paste("Bearer", bearer())
534-
) |>
535-
## Add id to request URL
536-
## - Can be observation_id, campaign_id, etc.
537-
httr2::req_url_path_append(!!as.name(paste0(server_dir, "_id"))) |>
538-
## Error body
539-
httr2::req_error(body = coleo_error_message) |>
540-
## Send file
541-
httr2::req_body_multipart(
542-
media = curl::form_file(paste0(file_dir, "/", media_name)),
543-
type = "image")
522+
coleo_media_begin_req(server_dir) |>
523+
## Add id to request URL
524+
## - Can be observation_id, campaign_id, etc.
525+
httr2::req_url_path_append(!!as.name(paste0(server_dir, "_id"))) |>
526+
## Send file
527+
httr2::req_body_multipart(
528+
media = curl::form_file(paste0(file_dir, "/", media_name)),
529+
type = "image")
544530
))
545531

546532
#--------------------------------------------------------------------------
@@ -666,47 +652,6 @@ coleo_inject_mam_landmarks <- function(df_id, schema = 'public') {
666652
}
667653

668654

669-
#' Injection des repères d'une campagne ADNe dans la table
670-
#' landmarks de coleo.
671-
#'
672-
#' L'injection des repèes ADNe est différente des autres de par la structure du jeu de données (tel que formaté par le template). Les observation à l'échelle du lac n'ont pas de repères alors que celles à l'échelle de la station ont des repères.
673-
#'
674-
#' Accepte un data.frame validè par \code{\link[rcoleo]{coleo_validate}} et performe
675-
#' l'injection de la table landmarks.
676-
#'
677-
#' La fonction est utilisée par \code{\link[rcoleo]{coleo_inject}}.
678-
#'
679-
#' @param df_id Un data.frame contenant une colonne campaign_id.
680-
#' @param campaign_type Type de la campagne. Doit être "ADNe".
681-
#' @param schema Schéma sur lequel faire la requête. Par défaut, le schéma
682-
#' public est utilisé.
683-
#'
684-
#' @return Une data.frame avec une colonne landmark_X_id et une colonne pour
685-
#' les landmark_X_error.
686-
#'
687-
coleo_inject_adne_landmarks <- function(df_id, campaign_type, schema = 'public') {
688-
# Obervations at the lake scale for "ADNe" campaigns do not have landmarks
689-
# Landmarks are injected even if there is no data with NA lat lon
690-
# It is necessary to skip their injection
691-
which_lac <- df_id$observations_extra_value_1 == "lac"
692-
no_lake_id <- df_id[!which_lac,] |>
693-
coleo_inject_table(table = "landmarks", schema = schema)
694-
695-
# Reassemble the dataframes
696-
with_lac <- df_id[which_lac,]
697-
with_lac[setdiff(names(no_lake_id), names(with_lac))] <- NA_character_
698-
df_id <- rbind(no_lake_id, with_lac[names(no_lake_id)])
699-
700-
# Order columns
701-
df_id <- df_id[,order(colnames(df_id))] |>
702-
dplyr::relocate(dplyr::ends_with("_error")) |>
703-
dplyr::relocate(dplyr::ends_with("_id"))
704-
705-
# Return the results
706-
return(df_id)
707-
}
708-
709-
710655
#' Injection des colonnes taxa_names dans la table ref_species de coleo.
711656
#'
712657
#' Accepte un vecteur de noms de taxons et performe l'injection de la table

R/coleo_prep_input_data.R

+4-3
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,11 @@
1111
#'
1212
#' @param df le dataframe à preparer
1313
#' @param db_table la table ciblée dans la base de données
14+
#' @param schema le schéma de la base de données
1415
#'
1516
#' @return un tbl, nested
1617
#' @export
17-
coleo_prep_input_data <- function(df, db_table) {
18+
coleo_prep_input_data <- function(df, db_table, schema = "public") {
1819

1920
# Convert character NAs to actual NAs
2021
# df[df == "NA"] <- NA
@@ -23,7 +24,7 @@ coleo_prep_input_data <- function(df, db_table) {
2324
if (db_table == "sites") {
2425
df <- df |>
2526
dplyr::nest_by(cells_cell_code) |>
26-
dplyr::mutate(coleo_id = list(coleo_request_by_code(human_code = cells_cell_code, table = "cells")),
27+
dplyr::mutate(coleo_id = list(coleo_request_by_code(human_code = cells_cell_code, table = "cells", schema = schema)),
2728
cell_id = coleo_extract_id(coleo_id)) |>
2829
dplyr::select(-cells_cell_code, -coleo_id) |>
2930
dplyr::relocate(cell_id) |>
@@ -36,7 +37,7 @@ coleo_prep_input_data <- function(df, db_table) {
3637
## Add site_id to campaigns table
3738
df <- df |>
3839
dplyr::nest_by(sites_site_code) |>
39-
dplyr::mutate(coleo_id = list(coleo_request_by_code(human_code = sites_site_code, table = "sites")),
40+
dplyr::mutate(coleo_id = list(coleo_request_by_code(human_code = sites_site_code, table = "sites", schema = schema)),
4041
site_id = coleo_extract_id(coleo_id)) |>
4142
dplyr::select(-sites_site_code, -coleo_id) |>
4243
dplyr::relocate(site_id) |>

R/coleo_request.R

+3-2
Original file line numberDiff line numberDiff line change
@@ -61,11 +61,12 @@ coleo_request_general <- function(endpoint, perform = TRUE, response_as_df = FAL
6161
#'
6262
#' @param human_code Code de site ou de cellule.
6363
#' @param table Table de la base de données à accéder. Seuls "cells" et "sites" sont supportés pour l'instant.
64+
#' @param schema Schéma de la base de données à accéder. Par défaut, "public".
6465
#' @param perform TRUE par default. Ne performe pas la requête et retourne l'object httr2 request si FALSE.
6566
#'
6667
#' @return si perform = TRUE, la réponse est retournée. Si perform = FALSE, la requête httr2 est retournée.
6768
#' @export
68-
coleo_request_by_code <- function(human_code, table, perform = TRUE){
69+
coleo_request_by_code <- function(human_code, table, schema = "public", perform = TRUE){
6970
# endpoint or whatever
7071
requested_code <- list(human_code)
7172
requested_code <- paste0("eq.", requested_code[[1]])
@@ -76,7 +77,7 @@ coleo_request_by_code <- function(human_code, table, perform = TRUE){
7677
sites = "site_code",
7778
stop("idk what to do with that"))
7879

79-
written_req <- coleo_begin_req('public') |>
80+
written_req <- coleo_begin_req(schema) |>
8081
httr2::req_url_path_append(table) |>
8182
httr2::req_url_query(!!!requested_code)
8283

R/coleo_validate.R

+15-11
Original file line numberDiff line numberDiff line change
@@ -341,18 +341,20 @@ coleo_validate <- function(data, media_path = NULL) {
341341
#------------------------------------------------------------------------
342342
# Check that complexes of species are correctly formated
343343
#------------------------------------------------------------------------
344-
is_complexes <- grepl("|", data$obs_species_taxa_name) |> which()
345-
if(!length(is_complexes) == 0) {
346-
cplx_valid <-sapply(data$obs_species_taxa_name[is_complexes], function(cplx) {
347-
cplx_split <- strsplit(cplx, "|", fixed = TRUE) |>
348-
unlist() |>
349-
stringr::str_trim()
350-
cplx_formated <- paste(cplx_split, collapse = " | ")
351-
identical(cplx, cplx_formated)
352-
})
344+
if ("obs_species_taxa_name" %in% dat_names) {
345+
is_complexes <- grepl("|", data$obs_species_taxa_name) |> which()
346+
if(!length(is_complexes) == 0) {
347+
cplx_valid <-sapply(data$obs_species_taxa_name[is_complexes], function(cplx) {
348+
cplx_split <- strsplit(cplx, "|", fixed = TRUE) |>
349+
unlist() |>
350+
stringr::str_trim()
351+
cplx_formated <- paste(cplx_split, collapse = " | ")
352+
identical(cplx, cplx_formated)
353+
})
353354

354-
if(!all(cplx_valid)) warning("--------------------------------------------------\nV\u00E9rifiez le format des complexes d'esp\u00e8ces : certain complexes sont incorrectement format\u00E9s. Les taxons composants le complexe doivent être s\u00E9par\u00E9s par une barre verticale flanqu\u00E9e d'un espace de chaque côt\u00E9 \" | \". Exemple : \"Acer saccharum | Acer negundo\"\n\n")
355+
if(!all(cplx_valid)) warning("--------------------------------------------------\nV\u00E9rifiez le format des complexes d'esp\u00e8ces : certain complexes sont incorrectement format\u00E9s. Les taxons composants le complexe doivent être s\u00E9par\u00E9s par une barre verticale flanqu\u00E9e d'un espace de chaque côt\u00E9 \" | \". Exemple : \"Acer saccharum | Acer negundo\"\n\n")
355356

357+
}
356358
}
357359

358360

@@ -520,7 +522,9 @@ coleo_validate <- function(data, media_path = NULL) {
520522
if (campaign_type == "végétation_transect" & table == "campaigns") message <- new_vegetation_transect_campaigns(data, nvals)
521523

522524
### Update message with missing observations
523-
if (any(is.na(data$obs_species_taxa_name)) & table == "observations") message <- missing_obs(data, nvals)
525+
if ("obs_species_taxa_name" %in% dat_names) {
526+
if (any(is.na(data$obs_species_taxa_name)) & table == "observations") message <- missing_obs(data, nvals)
527+
}
524528

525529
### Print message
526530
message(message)

man/coleo_inject_adne_landmarks.Rd

-30
This file was deleted.

man/coleo_media_begin_req.Rd

+17
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

man/coleo_prep_input_data.Rd

+3-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

man/coleo_request_by_code.Rd

+3-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)