diff --git a/src/main/java/org/olat/course/assessment/AssessmentManager.java b/src/main/java/org/olat/course/assessment/AssessmentManager.java index c005b8af263d5cb0e71bb064b8dc7c93d6bbb0a5..de0fd2225b8738b6e62a481caf11d6416fd35986 100644 --- a/src/main/java/org/olat/course/assessment/AssessmentManager.java +++ b/src/main/java/org/olat/course/assessment/AssessmentManager.java @@ -37,6 +37,7 @@ import org.olat.course.run.scoring.ScoreEvaluation; import org.olat.course.run.userview.UserCourseEnvironment; import org.olat.group.BusinessGroup; import org.olat.modules.assessment.AssessmentEntry; +import org.olat.modules.assessment.Overridable; import org.olat.modules.assessment.Role; import org.olat.modules.assessment.model.AssessmentEntryStatus; import org.olat.modules.assessment.model.AssessmentRunStatus; @@ -273,6 +274,13 @@ public interface AssessmentManager { ScoreEvaluation scoreEvaluation, UserCourseEnvironment userCourseEnvironment, boolean incrementUserAttempts, Role by); + public Overridable<Boolean> getRootPassed(UserCourseEnvironment userCourseEnvironment); + + public Overridable<Boolean> overrideRootPassed(Identity coach, UserCourseEnvironment userCourseEnvironment, + Boolean passed); + + public Overridable<Boolean> resetRootPassed(Identity coach, UserCourseEnvironment userCourseEnvironment); + /** * Provides an OLATResourceable for locking (of score/passed etc.) purposes (if doInSync is called on score/passed data) * Or provides a lock token for assessment data of the assessedIdentity. diff --git a/src/main/java/org/olat/course/assessment/CourseAssessmentService.java b/src/main/java/org/olat/course/assessment/CourseAssessmentService.java index 8bbf0002c9d3ce3ed6ab776714e0c614a828b073..b005018f1f7d2af6b2ed1309347ee936c7bf7719 100644 --- a/src/main/java/org/olat/course/assessment/CourseAssessmentService.java +++ b/src/main/java/org/olat/course/assessment/CourseAssessmentService.java @@ -40,6 +40,7 @@ import org.olat.course.run.scoring.ScoreEvaluation; import org.olat.course.run.userview.UserCourseEnvironment; import org.olat.group.BusinessGroup; import org.olat.modules.assessment.AssessmentEntry; +import org.olat.modules.assessment.Overridable; import org.olat.modules.assessment.Role; import org.olat.modules.assessment.model.AssessmentEntryStatus; import org.olat.modules.assessment.model.AssessmentRunStatus; @@ -258,6 +259,13 @@ public interface CourseAssessmentService { public void saveScoreEvaluation(CourseNode courseNode, Identity identity, ScoreEvaluation scoreEvaluation, UserCourseEnvironment userCourseEnvironment, boolean incrementUserAttempts, Role by); + public Overridable<Boolean> getRootPassed(UserCourseEnvironment userCourseEnvironment); + + public Overridable<Boolean> overrideRootPassed(Identity coach, UserCourseEnvironment userCourseEnvironment, + Boolean passed); + + public Overridable<Boolean> resetRootPassed(Identity coach, UserCourseEnvironment userCourseEnvironment); + /** * Returns a controller to edit the node specific details. Check * AssessmentConfig.hasEditableDetails() before invoking this method. diff --git a/src/main/java/org/olat/course/assessment/manager/CourseAssessmentManagerImpl.java b/src/main/java/org/olat/course/assessment/manager/CourseAssessmentManagerImpl.java index b1b8659ac4988701d71a33d34d3f45e71379f7f1..dd39b42351a4658a58a3c8f8e0d5f26d6a466893 100644 --- a/src/main/java/org/olat/course/assessment/manager/CourseAssessmentManagerImpl.java +++ b/src/main/java/org/olat/course/assessment/manager/CourseAssessmentManagerImpl.java @@ -70,6 +70,7 @@ import org.olat.course.run.userview.UserCourseEnvironment; import org.olat.group.BusinessGroup; import org.olat.modules.assessment.AssessmentEntry; import org.olat.modules.assessment.AssessmentService; +import org.olat.modules.assessment.Overridable; import org.olat.modules.assessment.Role; import org.olat.modules.assessment.model.AssessmentEntryStatus; import org.olat.modules.assessment.model.AssessmentRunStatus; @@ -536,14 +537,9 @@ public class CourseAssessmentManagerImpl implements AssessmentManager { DBFactory.getInstance().commit(); // node log - UserNodeAuditManager am = courseEnv.getAuditManager(); - am.appendToUserNodeLog(courseNode, identity, assessedIdentity, "score set to: " + String.valueOf(scoreEvaluation.getScore()), by); - if(scoreEvaluation.getPassed()!=null) { - am.appendToUserNodeLog(courseNode, identity, assessedIdentity, "passed set to: " + scoreEvaluation.getPassed().toString(), by); - } else { - am.appendToUserNodeLog(courseNode, identity, assessedIdentity, "passed set to \"undefined\"", by); - } + logAuditPassed(courseNode, identity, by, userCourseEnv, scoreEvaluation.getPassed()); if(scoreEvaluation.getAssessmentID()!=null) { + UserNodeAuditManager am = courseEnv.getAuditManager(); am.appendToUserNodeLog(courseNode, assessedIdentity, assessedIdentity, "assessmentId set to: " + scoreEvaluation.getAssessmentID().toString(), by); } @@ -552,25 +548,13 @@ public class CourseAssessmentManagerImpl implements AssessmentManager { CoordinatorManager.getInstance().getCoordinator().getEventBus().fireEventToListenersOf(ace, course); // user activity logging + logActivityPassed(assessedIdentity, scoreEvaluation.getPassed()); if (scoreEvaluation.getScore()!=null) { ThreadLocalUserActivityLogger.log(AssessmentLoggingAction.ASSESSMENT_SCORE_UPDATED, getClass(), LoggingResourceable.wrap(assessedIdentity), LoggingResourceable.wrapNonOlatResource(StringResourceableType.qtiScore, "", String.valueOf(scoreEvaluation.getScore()))); } - - if (scoreEvaluation.getPassed()!=null) { - ThreadLocalUserActivityLogger.log(AssessmentLoggingAction.ASSESSMENT_PASSED_UPDATED, - getClass(), - LoggingResourceable.wrap(assessedIdentity), - LoggingResourceable.wrapNonOlatResource(StringResourceableType.qtiPassed, "", String.valueOf(scoreEvaluation.getPassed()))); - } else { - ThreadLocalUserActivityLogger.log(AssessmentLoggingAction.ASSESSMENT_PASSED_UPDATED, - getClass(), - LoggingResourceable.wrap(assessedIdentity), - LoggingResourceable.wrapNonOlatResource(StringResourceableType.qtiPassed, "", "undefined")); - } - if (incrementUserAttempts && attempts!=null) { if(identity != null) { ThreadLocalUserActivityLogger.log(AssessmentLoggingAction.ASSESSMENT_ATTEMPTS_UPDATED, @@ -584,23 +568,149 @@ public class CourseAssessmentManagerImpl implements AssessmentManager { } } + updateUserEfficiencyStatement(userCourseEnv, courseNode); + generateCertificate(userCourseEnv, course); + } + + @Override + public Overridable<Boolean> getRootPassed(UserCourseEnvironment userCourseEnvironment) { + Identity assessedIdentity = userCourseEnvironment.getIdentityEnvironment().getIdentity(); + CourseEnvironment courseEnv = userCourseEnvironment.getCourseEnvironment(); + CourseNode rootNode = courseEnv.getRunStructure().getRootNode(); + String subIdent = rootNode.getIdent(); + RepositoryEntry referenceEntry = rootNode.getReferencedRepositoryEntry(); + AssessmentEntry assessmentEntry = getOrCreate(assessedIdentity, subIdent, Boolean.TRUE, referenceEntry); + return assessmentEntry.getPassedOverridable(); + } + + @Override + public Overridable<Boolean> overrideRootPassed(Identity coach, UserCourseEnvironment userCourseEnvironment, Boolean passed) { + Identity assessedIdentity = userCourseEnvironment.getIdentityEnvironment().getIdentity(); + + ICourse course = CourseFactory.loadCourse(cgm.getCourseEntry()); + CourseEnvironment courseEnv = userCourseEnvironment.getCourseEnvironment(); + + CourseNode rootNode = courseEnv.getRunStructure().getRootNode(); + String subIdent = rootNode.getIdent(); + RepositoryEntry referenceEntry = rootNode.getReferencedRepositoryEntry(); + AssessmentEntry assessmentEntry = getOrCreate(assessedIdentity, subIdent, Boolean.TRUE, referenceEntry); + + Date now = new Date(); + assessmentEntry.setLastCoachModified(now); + assessmentEntry.getPassedOverridable().override(passed, coach, now); + assessmentEntry = assessmentService.updateAssessmentEntry(assessmentEntry); + DBFactory.getInstance().commit(); + + nodeAccessService.onPassedUpdated(rootNode, userCourseEnvironment, passed, Boolean.TRUE, Role.coach); + DBFactory.getInstance().commit(); + + ScoreAccounting scoreAccounting = userCourseEnvironment.getScoreAccounting(); + scoreAccounting.evaluateAll(true); + DBFactory.getInstance().commit(); + + logAuditPassed(rootNode, coach, Role.coach, userCourseEnvironment, passed); + logActivityPassed(assessedIdentity, passed); + + AssessmentChangedEvent ace = new AssessmentChangedEvent(AssessmentChangedEvent.TYPE_SCORE_EVAL_CHANGED, assessedIdentity); + CoordinatorManager.getInstance().getCoordinator().getEventBus().fireEventToListenersOf(ace, course); + + updateUserEfficiencyStatement(userCourseEnvironment, rootNode); + generateCertificate(userCourseEnvironment, course); + + return assessmentEntry.getPassedOverridable(); + } + + @Override + public Overridable<Boolean> resetRootPassed(Identity coach, UserCourseEnvironment userCourseEnvironment) { + Identity assessedIdentity = userCourseEnvironment.getIdentityEnvironment().getIdentity(); + + ICourse course = CourseFactory.loadCourse(cgm.getCourseEntry()); + CourseEnvironment courseEnv = userCourseEnvironment.getCourseEnvironment(); + + CourseNode rootNode = courseEnv.getRunStructure().getRootNode(); + String subIdent = rootNode.getIdent(); + RepositoryEntry referenceEntry = rootNode.getReferencedRepositoryEntry(); + AssessmentEntry assessmentEntry = getOrCreate(assessedIdentity, subIdent, Boolean.TRUE, referenceEntry); + + Date now = new Date(); + assessmentEntry.setLastCoachModified(now); + assessmentEntry.getPassedOverridable().reset(); + assessmentEntry = assessmentService.updateAssessmentEntry(assessmentEntry); + DBFactory.getInstance().commit(); + + Boolean passed = assessmentEntry.getPassed(); + nodeAccessService.onPassedUpdated(rootNode, userCourseEnvironment, passed, Boolean.TRUE, Role.coach); + DBFactory.getInstance().commit(); + + ScoreAccounting scoreAccounting = userCourseEnvironment.getScoreAccounting(); + scoreAccounting.evaluateAll(true); + DBFactory.getInstance().commit(); + + logAuditPassed(rootNode, coach, Role.coach, userCourseEnvironment, passed); + logActivityPassed(assessedIdentity, passed); + + AssessmentChangedEvent ace = new AssessmentChangedEvent(AssessmentChangedEvent.TYPE_SCORE_EVAL_CHANGED, assessedIdentity); + CoordinatorManager.getInstance().getCoordinator().getEventBus().fireEventToListenersOf(ace, course); + + updateUserEfficiencyStatement(userCourseEnvironment, rootNode); + generateCertificate(userCourseEnvironment, course); + + return assessmentEntry.getPassedOverridable(); + } + + private void logAuditPassed(CourseNode courseNode, Identity identity, Role by, + UserCourseEnvironment userCourseEnvironment, Boolean passed) { + UserNodeAuditManager am = userCourseEnvironment.getCourseEnvironment().getAuditManager(); + Identity assessedIdentity = userCourseEnvironment.getIdentityEnvironment().getIdentity(); + if(passed != null) { + am.appendToUserNodeLog(courseNode, identity, assessedIdentity, "passed set to: " + passed.toString(), by); + } else { + am.appendToUserNodeLog(courseNode, identity, assessedIdentity, "passed set to \"undefined\"", by); + } + } + + private void logActivityPassed(Identity assessedIdentity, Boolean passed) { + if (passed != null) { + ThreadLocalUserActivityLogger.log(AssessmentLoggingAction.ASSESSMENT_PASSED_UPDATED, + getClass(), + LoggingResourceable.wrap(assessedIdentity), + LoggingResourceable.wrapNonOlatResource(StringResourceableType.qtiPassed, "", String.valueOf(passed))); + } else { + ThreadLocalUserActivityLogger.log(AssessmentLoggingAction.ASSESSMENT_PASSED_UPDATED, + getClass(), + LoggingResourceable.wrap(assessedIdentity), + LoggingResourceable.wrapNonOlatResource(StringResourceableType.qtiPassed, "", "undefined")); + } + } + + private void updateUserEfficiencyStatement(UserCourseEnvironment userCourseEnvironment, CourseNode courseNode) { + CourseEnvironment courseEnv = userCourseEnvironment.getCourseEnvironment(); // write only when enabled for this course if (courseEnv.getCourseConfig().isEfficencyStatementEnabled()) { + Identity assessedIdentity = userCourseEnvironment.getIdentityEnvironment().getIdentity(); + ScoreAccounting scoreAccounting = userCourseEnvironment.getScoreAccounting(); + CourseNode rootNode = userCourseEnvironment.getCourseEnvironment().getRunStructure().getRootNode(); + List<AssessmentNodeData> data = new ArrayList<>(50); AssessmentNodesLastModified lastModifications = new AssessmentNodesLastModified(); - AssessmentHelper.getAssessmentNodeDataList(0, courseEnv.getRunStructure().getRootNode(), - scoreAccounting, userCourseEnv, true, true, true, data, lastModifications); + + AssessmentHelper.getAssessmentNodeDataList(0, rootNode, scoreAccounting, userCourseEnvironment, true, true, + true, data, lastModifications); efficiencyStatementManager.updateUserEfficiencyStatement(assessedIdentity, courseEnv, data, lastModifications, cgm.getCourseEntry()); } + } - if(course.getCourseConfig().isAutomaticCertificationEnabled()) { - CourseNode rootNode = courseEnv.getRunStructure().getRootNode(); + private void generateCertificate(UserCourseEnvironment userCourseEnvironment, ICourse course) { + if (course.getCourseConfig().isAutomaticCertificationEnabled()) { + Identity assessedIdentity = userCourseEnvironment.getIdentityEnvironment().getIdentity(); + ScoreAccounting scoreAccounting = userCourseEnvironment.getScoreAccounting(); + CourseNode rootNode = userCourseEnvironment.getCourseEnvironment().getRunStructure().getRootNode(); ScoreEvaluation rootEval = scoreAccounting.evalCourseNode(rootNode); - if(rootEval != null && rootEval.getPassed() != null && rootEval.getPassed().booleanValue() + if (rootEval != null && rootEval.getPassed() != null && rootEval.getPassed().booleanValue() && certificatesManager.isCertificationAllowed(assessedIdentity, cgm.getCourseEntry())) { CertificateTemplate template = null; Long templateId = course.getCourseConfig().getCertificateTemplate(); - if(templateId != null) { + if (templateId != null) { template = certificatesManager.getTemplateById(templateId); } CertificateInfos certificateInfos = new CertificateInfos(assessedIdentity, rootEval.getScore(), rootEval.getPassed()); @@ -735,4 +845,5 @@ public class CourseAssessmentManagerImpl implements AssessmentManager { private Boolean isEntryRoot(ICourse course, CourseNode courseNode) { return course.getCourseEnvironment().getRunStructure().getRootNode().getIdent().equals(courseNode.getIdent()); } + } diff --git a/src/main/java/org/olat/course/assessment/manager/CourseAssessmentServiceImpl.java b/src/main/java/org/olat/course/assessment/manager/CourseAssessmentServiceImpl.java index 33f29afec20f5b3b0af37532c28f33407439cd80..3f0b56b245b6ca972fa9439ac25dbf652a411711 100644 --- a/src/main/java/org/olat/course/assessment/manager/CourseAssessmentServiceImpl.java +++ b/src/main/java/org/olat/course/assessment/manager/CourseAssessmentServiceImpl.java @@ -62,6 +62,7 @@ import org.olat.course.run.userview.UserCourseEnvironmentImpl; import org.olat.group.BusinessGroup; import org.olat.modules.assessment.AssessmentEntry; import org.olat.modules.assessment.AssessmentService; +import org.olat.modules.assessment.Overridable; import org.olat.modules.assessment.Role; import org.olat.modules.assessment.model.AssessmentEntryStatus; import org.olat.modules.assessment.model.AssessmentRunStatus; @@ -324,6 +325,30 @@ public class CourseAssessmentServiceImpl implements CourseAssessmentService, Nod am.saveScoreEvaluation(courseNode, identity, assessedIdentity, scoreEvaluation, userCourseEnvironment, incrementUserAttempts, by); } + + @Override + public Overridable<Boolean> getRootPassed(UserCourseEnvironment userCourseEnvironment) { + if (!userCourseEnvironment.isParticipant()) return Overridable.empty(); + + AssessmentManager am = userCourseEnvironment.getCourseEnvironment().getAssessmentManager(); + return am.getRootPassed(userCourseEnvironment); + } + + @Override + public Overridable<Boolean> overrideRootPassed(Identity coach, UserCourseEnvironment userCourseEnvironment, Boolean passed) { + if (!userCourseEnvironment.isParticipant()) return Overridable.empty(); + + AssessmentManager am = userCourseEnvironment.getCourseEnvironment().getAssessmentManager(); + return am.overrideRootPassed(coach, userCourseEnvironment, passed); + } + + @Override + public Overridable<Boolean> resetRootPassed(Identity coach, UserCourseEnvironment userCourseEnvironment) { + if (!userCourseEnvironment.isParticipant()) return Overridable.empty(); + + AssessmentManager am = userCourseEnvironment.getCourseEnvironment().getAssessmentManager(); + return am.resetRootPassed(coach, userCourseEnvironment); + } @Override public Controller getDetailsEditController(UserRequest ureq, WindowControl wControl, BreadcrumbPanel stackPanel, diff --git a/src/main/java/org/olat/course/assessment/ui/tool/AssessmentIdentityCourseController.java b/src/main/java/org/olat/course/assessment/ui/tool/AssessmentIdentityCourseController.java index 6f92c2cf7a858937b2de40fe5f96d090ab60dce7..f0f372afa04506a7d2e1d81aab692ba8870312c5 100644 --- a/src/main/java/org/olat/course/assessment/ui/tool/AssessmentIdentityCourseController.java +++ b/src/main/java/org/olat/course/assessment/ui/tool/AssessmentIdentityCourseController.java @@ -130,7 +130,7 @@ public class AssessmentIdentityCourseController extends BasicController Boolean passedManually = course.getRunStructure().getRootNode().getModuleConfiguration().getBooleanSafe(STCourseNode.CONFIG_PASSED_MANUALLY); if (passedManually) { - passedCtrl = new IdentityPassedController(ureq, wControl, coachCourseEnv, courseEntry, assessedIdentity); + passedCtrl = new IdentityPassedController(ureq, wControl, coachCourseEnv, assessedUserCourseEnv); identityAssessmentVC.put("passed", passedCtrl.getInitialComponent()); listenTo(passedCtrl); } @@ -191,6 +191,8 @@ public class AssessmentIdentityCourseController extends BasicController if(event instanceof AssessmentFormEvent) { AssessmentFormEvent aee = (AssessmentFormEvent)event; treeOverviewCtrl.loadModel(); + if (passedCtrl != null) passedCtrl.refresh(); + if (certificateCtrl != null) certificateCtrl.loadList(); if(aee.isClose()) { stackPanel.popController(currentNodeCtrl); } @@ -204,6 +206,7 @@ public class AssessmentIdentityCourseController extends BasicController } else if (source == passedCtrl) { if (event == FormEvent.CHANGED_EVENT) { treeOverviewCtrl.loadModel(); + if (certificateCtrl != null) certificateCtrl.loadList(); fireEvent(ureq, event); } } diff --git a/src/main/java/org/olat/course/assessment/ui/tool/IdentityCertificatesController.java b/src/main/java/org/olat/course/assessment/ui/tool/IdentityCertificatesController.java index e6adba3a3a7e9678d904e6ccd0b7ef5ccea2bc71..f259234c4b44fc8cb950fe2b7afe252d688ac1eb 100644 --- a/src/main/java/org/olat/course/assessment/ui/tool/IdentityCertificatesController.java +++ b/src/main/java/org/olat/course/assessment/ui/tool/IdentityCertificatesController.java @@ -133,7 +133,7 @@ public class IdentityCertificatesController extends BasicController implements G } } - private void loadList() { + void loadList() { List<Certificate> certificates = certificatesManager.getCertificates(assessedIdentity, courseEntry.getOlatResource()); List<Links> certificatesLink = new ArrayList<>(certificates.size()); int count = 0; diff --git a/src/main/java/org/olat/course/assessment/ui/tool/IdentityPassedController.java b/src/main/java/org/olat/course/assessment/ui/tool/IdentityPassedController.java index 20ea5d6f0d3c4eb16de8ab4c967947affa6ea298..7f10707573155e69eaa4ac8b8e0b9e049152fa86 100644 --- a/src/main/java/org/olat/course/assessment/ui/tool/IdentityPassedController.java +++ b/src/main/java/org/olat/course/assessment/ui/tool/IdentityPassedController.java @@ -19,8 +19,6 @@ */ package org.olat.course.assessment.ui.tool; -import java.util.Date; - import org.olat.core.gui.UserRequest; import org.olat.core.gui.components.Component; import org.olat.core.gui.components.form.flexible.impl.FormEvent; @@ -30,13 +28,10 @@ import org.olat.core.gui.components.velocity.VelocityContainer; import org.olat.core.gui.control.Event; import org.olat.core.gui.control.WindowControl; import org.olat.core.gui.control.controller.BasicController; -import org.olat.core.id.Identity; import org.olat.core.util.Formatter; +import org.olat.course.assessment.CourseAssessmentService; import org.olat.course.run.userview.UserCourseEnvironment; -import org.olat.modules.assessment.AssessmentEntry; -import org.olat.modules.assessment.AssessmentService; import org.olat.modules.assessment.Overridable; -import org.olat.repository.RepositoryEntry; import org.olat.user.UserManager; import org.springframework.beans.factory.annotation.Autowired; @@ -53,22 +48,18 @@ public class IdentityPassedController extends BasicController { private Link failLink; private Link resetLink; - private final RepositoryEntry courseEntry; - private final String rootIdent; - private final Identity assessedIdentity; + private final UserCourseEnvironment assessedUserCourseEnv; private final boolean readOnly; @Autowired - private AssessmentService assessmentService; + private CourseAssessmentService courseAssessmentService; @Autowired private UserManager userManager; protected IdentityPassedController(UserRequest ureq, WindowControl wControl, UserCourseEnvironment coachCourseEnv, - RepositoryEntry courseEntry, Identity assessedIdentity) { + UserCourseEnvironment assessedUserCourseEnv) { super(ureq, wControl); - this.courseEntry = courseEntry; - this.assessedIdentity = assessedIdentity; - this.rootIdent = coachCourseEnv.getCourseEnvironment().getRunStructure().getRootNode().getIdent(); + this.assessedUserCourseEnv = assessedUserCourseEnv; this.readOnly = coachCourseEnv.isCourseReadOnly(); mainVC = createVelocityContainer("passed"); @@ -77,12 +68,15 @@ public class IdentityPassedController extends BasicController { failLink = LinkFactory.createLink("passed.manually.fail", "assed.manually.fail", getTranslator(), mainVC, this, Link.BUTTON); resetLink = LinkFactory.createLink("passed.manually.reset", "assed.manually.reset", getTranslator(), mainVC, this, Link.BUTTON); - AssessmentEntry assessmentEntry = assessmentService.getOrCreateAssessmentEntry(assessedIdentity, null, - courseEntry, rootIdent, Boolean.TRUE, null); - Overridable<Boolean> passedOverridable = assessmentEntry.getPassedOverridable(); + Overridable<Boolean> passedOverridable = courseAssessmentService.getRootPassed(assessedUserCourseEnv); updateUI(passedOverridable); putInitialPanel(mainVC); } + + void refresh() { + Overridable<Boolean> passedOverridable = courseAssessmentService.getRootPassed(assessedUserCourseEnv); + updateUI(passedOverridable); + } private void updateUI(Overridable<Boolean> passedOverridable) { mainVC.contextPut("message", getMessage(passedOverridable)); @@ -148,21 +142,15 @@ public class IdentityPassedController extends BasicController { } private void doOverride(UserRequest ureq, Boolean passed) { - AssessmentEntry assessmentEntry = assessmentService.getOrCreateAssessmentEntry(assessedIdentity, null, - courseEntry, rootIdent, Boolean.TRUE, null); - Overridable<Boolean> passedOverridable = assessmentEntry.getPassedOverridable(); - passedOverridable.override(passed, getIdentity(), new Date()); - assessmentService.updateAssessmentEntry(assessmentEntry); + Overridable<Boolean> passedOverridable = courseAssessmentService.overrideRootPassed(getIdentity(), + assessedUserCourseEnv, passed); updateUI(passedOverridable); fireEvent(ureq, FormEvent.CHANGED_EVENT); } private void doReset(UserRequest ureq) { - AssessmentEntry assessmentEntry = assessmentService.getOrCreateAssessmentEntry(assessedIdentity, null, - courseEntry, rootIdent, Boolean.TRUE, null); - Overridable<Boolean> passedOverridable = assessmentEntry.getPassedOverridable(); - passedOverridable.reset(); - assessmentService.updateAssessmentEntry(assessmentEntry); + Overridable<Boolean> passedOverridable = courseAssessmentService.resetRootPassed(getIdentity(), + assessedUserCourseEnv); updateUI(passedOverridable); fireEvent(ureq, FormEvent.CHANGED_EVENT); } diff --git a/src/main/java/org/olat/course/run/preview/PreviewAssessmentManager.java b/src/main/java/org/olat/course/run/preview/PreviewAssessmentManager.java index f9eac23e4f7537ca2eb0732d99796d772bbecdfd..c1de82116dc51c927d8dc9fb17bd33930ca5c46b 100644 --- a/src/main/java/org/olat/course/run/preview/PreviewAssessmentManager.java +++ b/src/main/java/org/olat/course/run/preview/PreviewAssessmentManager.java @@ -42,6 +42,7 @@ import org.olat.course.run.scoring.ScoreEvaluation; import org.olat.course.run.userview.UserCourseEnvironment; import org.olat.group.BusinessGroup; import org.olat.modules.assessment.AssessmentEntry; +import org.olat.modules.assessment.Overridable; import org.olat.modules.assessment.Role; import org.olat.modules.assessment.model.AssessmentEntryStatus; import org.olat.modules.assessment.model.AssessmentRunStatus; @@ -255,6 +256,20 @@ final class PreviewAssessmentManager implements AssessmentManager { incrementNodeAttempts(courseNode, identity, userCourseEnvironment, by); } } + @Override + public Overridable<Boolean> getRootPassed(UserCourseEnvironment userCourseEnvironment) { + return Overridable.empty(); + }; + + @Override + public Overridable<Boolean> overrideRootPassed(Identity coach, UserCourseEnvironment userCourseEnvironment, Boolean passed) { + return Overridable.empty(); + } + + @Override + public Overridable<Boolean> resetRootPassed(Identity coach, UserCourseEnvironment userCourseEnvironment) { + return Overridable.empty(); + } @Override public OLATResourceable createOLATResourceableForLocking(Identity assessedIdentity) {