Skip to content

Instantly share code, notes, and snippets.

@kenjisato
Last active October 11, 2019 00:29
Show Gist options
  • Save kenjisato/02d96d3692980d989bc3f3e6d6f54c87 to your computer and use it in GitHub Desktop.
Save kenjisato/02d96d3692980d989bc3f3e6d6f54c87 to your computer and use it in GitHub Desktop.
Convert nops_eval.zip for Moodle
# This function assumes that the 'Full name' column in Grading Worksheet
# has the following form: "Name registration_number".
# This assumption may fail for other instances of moodle, in which case
# we have to use different logic to merge 'Grading Worksheet' and
# regiatraion.csv and/or nops_eval.csv.
rewrite_for_moodle <- function(nops_zip,
worksheet_csv, # Downloaded from Moodle
nops_csv = NULL,
worksheet_points_col = "Grade",
reglength = 7,
pattern = "%s_%s_assignsubmission_file_",
suffix = "-moodle",
quote = TRUE) {
name <- tools::file_path_sans_ext(nops_zip)
if (is.null(nops_csv)) {
nops_csv <- paste0(name, ".csv")
}
nops_eval <- read.table(nops_csv, header = TRUE, sep = ";",
colClasses = "character")
worksheet <- read.csv(worksheet_csv, fileEncoding = "UTF-8",
stringsAsFactors = FALSE, check.names = FALSE)
worksheet_names <- names(worksheet)
# Remove prefix from submission ID column -> sid
worksheet$sid <- sub("^[^0-9]*([0-9]+)$", "\\1", worksheet[[1]])
# Pick registration numbers from Full name column.
worksheet$registration <- sub(paste0(".*([0-9]{", reglength, "}).*"),
"\\1", worksheet[[2]])
merged_df <- merge(worksheet, nops_eval, by = "registration",
sort = FALSE)
merged_df[[worksheet_points_col]] <- merged_df[["points"]]
merged_df$dir_name <- sprintf(pattern,
merged_df[[worksheet_names[[2]]]],
merged_df$sid)
# Write out updated Grading Worksheet
write.csv(merged_df[worksheet_names],
sub(".csv", paste0(suffix, ".csv"), worksheet_csv, fixed = TRUE),
row.names = FALSE, na = "", quote = quote)
# Process ZIP file
temp_dir <- tempfile()
dir.create(temp_dir); on.exit(unlink(temp_dir, recursive = TRUE))
unzip(nops_zip, exdir = temp_dir)
dirs <- list.files(temp_dir, full.names = TRUE)
for (d in dirs) {
student_dir <- basename(d)
new_dir_name <- merged_df$dir_name[merged_df$registration == student_dir]
if (length(new_dir_name) > 0){
file.rename(d, file.path(temp_dir, new_dir_name))
} else {
message("ID ", student_dir, " is not registered. Skipped.")
}
}
renamed_dirs <- list.files(temp_dir, full.names = TRUE)
zip::zipr(paste0(name, suffix, ".zip"), renamed_dirs)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment