Admin group: counter = number of group students who submitted a solution
This commit is contained in:
@@ -56,13 +56,6 @@ class SubmissionController(
|
|||||||
@RequestParam labId: UUID,
|
@RequestParam labId: UUID,
|
||||||
): List<SubmissionDto> = submissions.latestPerStudent(labId)
|
): List<SubmissionDto> = submissions.latestPerStudent(labId)
|
||||||
|
|
||||||
/** Общее число решений (всех попыток) по лабораторной. */
|
|
||||||
@GetMapping("/submissions/count")
|
|
||||||
@PreAuthorize("hasAuthority('ROLE_ADMIN')")
|
|
||||||
fun submissionCount(
|
|
||||||
@RequestParam labId: UUID,
|
|
||||||
): Map<String, Long> = mapOf("count" to submissions.countForLab(labId))
|
|
||||||
|
|
||||||
@GetMapping("/submissions/{id}/download")
|
@GetMapping("/submissions/{id}/download")
|
||||||
@PreAuthorize("hasAuthority('ROLE_ADMIN')")
|
@PreAuthorize("hasAuthority('ROLE_ADMIN')")
|
||||||
fun downloadForAdmin(
|
fun downloadForAdmin(
|
||||||
|
|||||||
@@ -101,10 +101,6 @@ class SubmissionService(
|
|||||||
return zip to name
|
return zip to name
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Общее число решений (всех попыток) по лабораторной. */
|
|
||||||
@Transactional(readOnly = true)
|
|
||||||
fun countForLab(labId: UUID): Long = submissions.countByLabId(labId)
|
|
||||||
|
|
||||||
@Transactional(readOnly = true)
|
@Transactional(readOnly = true)
|
||||||
fun latestPerStudent(labId: UUID): List<SubmissionDto> {
|
fun latestPerStudent(labId: UUID): List<SubmissionDto> {
|
||||||
val perStudent = mutableMapOf<UUID, Submission>()
|
val perStudent = mutableMapOf<UUID, Submission>()
|
||||||
|
|||||||
@@ -14,8 +14,6 @@ interface SubmissionRepository : JpaRepository<Submission, UUID> {
|
|||||||
|
|
||||||
fun findByLabIdOrderByCreatedAtDesc(labId: UUID): List<Submission>
|
fun findByLabIdOrderByCreatedAtDesc(labId: UUID): List<Submission>
|
||||||
|
|
||||||
fun countByLabId(labId: UUID): Long
|
|
||||||
|
|
||||||
fun findFirstByStudentIdAndLabIdOrderBySeqDesc(
|
fun findFirstByStudentIdAndLabIdOrderBySeqDesc(
|
||||||
studentId: UUID,
|
studentId: UUID,
|
||||||
labId: UUID,
|
labId: UUID,
|
||||||
|
|||||||
@@ -22,6 +22,7 @@ import ru.ysu.lms.web.api.GradeSetPayload
|
|||||||
import ru.ysu.lms.web.api.GroupDetailDto
|
import ru.ysu.lms.web.api.GroupDetailDto
|
||||||
import ru.ysu.lms.web.api.LabSummaryDto
|
import ru.ysu.lms.web.api.LabSummaryDto
|
||||||
import ru.ysu.lms.web.api.StudentCandidateDto
|
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.createGroup
|
||||||
import ru.ysu.lms.web.api.downloadSubmissionAsAdmin
|
import ru.ysu.lms.web.api.downloadSubmissionAsAdmin
|
||||||
import ru.ysu.lms.web.api.getLabAssignments
|
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.listLabs
|
||||||
import ru.ysu.lms.web.api.publishGrades
|
import ru.ysu.lms.web.api.publishGrades
|
||||||
import ru.ysu.lms.web.api.setGrade
|
import ru.ysu.lms.web.api.setGrade
|
||||||
import ru.ysu.lms.web.api.submissionCount
|
|
||||||
import ru.ysu.lms.web.api.suggestComments
|
import ru.ysu.lms.web.api.suggestComments
|
||||||
import tools.jackson.databind.ObjectMapper
|
import tools.jackson.databind.ObjectMapper
|
||||||
import java.net.URLEncoder
|
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"
|
return "admin/group"
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -206,6 +206,7 @@ class AdminGroupController(
|
|||||||
val labs: List<LabSummaryDto>,
|
val labs: List<LabSummaryDto>,
|
||||||
val rows: List<GroupStudentRow>,
|
val rows: List<GroupStudentRow>,
|
||||||
val publishedLabs: Set<String>,
|
val publishedLabs: Set<String>,
|
||||||
|
val submissionsBy: Map<LabSummaryDto, Map<String, SubmissionDto>>,
|
||||||
)
|
)
|
||||||
|
|
||||||
private fun groupViewModel(
|
private fun groupViewModel(
|
||||||
@@ -213,7 +214,14 @@ class AdminGroupController(
|
|||||||
id: String,
|
id: String,
|
||||||
data: GroupRenderData,
|
data: GroupRenderData,
|
||||||
): GroupViewModel {
|
): 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())
|
val candidates = runCatching { api.groupCandidates(token, id) }.getOrDefault(emptyList())
|
||||||
return GroupViewModel(data.group, data.labs, candidates, data.rows, data.publishedLabs, submissionCounts)
|
return GroupViewModel(data.group, data.labs, candidates, data.rows, data.publishedLabs, submissionCounts)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,23 +6,6 @@ import org.springframework.http.HttpHeaders
|
|||||||
import org.springframework.http.MediaType
|
import org.springframework.http.MediaType
|
||||||
import org.springframework.util.LinkedMultiValueMap
|
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(
|
fun ApiClient.distribute(
|
||||||
token: String,
|
token: String,
|
||||||
payload: DistributeRequestPayload,
|
payload: DistributeRequestPayload,
|
||||||
|
|||||||
Reference in New Issue
Block a user