diff --git a/src/main/java/org/olat/admin/user/delete/BulkDeleteController.java b/src/main/java/org/olat/admin/user/delete/BulkDeleteController.java index 22f8838d81d86e035a7f87682202d1f32633c75d..f97fdc5e2d745684e3a3b7bd45248d4ded487c11 100644 --- a/src/main/java/org/olat/admin/user/delete/BulkDeleteController.java +++ b/src/main/java/org/olat/admin/user/delete/BulkDeleteController.java @@ -133,22 +133,24 @@ public class BulkDeleteController extends BasicController { * Send the mail with informations: who deletes, when, list of deleted users * list of not deleted users, reason for deletion */ - public void sendMail(UserRequest ureq) { - + public void sendMail() { String recipient = WebappHelper.getMailConfig("mailDeleteUser"); - if (recipient.equals("disabled")) { return; } - StringBuffer loginsFound = new StringBuffer(); - for(String login : lstLoginsFound) loginsFound.append(login + "\n"); - StringBuffer loginsNotfound = new StringBuffer(); - for(String login : lstLoginsNotfound) loginsNotfound.append(login + "\n"); - DateFormat df = DateFormat.getDateInstance(DateFormat.FULL, ureq.getLocale()); + StringBuilder loginsFound = new StringBuilder(); + for(String login : lstLoginsFound) { + loginsFound.append(login + "\n"); + } + StringBuilder loginsNotfound = new StringBuilder(); + for(String login : lstLoginsNotfound) { + loginsNotfound.append(login + "\n"); + } + DateFormat df = DateFormat.getDateInstance(DateFormat.FULL, getLocale()); String[] bodyArgs = new String[] { - ureq.getIdentity().getName(), + getIdentity().getName(), loginsFound.toString(), loginsNotfound.toString(), reason, @@ -157,7 +159,7 @@ public class BulkDeleteController extends BasicController { ContactList cl = new ContactList(recipient); cl.add(recipient); - cl.add(ureq.getIdentity()); + cl.add(getIdentity()); try { MailBundle bundle = new MailBundle(); diff --git a/src/main/java/org/olat/admin/user/delete/DirectDeleteController.java b/src/main/java/org/olat/admin/user/delete/DirectDeleteController.java index 22446db130f611a18c50f1c9396f5803cd1f0968..5c502e618aa21a7b90fc4c4870f644a2a493321e 100644 --- a/src/main/java/org/olat/admin/user/delete/DirectDeleteController.java +++ b/src/main/java/org/olat/admin/user/delete/DirectDeleteController.java @@ -122,8 +122,9 @@ public class DirectDeleteController extends BasicController { } else if (sourceController == deleteConfirmController) { if (DialogBoxUIFactory.isOkEvent(event)) { deleteIdentities(toDelete); - if (bdc != null) - bdc.sendMail(ureq); + if (bdc != null) { + bdc.sendMail(); + } initializeUserSearchController(ureq); initializeUserListForm(ureq); diff --git a/src/main/java/org/olat/course/nodes/iq/IQConfigurationController.java b/src/main/java/org/olat/course/nodes/iq/IQConfigurationController.java index dbb3d2aa3b00600059152348589abb26b678d0a2..fa3181cf2c6ec4b476febe2cbd21d8e47fd98d8d 100644 --- a/src/main/java/org/olat/course/nodes/iq/IQConfigurationController.java +++ b/src/main/java/org/olat/course/nodes/iq/IQConfigurationController.java @@ -218,7 +218,13 @@ public class IQConfigurationController extends BasicController { if(re == null) { myContent.remove("iqeditform"); } else if(ImsQTI21Resource.TYPE_NAME.equals(re.getOlatResource().getResourceableTypeName())) { - boolean needManualCorrection = needManualCorrectionQTI21(re); + boolean needManualCorrection = false; + try {// in case of an unreadable test + needManualCorrection = needManualCorrectionQTI21(re); + } catch (Exception e) { + logError("Test cannot be read: " + re, e); + showError("error.resource.corrupted"); + } if(replacedTest) {// set some default settings in case the user don't save the next panel moduleConfiguration.setStringValue(IQEditController.CONFIG_CORRECTION_MODE, needManualCorrection ? "manual" : "auto"); fireEvent(ureq, NodeEditController.NODECONFIG_CHANGED_EVENT); diff --git a/src/main/java/org/olat/course/nodes/iq/QTI21AssessmentRunController.java b/src/main/java/org/olat/course/nodes/iq/QTI21AssessmentRunController.java index 9e7538794fc1c06e23c0dc52c059b590859c6d14..b00c921e47400324e8c13b2638811cda2d21728d 100644 --- a/src/main/java/org/olat/course/nodes/iq/QTI21AssessmentRunController.java +++ b/src/main/java/org/olat/course/nodes/iq/QTI21AssessmentRunController.java @@ -571,7 +571,10 @@ public class QTI21AssessmentRunController extends BasicController implements Gen displayCtrl = new AssessmentTestDisplayController(ureq, bwControl, this, testEntry, courseRe, courseNode.getIdent(), deliveryOptions, overrideOptions, true, false, false); listenTo(displayCtrl); - if(displayCtrl.isEnded()) { + if(displayCtrl.getAssessmentTest() == null) { + logError("Test cannot be read: " + testEntry + " in course: " + courseRe + " element: " + courseNode.getIdent() , null); + showError("error.resource.corrupted"); + } else if(displayCtrl.isEnded()) { if(!displayCtrl.isResultsVisible()) { doExitAssessment(ureq, null, true); initAssessment(ureq); diff --git a/src/main/java/org/olat/course/nodes/pf/manager/PFManager.java b/src/main/java/org/olat/course/nodes/pf/manager/PFManager.java index b7555a2520cd3c3dc3005a857e218daf06c4fded..dda27b3f1c230a8398a74e8403ab5674a19b33eb 100644 --- a/src/main/java/org/olat/course/nodes/pf/manager/PFManager.java +++ b/src/main/java/org/olat/course/nodes/pf/manager/PFManager.java @@ -408,7 +408,9 @@ public class PFManager { SubscriptionContext nodefolderSubContext = CourseModule.createSubscriptionContext(courseEnv, pfNode); RepositoryEntry re = courseEnv.getCourseGroupManager().getCourseEntry(); List<Identity> participants = repositoryEntryRelationDao.getMembers(re, - RepositoryEntryRelationType.both, GroupRoles.participant.name()); + RepositoryEntryRelationType.both, GroupRoles.participant.name()); + participants = new ArrayList<>(new HashSet<>(participants)); + String path = courseEnv.getCourseBaseContainer().getRelPath() + "/" + FILENAME_PARTICIPANTFOLDER; VFSContainer courseElementBaseContainer = new OlatRootFolderImpl(path, null); VirtualContainer namedCourseFolder = new VirtualContainer(translator.translate("participant.folder")); diff --git a/src/main/java/org/olat/ims/qti21/ui/AssessmentTestDisplayController.java b/src/main/java/org/olat/ims/qti21/ui/AssessmentTestDisplayController.java index e692d83dd0ad6f59c71ba0abf4735c833f102385..2252347e63ea62093d2e996768c730ff90d132e7 100644 --- a/src/main/java/org/olat/ims/qti21/ui/AssessmentTestDisplayController.java +++ b/src/main/java/org/olat/ims/qti21/ui/AssessmentTestDisplayController.java @@ -396,6 +396,13 @@ public class AssessmentTestDisplayController extends BasicController implements CoordinatorManager.getInstance().getCoordinator().getEventBus().deregisterFor(this, sessionOres); } + /** + * @return The assessment test if the test cab be read or null. + */ + public AssessmentTest getAssessmentTest() { + return resolvedAssessmentTest == null ? null : resolvedAssessmentTest.getRootNodeLookup().extractIfSuccessful(); + } + /** * @return true if the termination time is set. */ diff --git a/src/main/java/org/olat/modules/qpool/ui/QuestionListController.java b/src/main/java/org/olat/modules/qpool/ui/QuestionListController.java index 7d24952f4142aca4a9f71583ca1f7cde0a212cfc..38686720b53e63c39122077b972d0885278eabbf 100644 --- a/src/main/java/org/olat/modules/qpool/ui/QuestionListController.java +++ b/src/main/java/org/olat/modules/qpool/ui/QuestionListController.java @@ -532,8 +532,12 @@ public class QuestionListController extends AbstractItemListController implement ItemRow nextRow = getModel().getNextObject(row); if(nextRow != null) { QuestionItem nextItem = qpoolService.loadItemById(nextRow.getKey()); - stackPanel.popUpToRootController(ureq); - doSelect(ureq, nextItem, nextRow.isEditable()); + if(nextItem != null) { + stackPanel.popUpToRootController(ureq); + doSelect(ureq, nextItem, nextRow.isEditable()); + } else { + getItemsTable().reset(true, true, true); + } } } @@ -542,8 +546,12 @@ public class QuestionListController extends AbstractItemListController implement ItemRow previousRow = getModel().getPreviousObject(row); if(previousRow != null) { QuestionItem previousItem = qpoolService.loadItemById(previousRow.getKey()); - stackPanel.popUpToRootController(ureq); - doSelect(ureq, previousItem, previousRow.isEditable()); + if(previousItem != null) { + stackPanel.popUpToRootController(ureq); + doSelect(ureq, previousItem, previousRow.isEditable()); + } else { + getItemsTable().reset(true, true, true); + } } }