diff --git a/src/main/java/org/olat/course/assessment/ui/tool/IdentityListCourseNodeController.java b/src/main/java/org/olat/course/assessment/ui/tool/IdentityListCourseNodeController.java index 0dae436ec6a5048921be42bd2a82de819242ff8e..77567666cd25a97af95fd8b59de15152ba8847ce 100644 --- a/src/main/java/org/olat/course/assessment/ui/tool/IdentityListCourseNodeController.java +++ b/src/main/java/org/olat/course/assessment/ui/tool/IdentityListCourseNodeController.java @@ -32,6 +32,7 @@ import org.olat.basesecurity.BaseSecurityModule; import org.olat.basesecurity.Group; import org.olat.basesecurity.IdentityRef; import org.olat.basesecurity.model.IdentityRefImpl; +import org.olat.core.commons.persistence.DB; import org.olat.core.commons.persistence.SortKey; import org.olat.core.gui.UserRequest; import org.olat.core.gui.components.Component; @@ -156,6 +157,8 @@ public class IdentityListCourseNodeController extends FormBasicController private ConfirmUserVisibilityController changeUserVisibilityCtrl; private ContactFormController contactCtrl; + @Autowired + private DB dbInstance; @Autowired private UserManager userManager; @Autowired @@ -931,6 +934,7 @@ public class IdentityListCourseNodeController extends FormBasicController scoreEval.getCurrentRunStatus(), scoreEval.getAssessmentID()); courseAssessmentService.updateScoreEvaluation(courseNode, doneEval, assessedUserCourseEnv, getIdentity(), false, Role.coach); + dbInstance.commitAndCloseSession(); } loadModel(ureq); } @@ -952,6 +956,7 @@ public class IdentityListCourseNodeController extends FormBasicController for(AssessedIdentityElementRow row:rows) { Identity assessedIdentity = securityManager.loadIdentityByKey(row.getIdentityKey()); doSetDone(assessedIdentity, courseNode, course); + dbInstance.commitAndCloseSession(); } loadModel(ureq); } diff --git a/src/main/java/org/olat/ims/qti21/manager/AssessmentTestSessionDAO.java b/src/main/java/org/olat/ims/qti21/manager/AssessmentTestSessionDAO.java index 4e1a9654dc226b5923136045a14c5176037c77dd..66f461ab479e73a09f6442e7dfc746bf29433cdd 100644 --- a/src/main/java/org/olat/ims/qti21/manager/AssessmentTestSessionDAO.java +++ b/src/main/java/org/olat/ims/qti21/manager/AssessmentTestSessionDAO.java @@ -698,7 +698,7 @@ public class AssessmentTestSessionDAO { sb.append(" and membership.role='").append(GroupRoles.participant.name()).append("'"); } sb.append(" )"); - } else if(searchParams.getLimitToIdentities() != null) { + } else if(searchParams.getLimitToIdentities() != null && !searchParams.getLimitToIdentities().isEmpty()) { sb.append(" testSession.identity.key in (select membership.identity.key from bgroupmember as membership, repoentrytogroup as rel") .append(" where rel.entry.key=:repoEntryKey and rel.group.key=membership.group.key and membership.identity.key in (:limitIdentityKeys)") .append(" and membership.role='").append(GroupRoles.participant.name()).append("'") diff --git a/src/main/java/org/olat/ims/qti21/manager/archive/QTI21ArchiveFormat.java b/src/main/java/org/olat/ims/qti21/manager/archive/QTI21ArchiveFormat.java index e0e13e6f88a77c212fea4a1c46b52e84a70e3090..25fcb8f48f122fb36d3ede73b2dc468bb6b953eb 100644 --- a/src/main/java/org/olat/ims/qti21/manager/archive/QTI21ArchiveFormat.java +++ b/src/main/java/org/olat/ims/qti21/manager/archive/QTI21ArchiveFormat.java @@ -476,11 +476,8 @@ public class QTI21ArchiveFormat { AssessmentItemSession itemSession = response.getAssessmentItemSession(); sessionResponses.addResponse(itemSession, response); } - writeDataRow(i + 1, sessionResponses, exportSheet, workbook); - - if(i % 25 == 0) { - DBFactory.getInstance().commitAndCloseSession(); - } + writeDataRow(i + 1, sessionResponses, exportSheet, workbook); + DBFactory.getInstance().commitAndCloseSession(); } } diff --git a/src/main/java/org/olat/ims/qti21/model/xml/interactions/HotspotAssessmentItemBuilder.java b/src/main/java/org/olat/ims/qti21/model/xml/interactions/HotspotAssessmentItemBuilder.java index 9d8a2452637c25e1f7d1cd588bd2e7be4a17a468..2deb8666a308524f62561ba1de5e2d9b74c3d8ee 100644 --- a/src/main/java/org/olat/ims/qti21/model/xml/interactions/HotspotAssessmentItemBuilder.java +++ b/src/main/java/org/olat/ims/qti21/model/xml/interactions/HotspotAssessmentItemBuilder.java @@ -282,6 +282,12 @@ public class HotspotAssessmentItemBuilder extends AssessmentItemBuilder implemen return correctAnswers.contains(choice.getIdentifier()); } + public void clearCorrectAnswers() { + if(correctAnswers != null) { + correctAnswers.clear(); + } + } + public void setCorrect(HotspotChoice choice, boolean correct) { if(correctAnswers == null) { correctAnswers = new ArrayList<>(); @@ -425,6 +431,7 @@ public class HotspotAssessmentItemBuilder extends AssessmentItemBuilder implemen //add question getHtmlHelper().appendHtml(assessmentItem.getItemBody(), question); + //add interaction if(correctAnswers.size() == 1 && cardinality == Cardinality.SINGLE) { hotspotInteraction.setMaxChoices(1); diff --git a/src/main/java/org/olat/ims/qti21/ui/QTI21ResetDataController.java b/src/main/java/org/olat/ims/qti21/ui/QTI21ResetDataController.java index 7a76b362b0aa66a1ccd4e66f35f7e7b95ac6c4e5..44b4f62e988c763cb9031ee5332559e2ada3351e 100644 --- a/src/main/java/org/olat/ims/qti21/ui/QTI21ResetDataController.java +++ b/src/main/java/org/olat/ims/qti21/ui/QTI21ResetDataController.java @@ -31,6 +31,7 @@ import java.util.zip.ZipOutputStream; import org.olat.basesecurity.GroupRoles; import org.olat.core.commons.modules.bc.FolderConfig; +import org.olat.core.commons.persistence.DB; import org.olat.core.gui.UserRequest; import org.olat.core.gui.components.form.flexible.FormItemContainer; import org.olat.core.gui.components.form.flexible.elements.MultipleSelectionElement; @@ -87,6 +88,8 @@ public class QTI21ResetDataController extends FormBasicController { private CourseEnvironment courseEnv; private RepositoryEntry assessedEntry; + @Autowired + private DB dbInstance; @Autowired private QTI21Service qtiService; @Autowired @@ -213,6 +216,7 @@ public class QTI21ResetDataController extends FormBasicController { Role.coach); courseAssessmentService.updateCurrentCompletion(courseNode, uce, null, AssessmentRunStatus.notStarted, Role.coach); + dbInstance.commitAndCloseSession(); } } else if(assessedEntry != null) { archiveData(assessedEntry); diff --git a/src/main/java/org/olat/ims/qti21/ui/QTI21RetrieveTestsController.java b/src/main/java/org/olat/ims/qti21/ui/QTI21RetrieveTestsController.java index ffd74086c7e9d45b8c8cc0928bd9464c4800252b..9f8ff3853d1ed1c8e7fd7efb694a3ac7514fc63c 100644 --- a/src/main/java/org/olat/ims/qti21/ui/QTI21RetrieveTestsController.java +++ b/src/main/java/org/olat/ims/qti21/ui/QTI21RetrieveTestsController.java @@ -26,6 +26,7 @@ import java.util.List; import java.util.Set; import org.olat.basesecurity.GroupRoles; +import org.olat.core.commons.persistence.DB; import org.olat.core.gui.UserRequest; import org.olat.core.gui.components.form.flexible.FormItemContainer; import org.olat.core.gui.components.form.flexible.impl.FormBasicController; @@ -73,6 +74,8 @@ public class QTI21RetrieveTestsController extends FormBasicController { private List<Identity> identities; private List<AssessmentTestSession> sessions; + @Autowired + private DB dbInstance; @Autowired private UserManager userManager; @Autowired @@ -149,7 +152,7 @@ public class QTI21RetrieveTestsController extends FormBasicController { } String msg; - if(sessionsToRetrieve.size() == 0) { + if(sessionsToRetrieve.isEmpty()) { msg = translate("retrievetest.nothing.todo"); } else if(sessionsToRetrieve.size() == 1) { msg = translate("retrievetest.confirm.text", new String[]{ fullnames.toString() }); @@ -193,6 +196,7 @@ public class QTI21RetrieveTestsController extends FormBasicController { .createAndInitUserCourseEnvironment(session.getIdentity(), courseEnv); courseNode.pullAssessmentTestSession(session, assessedUserCourseEnv, getIdentity(), Role.coach); } + dbInstance.commitAndCloseSession(); } private DigitalSignatureOptions getSignatureOptions(AssessmentTestSession session) { diff --git a/src/main/java/org/olat/ims/qti21/ui/editor/interactions/HotspotEditorController.java b/src/main/java/org/olat/ims/qti21/ui/editor/interactions/HotspotEditorController.java index c58fb62716f9804382547238d89b629ed8bb1e06..4b29a9350d117c41e5f7177d814afa5ee4995d04 100644 --- a/src/main/java/org/olat/ims/qti21/ui/editor/interactions/HotspotEditorController.java +++ b/src/main/java/org/olat/ims/qti21/ui/editor/interactions/HotspotEditorController.java @@ -375,9 +375,7 @@ public class HotspotEditorController extends FormBasicController { updateHotspots(ureq); updateHotspotsPosition(backgroundSize); } else if(correctHotspotsEl == source) { - MultipleSelectionElement correctEl = (MultipleSelectionElement)source; - Collection<String> correctResponseIds = correctEl.getSelectedKeys(); - doCorrectAnswers(correctResponseIds); + doCorrectAnswers(correctHotspotsEl.getSelectedKeys()); flc.setDirty(true); } else if(layoutEl == source) { updateLayoutCssClass(); @@ -439,6 +437,7 @@ public class HotspotEditorController extends FormBasicController { private void doCorrectAnswers(Collection<String> correctResponseIds) { List<HotspotChoice> choices = itemBuilder.getHotspotChoices(); + itemBuilder.clearCorrectAnswers(); for(int i=0; i<choices.size(); i++) { HotspotChoice choice = choices.get(i); boolean correct = correctResponseIds.contains(choice.getIdentifier().toString()); @@ -514,6 +513,8 @@ public class HotspotEditorController extends FormBasicController { objectImg = initialBackgroundImage; } + doCorrectAnswers(correctHotspotsEl.getSelectedKeys()); + if(cardinalityEl.isOneSelected()) { String selectedCardinality = cardinalityEl.getSelectedKey(); itemBuilder.setCardinality(Cardinality.valueOf(selectedCardinality));