diff --git a/src/main/java/org/olat/course/nodes/iq/QTI21IdentityListCourseNodeToolsController.java b/src/main/java/org/olat/course/nodes/iq/QTI21IdentityListCourseNodeToolsController.java index ac72b5777eb659cc10a326f78958658564c0ff5d..7ce2075705b4e049d424d3aedd1e7df2acf42e56 100644 --- a/src/main/java/org/olat/course/nodes/iq/QTI21IdentityListCourseNodeToolsController.java +++ b/src/main/java/org/olat/course/nodes/iq/QTI21IdentityListCourseNodeToolsController.java @@ -314,7 +314,7 @@ public class QTI21IdentityListCourseNodeToolsController extends AbstractToolsCon Map<Identity, TestSessionState> testSessionStates = new HashMap<>(); testSessionStates.put(assessedIdentity, testSessionState); CorrectionOverviewModel model = new CorrectionOverviewModel(courseEntry, testCourseNode, testEntry, - resolvedAssessmentTest, manifestBuilder, lastSessionMap, testSessionStates); + resolvedAssessmentTest, manifestBuilder, lastSessionMap, testSessionStates, getTranslator()); correctionCtrl = new CorrectionIdentityAssessmentItemListController(ureq, getWindowControl(), stackPanel, model, assessedIdentity, assessmentEntryDone); listenTo(correctionCtrl); diff --git a/src/main/java/org/olat/ims/qti21/ui/QTI21AssessmentDetailsController.java b/src/main/java/org/olat/ims/qti21/ui/QTI21AssessmentDetailsController.java index eb129c2b63c025e29db49d38ecf0f705e05cf7aa..0aed78139fe192eeaaecb0522e4e93be0bbbda8d 100644 --- a/src/main/java/org/olat/ims/qti21/ui/QTI21AssessmentDetailsController.java +++ b/src/main/java/org/olat/ims/qti21/ui/QTI21AssessmentDetailsController.java @@ -480,7 +480,7 @@ public class QTI21AssessmentDetailsController extends FormBasicController { testSessionStates.put(assessedIdentity, testSessionState); boolean correctionReadOnly = readOnly || assessmentEntryDone; CorrectionOverviewModel model = new CorrectionOverviewModel(entry, courseNode, testEntry, - resolvedAssessmentTest, manifestBuilder, lastSessions, testSessionStates); + resolvedAssessmentTest, manifestBuilder, lastSessions, testSessionStates, getTranslator()); correctionCtrl = new CorrectionIdentityAssessmentItemListController(ureq, getWindowControl(), stackPanel, model, assessedIdentity, correctionReadOnly); listenTo(correctionCtrl); diff --git a/src/main/java/org/olat/ims/qti21/ui/assessment/CorrectionAssessmentItemListController.java b/src/main/java/org/olat/ims/qti21/ui/assessment/CorrectionAssessmentItemListController.java index 12ca5fd64c525c49e1b6e5588d6fadac23906e52..e62983cf31b74a0630e15369f85a74f436601a15 100644 --- a/src/main/java/org/olat/ims/qti21/ui/assessment/CorrectionAssessmentItemListController.java +++ b/src/main/java/org/olat/ims/qti21/ui/assessment/CorrectionAssessmentItemListController.java @@ -411,7 +411,6 @@ public class CorrectionAssessmentItemListController extends FormBasicController } //reorder to match the list of identities - int count = 1; List<Identity> assessedIdentities = model.getAssessedIdentities(); List<AssessmentItemListEntry> reorderItemSessions = new ArrayList<>(assessedIdentities.size()); for(Identity assessedIdentity:assessedIdentities) { @@ -424,7 +423,7 @@ public class CorrectionAssessmentItemListController extends FormBasicController String title; if(anonymous) { - title = translate("number.assessed.identity", new String[] { Integer.toString(count++)} ); + title = model.getAnonymizedName(assessedIdentity); } else { title = userManager.getUserDisplayName(assessedIdentity); } diff --git a/src/main/java/org/olat/ims/qti21/ui/assessment/CorrectionIdentityListController.java b/src/main/java/org/olat/ims/qti21/ui/assessment/CorrectionIdentityListController.java index ab80e635b0d1f35ef1a7cde756f8bbf926b791c1..95149d69537c4b9bbd66cc00de01964e260cbb14 100644 --- a/src/main/java/org/olat/ims/qti21/ui/assessment/CorrectionIdentityListController.java +++ b/src/main/java/org/olat/ims/qti21/ui/assessment/CorrectionIdentityListController.java @@ -219,15 +219,14 @@ public class CorrectionIdentityListController extends FormBasicController { } } - int count = 0; List<CorrectionIdentityRow> rows = new ArrayList<>(model.getNumberOfAssessedIdentities()); Map<Identity, CorrectionIdentityRow> identityToRows = new HashMap<>(); for(Map.Entry<Identity, AssessmentTestSession> entry:model.getLastSessions().entrySet()) { - TestSessionState testSessionState = model.getTestSessionStates().get(entry.getKey()); + Identity assessedIdentity = entry.getKey(); + TestSessionState testSessionState = model.getTestSessionStates().get(assessedIdentity); if(testSessionState != null) { - String user = translate("number.assessed.identity", new String[]{ Integer.toString(++count) }); - CorrectionIdentityRow row = new CorrectionIdentityRow(user, entry.getKey(), entry.getValue(), userPropertyHandlers, getLocale()); - rows.add(row); + String user = model.getAnonymizedName(assessedIdentity); + CorrectionIdentityRow row = new CorrectionIdentityRow(user, assessedIdentity, entry.getValue(), userPropertyHandlers, getLocale()); identityToRows.put(entry.getKey(), row); for(Map.Entry<TestPlanNodeKey, ItemSessionState> itemEntry:testSessionState.getItemSessionStates().entrySet()) { @@ -239,6 +238,16 @@ public class CorrectionIdentityListController extends FormBasicController { } } + for(Identity assessedIdentity:model.getAssessedIdentities()) { + CorrectionIdentityRow row = identityToRows.remove(assessedIdentity); + if(row != null) { + rows.add(row); + } + } + if(!identityToRows.isEmpty()) { + rows.addAll(identityToRows.values()); + } + tableModel.setObjects(rows); tableEl.reset(reset, reset, true); } diff --git a/src/main/java/org/olat/ims/qti21/ui/assessment/CorrectionOverviewController.java b/src/main/java/org/olat/ims/qti21/ui/assessment/CorrectionOverviewController.java index 206a334d09253e645b7f5138ccf5d7891eec1b92..08295ae7a04134b7959b5ecc1edb4aae2e250e84 100644 --- a/src/main/java/org/olat/ims/qti21/ui/assessment/CorrectionOverviewController.java +++ b/src/main/java/org/olat/ims/qti21/ui/assessment/CorrectionOverviewController.java @@ -111,7 +111,7 @@ public class CorrectionOverviewController extends BasicController implements Too List<Identity> assessedIdentities = initializeAssessedIdentities(); model = new CorrectionOverviewModel(courseEntry, courseNode, testEntry, - resolvedAssessmentTest, manifestBuilder, assessedIdentities); + resolvedAssessmentTest, manifestBuilder, assessedIdentities, getTranslator()); segmentButtonsCmp = new ButtonGroupComponent("segments"); assessmentItemsLink = LinkFactory.createLink("correction.assessment.items", getTranslator(), this); diff --git a/src/main/java/org/olat/ims/qti21/ui/assessment/CorrectionOverviewModel.java b/src/main/java/org/olat/ims/qti21/ui/assessment/CorrectionOverviewModel.java index 17dedb9adb07dc61529e2f941f6b2905238b8479..1f183f489b52e4c86d889c79bfa28c62f5c9ad28 100644 --- a/src/main/java/org/olat/ims/qti21/ui/assessment/CorrectionOverviewModel.java +++ b/src/main/java/org/olat/ims/qti21/ui/assessment/CorrectionOverviewModel.java @@ -30,8 +30,10 @@ import java.util.concurrent.ConcurrentHashMap; import org.apache.logging.log4j.Logger; import org.olat.core.CoreSpringFactory; +import org.olat.core.gui.translator.Translator; import org.olat.core.id.Identity; import org.olat.core.logging.Tracing; +import org.olat.core.util.StringHelper; import org.olat.course.CourseFactory; import org.olat.course.assessment.AssessmentHelper; import org.olat.course.assessment.CourseAssessmentService; @@ -47,6 +49,7 @@ import org.olat.modules.assessment.model.AssessmentEntryStatus; import org.olat.repository.RepositoryEntry; import org.springframework.beans.factory.annotation.Autowired; +import edu.emory.mathcs.backport.java.util.Collections; import uk.ac.ed.ph.jqtiplus.node.item.AssessmentItem; import uk.ac.ed.ph.jqtiplus.node.item.interaction.DrawingInteraction; import uk.ac.ed.ph.jqtiplus.node.item.interaction.ExtendedTextInteraction; @@ -79,6 +82,7 @@ public class CorrectionOverviewModel { private final Set<Identity> identityWithErrors = new HashSet<>(); private final Map<String,Boolean> manualCorrections = new ConcurrentHashMap<>(); + private final Map<Identity,String> anomyzedNamed; private Map<Identity,AssessmentTestSession> lastSessions; private final Map<AssessmentTestSession,Identity> reversedLastSessions = new HashMap<>(); private final Map<Identity,Boolean> assessedIdentitiesDone = new HashMap<>(); @@ -90,7 +94,8 @@ public class CorrectionOverviewModel { public CorrectionOverviewModel(RepositoryEntry courseEntry, IQTESTCourseNode courseNode, RepositoryEntry testEntry, ResolvedAssessmentTest resolvedAssessmentTest, ManifestBuilder manifestBuilder, - Map<Identity,AssessmentTestSession> lastSessions, Map<Identity, TestSessionState> testSessionStates) { + Map<Identity,AssessmentTestSession> lastSessions, Map<Identity, TestSessionState> testSessionStates, + Translator translator) { CoreSpringFactory.autowireObject(this); this.courseEntry = courseEntry; this.courseNode = courseNode; @@ -100,15 +105,18 @@ public class CorrectionOverviewModel { this.lastSessions = lastSessions; this.testSessionStates = testSessionStates; assessedIdentities = new ArrayList<>(lastSessions.keySet()); + Collections.shuffle(assessedIdentities); for(Map.Entry<Identity, AssessmentTestSession> entry:lastSessions.entrySet()) { reversedLastSessions.put(entry.getValue(), entry.getKey()); } + + anomyzedNamed = anonymize(translator); } public CorrectionOverviewModel(RepositoryEntry courseEntry, IQTESTCourseNode courseNode, RepositoryEntry testEntry, ResolvedAssessmentTest resolvedAssessmentTest, ManifestBuilder manifestBuilder, - List<Identity> assessedIdentities) { + List<Identity> assessedIdentities, Translator translator) { CoreSpringFactory.autowireObject(this); this.courseEntry = courseEntry; this.courseNode = courseNode; @@ -116,8 +124,36 @@ public class CorrectionOverviewModel { this.manifestBuilder = manifestBuilder; this.resolvedAssessmentTest = resolvedAssessmentTest; this.assessedIdentities = new ArrayList<>(assessedIdentities); + Collections.shuffle(this.assessedIdentities); + lastSessions = loadLastSessions(); testSessionStates = getTestSessionStates(lastSessions); + + anomyzedNamed = anonymize(translator); + } + + protected String getAnonymizedName(Identity identity) { + String name = anomyzedNamed.get(identity); + if(!StringHelper.containsNonWhitespace(name)) { + name = "UNKOWN"; + } + return name; + } + + private Map<Identity,String> anonymize(Translator translator) { + int count = 0; + + Map<Identity,String> names = new HashMap<>(); + for(Identity assessedIdentity:assessedIdentities) { + if(lastSessions.containsKey(assessedIdentity)) { + String title = translator.translate("number.assessed.identity", new String[] { Integer.toString(++count)} ); + names.put(assessedIdentity, title); + } else { + String title = translator.translate("number.assessed.identity", new String[] { "ERR" } ); + names.put(assessedIdentity, title); + } + } + return Map.copyOf(names); } public String getSubIdent() { diff --git a/src/main/java/org/olat/modules/grading/ui/GradingAssignmentsListController.java b/src/main/java/org/olat/modules/grading/ui/GradingAssignmentsListController.java index d6acbd17a3554a49b1c7abb97140c69e9e0ad21b..2b6e15c41403f02c9700ebc3b67c29d2df390076 100644 --- a/src/main/java/org/olat/modules/grading/ui/GradingAssignmentsListController.java +++ b/src/main/java/org/olat/modules/grading/ui/GradingAssignmentsListController.java @@ -596,7 +596,7 @@ public class GradingAssignmentsListController extends FormBasicController implem Map<Identity, TestSessionState> testSessionStates = new HashMap<>(); testSessionStates.put(assessedIdentity, testSessionState); CorrectionOverviewModel model = new CorrectionOverviewModel(entry, courseNode, referenceEntry, - resolvedAssessmentTest, manifestBuilder, lastSessions, testSessionStates); + resolvedAssessmentTest, manifestBuilder, lastSessions, testSessionStates, getTranslator()); GradingTimeRecordRef record = gradingService.getCurrentTimeRecord(assignment, ureq.getRequestTimestamp()); correctionCtrl = new CorrectionIdentityAssessmentItemListController(ureq, getWindowControl(), stackPanel,