From ea7231df06b30ea4e6504b3b8bdba48be44ed216 Mon Sep 17 00:00:00 2001 From: Paul Wildenhain Date: Mon, 27 Feb 2023 14:50:09 -0500 Subject: [PATCH 1/6] :bug: Fix coltypes for projects with dags --- R/redcap-metadata-coltypes.R | 8 ++++++-- tests/testthat/test-metadata-coltypes.R | 6 ++++++ 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/R/redcap-metadata-coltypes.R b/R/redcap-metadata-coltypes.R index 67045dff..1033f81d 100644 --- a/R/redcap-metadata-coltypes.R +++ b/R/redcap-metadata-coltypes.R @@ -235,11 +235,14 @@ redcap_metadata_internal <- function( d_meta <- REDCapR::redcap_metadata_read( redcap_uri, token, verbose = verbose, handle_httr = handle_httr)$data d_inst <- REDCapR::redcap_instruments( redcap_uri, token, verbose = verbose, handle_httr = handle_httr)$data d_proj <- REDCapR::redcap_project_info_read(redcap_uri, token, verbose = verbose, handle_httr = handle_httr)$data + d_dags <- REDCapR::redcap_dag_read( redcap_uri, token, verbose = verbose, handle_httr = handle_httr)$data + # Determine status of autonumbering, instrument complete status, and decimal mark .record_field <- d_var$original_field_name[1] # The first field should always be the "record" identifier. .autonumber <- d_proj$record_autonumbering_enabled[1] - .plumbing_possibles <- c(.record_field, "redcap_event_name", "redcap_repeat_instrument", "redcap_repeat_instance") + .dags <- nrow(d_dags) > 0 + .plumbing_possibles <- c(.record_field, "redcap_event_name", "redcap_repeat_instrument", "redcap_repeat_instance") decimal_period <- (locale$decimal_mark == ".") decimal_comma <- (locale$decimal_mark == ",") @@ -371,12 +374,13 @@ redcap_metadata_internal <- function( d <- d_meta %>% dplyr::mutate( + dags = (.dags & (.data$field_name == .record_field)), autonumber = (.autonumber & (.data$field_name == .record_field)), ) %>% dplyr::mutate( response = dplyr::case_when( - autonumber ~ paste0("col_integer()" , "~~record_autonumbering is enabled for the project"), + autonumber & !dags ~ paste0("col_integer()" , "~~record_autonumbering is enabled for the project"), field_type == "event_name" ~ paste0("col_character()" , "~~longitudinal event_name"), field_type == "repeat_instrument" ~ paste0("col_character()" , "~~repeat_instrument"), field_type == "repeat_instance" ~ paste0("col_integer()" , "~~repeat_instance"), diff --git a/tests/testthat/test-metadata-coltypes.R b/tests/testthat/test-metadata-coltypes.R index 362b52c5..4b259505 100644 --- a/tests/testthat/test-metadata-coltypes.R +++ b/tests/testthat/test-metadata-coltypes.R @@ -33,6 +33,8 @@ test_that("simple", { expect_equal(actual, expected=expected, label="The returned col_types should be correct", ignore_attr = TRUE) # dput(returned_object$data) expect_s3_class(actual, "col_spec") + # Project has dags, so record_id should be a character + expect_equal(actual$cols$record_id, readr::col_character()) ds <- redcap_read_oneshot( @@ -68,6 +70,8 @@ test_that("longitudinal", { expect_equal(actual, expected=expected, label="The returned col_types should be correct", ignore_attr = TRUE) # dput(returned_object$data) expect_s3_class(actual, "col_spec") + # Project does not have auto-numbering enabled, so study_id should be a character + expect_equal(actual$cols$study_id, readr::col_character()) ds <- redcap_read_oneshot( @@ -103,6 +107,8 @@ test_that("superwide", { # # expect_equal(actual, expected=expected, label="The returned col_types should be correct", ignore_attr = TRUE) # dput(returned_object$data) expect_s3_class(actual, "col_spec") + # Project has auto-numbering enabled, and no dags, so record_id should be an integer + expect_equal(actual$cols$record_id, readr::col_integer()) ds <- redcap_read_oneshot( From 6802e9a63eba9a6c6a4ad53f341c59182eb46366 Mon Sep 17 00:00:00 2001 From: Paul Wildenhain Date: Tue, 28 Feb 2023 12:04:26 -0500 Subject: [PATCH 2/6] :memo: Modify justification for col type --- R/redcap-metadata-coltypes.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/R/redcap-metadata-coltypes.R b/R/redcap-metadata-coltypes.R index 1033f81d..a99a98db 100644 --- a/R/redcap-metadata-coltypes.R +++ b/R/redcap-metadata-coltypes.R @@ -380,7 +380,7 @@ redcap_metadata_internal <- function( dplyr::mutate( response = dplyr::case_when( - autonumber & !dags ~ paste0("col_integer()" , "~~record_autonumbering is enabled for the project"), + autonumber & !dags ~ paste0("col_integer()" , "~~record_autonumbering is enabled for a project without DAGs"), field_type == "event_name" ~ paste0("col_character()" , "~~longitudinal event_name"), field_type == "repeat_instrument" ~ paste0("col_character()" , "~~repeat_instrument"), field_type == "repeat_instance" ~ paste0("col_integer()" , "~~repeat_instance"), From 7799eab6dcff2a98bd5f2d2ba3efa26224d743be Mon Sep 17 00:00:00 2001 From: Paul Wildenhain Date: Tue, 28 Feb 2023 12:04:42 -0500 Subject: [PATCH 3/6] :newspaper: Add contribution to NEWS.md --- NEWS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/NEWS.md b/NEWS.md index 211f4eda..8bb5e1a3 100644 --- a/NEWS.md +++ b/NEWS.md @@ -75,6 +75,7 @@ This will help extract forms from longitudinal & repeating projects. * `redcap_dag_read()` has new `data_access_group_id` field (introduced maybe in [13.1.0](https://community.projectredcap.org/articles/13/index.html)) (#459) * `redcap_users_export()` has new `mycap_participants` field (introduced maybe in [13.0.0](https://community.projectredcap.org/articles/13/index.html)) (#459) * Accommodate older versions of REDCap that don't return project-level variable, like `has_repeating_instruments_or_events`, `missing_data_codes`, `external_modules`, `bypass_branching_erase_field_prompt` (@the-mad-statter, #465, #466) +* `redcap_meta_coltypes()` correctly determines data type for autonumber `record_id` fields. It suggests a character if the project has DAGs, and an integer if not. (@pwildenhain, #472) Version 1.1.0 (released 2022-08-10) From ef2171960807ede2136172e59b866953b7928666 Mon Sep 17 00:00:00 2001 From: Paul Wildenhain Date: Tue, 28 Feb 2023 20:22:54 -0500 Subject: [PATCH 4/6] :speech_balloon: Add better message for record_id with DAGs --- R/redcap-metadata-coltypes.R | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/R/redcap-metadata-coltypes.R b/R/redcap-metadata-coltypes.R index a99a98db..56def415 100644 --- a/R/redcap-metadata-coltypes.R +++ b/R/redcap-metadata-coltypes.R @@ -380,7 +380,8 @@ redcap_metadata_internal <- function( dplyr::mutate( response = dplyr::case_when( - autonumber & !dags ~ paste0("col_integer()" , "~~record_autonumbering is enabled for a project without DAGs"), + dags ~ paste0("col_character()" , "~~DAGs are enabled for the project"), + autonumber & !dags ~ paste0("col_integer()" , "~~record_autonumbering is enabled and DAGs are disabled for the project"), field_type == "event_name" ~ paste0("col_character()" , "~~longitudinal event_name"), field_type == "repeat_instrument" ~ paste0("col_character()" , "~~repeat_instrument"), field_type == "repeat_instance" ~ paste0("col_integer()" , "~~repeat_instance"), From 212e99ed6bd217d825359fd8fcb84e8335057edb Mon Sep 17 00:00:00 2001 From: Paul Wildenhain Date: Tue, 28 Feb 2023 20:34:05 -0500 Subject: [PATCH 5/6] :fire: Remove extra line --- R/redcap-metadata-coltypes.R | 1 - 1 file changed, 1 deletion(-) diff --git a/R/redcap-metadata-coltypes.R b/R/redcap-metadata-coltypes.R index 56def415..0e35c9bc 100644 --- a/R/redcap-metadata-coltypes.R +++ b/R/redcap-metadata-coltypes.R @@ -237,7 +237,6 @@ redcap_metadata_internal <- function( d_proj <- REDCapR::redcap_project_info_read(redcap_uri, token, verbose = verbose, handle_httr = handle_httr)$data d_dags <- REDCapR::redcap_dag_read( redcap_uri, token, verbose = verbose, handle_httr = handle_httr)$data - # Determine status of autonumbering, instrument complete status, and decimal mark .record_field <- d_var$original_field_name[1] # The first field should always be the "record" identifier. .autonumber <- d_proj$record_autonumbering_enabled[1] From 60d8ff99332e64c4d5e23de8b59912df976765e1 Mon Sep 17 00:00:00 2001 From: Paul Wildenhain Date: Thu, 2 Mar 2023 11:13:23 -0500 Subject: [PATCH 6/6] :bug: Account for case where user is assigned a DAG --- R/redcap-metadata-coltypes.R | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/R/redcap-metadata-coltypes.R b/R/redcap-metadata-coltypes.R index 0e35c9bc..22ce18d6 100644 --- a/R/redcap-metadata-coltypes.R +++ b/R/redcap-metadata-coltypes.R @@ -235,12 +235,13 @@ redcap_metadata_internal <- function( d_meta <- REDCapR::redcap_metadata_read( redcap_uri, token, verbose = verbose, handle_httr = handle_httr)$data d_inst <- REDCapR::redcap_instruments( redcap_uri, token, verbose = verbose, handle_httr = handle_httr)$data d_proj <- REDCapR::redcap_project_info_read(redcap_uri, token, verbose = verbose, handle_httr = handle_httr)$data - d_dags <- REDCapR::redcap_dag_read( redcap_uri, token, verbose = verbose, handle_httr = handle_httr)$data + d_dags <- REDCapR::redcap_dag_read( redcap_uri, token, verbose = verbose, handle_httr = handle_httr) # Determine status of autonumbering, instrument complete status, and decimal mark .record_field <- d_var$original_field_name[1] # The first field should always be the "record" identifier. .autonumber <- d_proj$record_autonumbering_enabled[1] - .dags <- nrow(d_dags) > 0 + # If the dags call fails, since the user is assigned to a DAG, then we assign .dags a value of TRUE + .dags <- nrow(d_dags$data) > 0 | grep("do not have permission", d_dags$raw_text) .plumbing_possibles <- c(.record_field, "redcap_event_name", "redcap_repeat_instrument", "redcap_repeat_instance") decimal_period <- (locale$decimal_mark == ".") decimal_comma <- (locale$decimal_mark == ",")