Admin group: counter = number of group students who submitted a solution

This commit is contained in:
2026-09-28 17:35:10 +03:00
parent 74c09aae53
commit daaacb1d5f
5 changed files with 11 additions and 33 deletions

View File

@@ -22,6 +22,7 @@ import ru.ysu.lms.web.api.GradeSetPayload
import ru.ysu.lms.web.api.GroupDetailDto
import ru.ysu.lms.web.api.LabSummaryDto
import ru.ysu.lms.web.api.StudentCandidateDto
import ru.ysu.lms.web.api.SubmissionDto
import ru.ysu.lms.web.api.createGroup
import ru.ysu.lms.web.api.downloadSubmissionAsAdmin
import ru.ysu.lms.web.api.getLabAssignments
@@ -37,7 +38,6 @@ import ru.ysu.lms.web.api.listGroups
import ru.ysu.lms.web.api.listLabs
import ru.ysu.lms.web.api.publishGrades
import ru.ysu.lms.web.api.setGrade
import ru.ysu.lms.web.api.submissionCount
import ru.ysu.lms.web.api.suggestComments
import tools.jackson.databind.ObjectMapper
import java.net.URLEncoder
@@ -192,7 +192,7 @@ class AdminGroupController(
)
}
fillGroupModel(model, groupViewModel(t, id, GroupRenderData(group, labs, rows, publishedLabs)))
fillGroupModel(model, groupViewModel(t, id, GroupRenderData(group, labs, rows, publishedLabs, submissionsBy)))
return "admin/group"
}
@@ -206,6 +206,7 @@ class AdminGroupController(
val labs: List<LabSummaryDto>,
val rows: List<GroupStudentRow>,
val publishedLabs: Set<String>,
val submissionsBy: Map<LabSummaryDto, Map<String, SubmissionDto>>,
)
private fun groupViewModel(
@@ -213,7 +214,14 @@ class AdminGroupController(
id: String,
data: GroupRenderData,
): GroupViewModel {
val submissionCounts = data.labs.associate { it.id to api.submissionCount(token, it.id) }
val memberIds =
data.group.students
.map { it.id }
.toSet()
val submissionCounts =
data.labs.associate { lab ->
lab.id to (data.submissionsBy[lab]?.keys?.count { it in memberIds } ?: 0)
}
val candidates = runCatching { api.groupCandidates(token, id) }.getOrDefault(emptyList())
return GroupViewModel(data.group, data.labs, candidates, data.rows, data.publishedLabs, submissionCounts)
}

View File

@@ -6,23 +6,6 @@ import org.springframework.http.HttpHeaders
import org.springframework.http.MediaType
import org.springframework.util.LinkedMultiValueMap
fun ApiClient.submissionCount(
token: String,
labId: String,
): Int {
val type = object : ParameterizedTypeReference<Map<String, Long>>() {}
val result =
call {
client
.get()
.uri("/api/v1/submissions/count?labId={id}", labId)
.header(HttpHeaders.AUTHORIZATION, bearer(token))
.retrieve()
.body(type)
}
return (result["count"] ?: 0L).toInt()
}
fun ApiClient.distribute(
token: String,
payload: DistributeRequestPayload,