From d35d3450590f359657ac1abc12180978cfe357e7 Mon Sep 17 00:00:00 2001 From: Vladislav Kopnin Date: Sun, 27 Sep 2026 20:46:17 +0300 Subject: [PATCH] Admin: name submission archives as group-studentNo-name-attempt --- .../ru/ysu/lms/web/admin/AdminController.kt | 22 ++++++++++++++++++- .../main/resources/templates/admin/group.html | 2 +- .../main/resources/templates/admin/lab.html | 2 +- 3 files changed, 23 insertions(+), 3 deletions(-) diff --git a/web/src/main/kotlin/ru/ysu/lms/web/admin/AdminController.kt b/web/src/main/kotlin/ru/ysu/lms/web/admin/AdminController.kt index 5aa4a38..5abdf06 100644 --- a/web/src/main/kotlin/ru/ysu/lms/web/admin/AdminController.kt +++ b/web/src/main/kotlin/ru/ysu/lms/web/admin/AdminController.kt @@ -746,16 +746,36 @@ class AdminController( @GetMapping("/submissions/{id}/download") fun downloadSubmissionAsAdmin( @PathVariable id: String, + @RequestParam(required = false) group: String?, + @RequestParam(required = false) no: String?, + @RequestParam(required = false) name: String?, + @RequestParam(required = false) attempt: String?, session: HttpSession, ): ResponseEntity { val file = api.downloadSubmissionAsAdmin(token(session), id) - val encoded = java.net.URLEncoder.encode(file.filename, java.nio.charset.StandardCharsets.UTF_8) + val filename = submissionFilename(group, no, name, attempt) ?: file.filename + val encoded = java.net.URLEncoder.encode(filename, java.nio.charset.StandardCharsets.UTF_8) return ResponseEntity.ok() .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename*=UTF-8''$encoded") .contentType(MediaType.APPLICATION_OCTET_STREAM) .body(file.bytes) } + /** Человекочитаемое имя архива сдачи: группа-номер студенческого-ФИО-попыткаN.zip */ + private fun submissionFilename(group: String?, no: String?, name: String?, attempt: String?): String? { + val parts = listOfNotNull( + group?.takeIf { it.isNotBlank() }, + no?.takeIf { it.isNotBlank() }, + name?.takeIf { it.isNotBlank() }, + attempt?.takeIf { it.isNotBlank() }?.let { "попытка$it" }, + ) + if (parts.isEmpty()) return null + val base = parts.joinToString("-") + .replace(Regex("[\\\\/:*?\"<>|\\r\\n]"), "_") + .trim() + return if (base.isBlank()) null else "$base.zip" + } + @PostMapping("/labs/{labId}/assign") fun assignVariant( @PathVariable labId: String, diff --git a/web/src/main/resources/templates/admin/group.html b/web/src/main/resources/templates/admin/group.html index c1281c7..5c63f02 100644 --- a/web/src/main/resources/templates/admin/group.html +++ b/web/src/main/resources/templates/admin/group.html @@ -89,7 +89,7 @@ 🛡⏳ 🛡✓ ↓1 ↓—