diff --git a/src/main/java/de/bps/onyx/plugin/wsserver/ReturnWSService.java b/src/main/java/de/bps/onyx/plugin/wsserver/ReturnWSService.java index 10f9e672195c1a6ea5be4667692e3835bdd371c2..1daa60daa0e777ab62c95673991558d47ec65aa0 100644 --- a/src/main/java/de/bps/onyx/plugin/wsserver/ReturnWSService.java +++ b/src/main/java/de/bps/onyx/plugin/wsserver/ReturnWSService.java @@ -43,6 +43,7 @@ import org.olat.course.CourseFactory; import org.olat.course.ICourse; import org.olat.course.assessment.AssessmentManager; import org.olat.course.assessment.manager.CourseAssessmentManagerImpl; +import org.olat.course.nodes.AssessableCourseNode; import org.olat.course.nodes.CourseNode; import org.olat.course.run.scoring.ScoreEvaluation; import org.olat.course.run.userview.UserCourseEnvironment; @@ -214,7 +215,7 @@ public class ReturnWSService { ScoreEvaluation scoreEvaluation = new ScoreEvaluation(qtiResultSet.getScore(), qtiResultSet.getIsPassed(), qtiResultSet.getFullyAssessed(), qtiResultSet.getAssessmentID()); - am.saveScoreEvaluation(courseNode, null, assessedIdentity, scoreEvaluation, userCourseEnvironment, false); + am.saveScoreEvaluation((AssessableCourseNode)courseNode, null, assessedIdentity, scoreEvaluation, userCourseEnvironment, false); } } else { diff --git a/src/main/java/org/olat/course/assessment/AssessmentManager.java b/src/main/java/org/olat/course/assessment/AssessmentManager.java index 48427ea48bb5e7d2e24f461b10f16b9556737847..02cbfc592311b8db637571d58e6c7d1fc7492b89 100644 --- a/src/main/java/org/olat/course/assessment/AssessmentManager.java +++ b/src/main/java/org/olat/course/assessment/AssessmentManager.java @@ -31,6 +31,7 @@ import java.util.List; import org.olat.core.id.Identity; import org.olat.core.id.OLATResourceable; import org.olat.core.util.event.GenericEventListener; +import org.olat.course.nodes.AssessableCourseNode; import org.olat.course.nodes.CourseNode; import org.olat.course.run.scoring.ScoreEvaluation; import org.olat.course.run.userview.UserCourseEnvironment; @@ -172,7 +173,7 @@ public interface AssessmentManager { * @param assessedIdentity * @param scoreEvaluation */ - public void saveScoreEvaluation(CourseNode courseNode, Identity identity, Identity assessedIdentity, ScoreEvaluation scoreEvaluation, UserCourseEnvironment userCourseEnvironment, boolean incrementUserAttempts); + public void saveScoreEvaluation(AssessableCourseNode courseNode, Identity identity, Identity assessedIdentity, ScoreEvaluation scoreEvaluation, UserCourseEnvironment userCourseEnvironment, boolean incrementUserAttempts); /** * Provides an OLATResourceable for locking (of score/passed etc.) purposes (if doInSync is called on score/passed data) diff --git a/src/main/java/org/olat/course/assessment/AssessmentToolManager.java b/src/main/java/org/olat/course/assessment/AssessmentToolManager.java index b3dc18eaba7c32a6e8e3572c14c966de1acd39a3..1085706cf3b50a24deeb2ba5e6237eb8ea1d3ab0 100644 --- a/src/main/java/org/olat/course/assessment/AssessmentToolManager.java +++ b/src/main/java/org/olat/course/assessment/AssessmentToolManager.java @@ -45,5 +45,6 @@ public interface AssessmentToolManager { public List<IdentityShort> getShortAssessedIdentities(Identity coach, SearchAssessedIdentityParams params, int maxResults); public List<AssessmentEntry> getAssessmentEntries(Identity coach, SearchAssessedIdentityParams params, AssessmentEntryStatus status); + } 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 83f7ae042fdc78694c1384b7a5448df4d11ec730..f34bb86232ff957a73ad39bbcad57173ac5a56f5 100644 --- a/src/main/java/org/olat/course/assessment/manager/CourseAssessmentManagerImpl.java +++ b/src/main/java/org/olat/course/assessment/manager/CourseAssessmentManagerImpl.java @@ -206,7 +206,7 @@ public class CourseAssessmentManagerImpl implements AssessmentManager { } @Override - public void saveScoreEvaluation(CourseNode courseNode, Identity identity, Identity assessedIdentity, + public void saveScoreEvaluation(AssessableCourseNode courseNode, Identity identity, Identity assessedIdentity, ScoreEvaluation scoreEvaluation, UserCourseEnvironment userCourseEnv, boolean incrementUserAttempts) { ICourse course = CourseFactory.loadCourse(courseEntry.getOlatResource()); @@ -276,13 +276,11 @@ public class CourseAssessmentManagerImpl implements AssessmentManager { LoggingResourceable.wrap(identity), LoggingResourceable.wrapNonOlatResource(StringResourceableType.qtiAttempts, "", String.valueOf(attempts))); } - - if(courseNode instanceof AssessableCourseNode) { - userCourseEnv.getScoreAccounting().scoreInfoChanged((AssessableCourseNode)courseNode, scoreEvaluation); - // Update users efficiency statement - efficiencyStatementManager.updateUserEfficiencyStatement(userCourseEnv); - } + userCourseEnv.getScoreAccounting().scoreInfoChanged(courseNode, scoreEvaluation); + // Update users efficiency statement + efficiencyStatementManager.updateUserEfficiencyStatement(userCourseEnv); + if(passed != null && passed.booleanValue() && course.getCourseConfig().isAutomaticCertificationEnabled()) { if(certificatesManager.isCertificationAllowed(assessedIdentity, courseEntry)) { CertificateTemplate template = null; diff --git a/src/main/java/org/olat/course/assessment/ui/tool/AssessmentIdentitiesCourseNodeController.java b/src/main/java/org/olat/course/assessment/ui/tool/AssessmentIdentitiesCourseNodeController.java index 946205a2253b42d1853d9b2ae95720dffc333965..5525792df03eb3176ea09a31c4ba6de7e3528912 100644 --- a/src/main/java/org/olat/course/assessment/ui/tool/AssessmentIdentitiesCourseNodeController.java +++ b/src/main/java/org/olat/course/assessment/ui/tool/AssessmentIdentitiesCourseNodeController.java @@ -245,7 +245,9 @@ public class AssessmentIdentitiesCourseNodeController extends FormBasicControlle List<AssessedIdentityCourseElementRow> rows = new ArrayList<>(assessedIdentities.size()); for(Identity assessedIdentity:assessedIdentities) { AssessmentEntry entry = entryMap.get(assessedIdentity.getKey()); - rows.add(new AssessedIdentityCourseElementRow(assessedIdentity, entry, userPropertyHandlers, getLocale())); + if(accept(entry, params)) { + rows.add(new AssessedIdentityCourseElementRow(assessedIdentity, entry, userPropertyHandlers, getLocale())); + } } usersTableModel.setObjects(rows); tableEl.reloadData(); @@ -281,6 +283,27 @@ public class AssessmentIdentitiesCourseNodeController extends FormBasicControlle flc.contextPut("toolCmpNames", toolCmpNames); } + private boolean accept(AssessmentEntry entry, SearchAssessedIdentityParams params) { + boolean ok = true; + + if(params.isPassed() && (entry == null || entry.getPassed() == null || !entry.getPassed().booleanValue())) { + ok &= false; + } + + if(params.isFailed() && (entry == null || entry.getPassed() == null || entry.getPassed().booleanValue())) { + ok &= false; + } + + if(params.getAssessmentStatus() != null && params.getAssessmentStatus().size() > 0) { + if(entry == null || entry.getAssessmentStatus() == null) { + ok &= false; + } else { + ok &= !params.getAssessmentStatus().contains(entry.getAssessmentStatus()); + } + } + return ok; + } + private void fillAlternativeToAssessableIdentityList(AssessmentToolOptions options) { List<Group> baseGroups = new ArrayList<>(); if((assessmentCallback.canAssessRepositoryEntryMembers() && assessmentCallback.getCoachedGroups().isEmpty()) diff --git a/src/main/java/org/olat/course/assessment/ui/tool/AssessmentIdentitiesCourseNodeTableModel.java b/src/main/java/org/olat/course/assessment/ui/tool/AssessmentIdentitiesCourseNodeTableModel.java index a077b84c846984a6e8919ba58ce300c4dadbf201..9c9d85ff4bc3633268943dec61b660e6d971c827 100644 --- a/src/main/java/org/olat/course/assessment/ui/tool/AssessmentIdentitiesCourseNodeTableModel.java +++ b/src/main/java/org/olat/course/assessment/ui/tool/AssessmentIdentitiesCourseNodeTableModel.java @@ -19,16 +19,20 @@ */ package org.olat.course.assessment.ui.tool; +import java.util.ArrayList; import java.util.List; import org.olat.core.commons.persistence.SortKey; import org.olat.core.gui.components.form.flexible.impl.elements.table.DefaultFlexiTableDataModel; +import org.olat.core.gui.components.form.flexible.impl.elements.table.FilterableFlexiTableModel; import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiSortableColumnDef; import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTableColumnModel; import org.olat.core.gui.components.form.flexible.impl.elements.table.SortableFlexiTableDataModel; import org.olat.core.gui.components.form.flexible.impl.elements.table.SortableFlexiTableModelDelegate; +import org.olat.core.util.StringHelper; import org.olat.course.nodes.AssessableCourseNode; import org.olat.course.nodes.STCourseNode; +import org.olat.modules.assessment.model.AssessmentEntryStatus; /** * @@ -37,15 +41,51 @@ import org.olat.course.nodes.STCourseNode; * */ public class AssessmentIdentitiesCourseNodeTableModel extends DefaultFlexiTableDataModel<AssessedIdentityCourseElementRow> - implements SortableFlexiTableDataModel<AssessedIdentityCourseElementRow> { + implements SortableFlexiTableDataModel<AssessedIdentityCourseElementRow>, FilterableFlexiTableModel { private final AssessableCourseNode courseNode; + private List<AssessedIdentityCourseElementRow> backups; public AssessmentIdentitiesCourseNodeTableModel(FlexiTableColumnModel columnModel, AssessableCourseNode courseNode) { super(columnModel); this.courseNode = courseNode; } - + + @Override + public void filter(String key) { + if(StringHelper.containsNonWhitespace(key)) { + List<AssessedIdentityCourseElementRow> filteredRows = new ArrayList<>(); + if("passed".equals(key)) { + for(AssessedIdentityCourseElementRow row:getObjects()) { + if(row.getPassed() != null && row.getPassed().booleanValue()) { + filteredRows.add(row); + } + } + } else if("failed".equals(key)) { + for(AssessedIdentityCourseElementRow row:getObjects()) { + if(row.getPassed() != null && !row.getPassed().booleanValue()) { + filteredRows.add(row); + } + } + } else if(AssessmentEntryStatus.isValueOf(key)) { + for(AssessedIdentityCourseElementRow row:getObjects()) { + if(row.getAssessmentStatus() != null && key.equals(row.getAssessmentStatus().name())) { + filteredRows.add(row); + } + } + } + super.setObjects(filteredRows); + } else { + super.setObjects(backups); + } + } + + @Override + public void setObjects(List<AssessedIdentityCourseElementRow> objects) { + backups = objects; + super.setObjects(objects); + } + @Override public void sort(SortKey orderBy) { SortableFlexiTableModelDelegate<AssessedIdentityCourseElementRow> sorter 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 3d1ba2f127555ac714760ba2d5a11a1e8ac0d7ff..8acd7c50e9d4ac807399e9e4fd32ecb04714e1a4 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 @@ -206,21 +206,22 @@ public class AssessmentIdentityCourseController extends BasicController { int index = treeOverviewCtrl.getIndexOf(courseNode); int numOfNodes = treeOverviewCtrl.getNumberOfNodes(); - previousLink = LinkFactory.createToolLink("previouselement","", this, "o_icon_previous"); + previousLink = LinkFactory.createToolLink("previouselement", translate("previous"), this, "o_icon_previous"); previousLink.setTitle(translate("command.previous")); previousLink.setEnabled(index > 1 && index <= numOfNodes); - stackPanel.addTool(previousLink, Align.rightEdge, false, ""); + stackPanel.addTool(previousLink, Align.rightEdge, false); courseNodeSelectionLink = LinkFactory.createToolLink("node.select", "node.select", courseNode.getShortTitle(), this); String courseNodeCssClass = CourseNodeFactory.getInstance() .getCourseNodeConfigurationEvenForDisabledBB(courseNode.getType()).getIconCSSClass(); + courseNodeSelectionLink.setElementCssClass("dropdown-toggle "); courseNodeSelectionLink.setIconLeftCSS("o_icon " + courseNodeCssClass); courseNodeSelectionLink.setIconRightCSS("o_icon o_icon_caret"); - stackPanel.addTool(courseNodeSelectionLink, Align.rightEdge, false); + stackPanel.addTool(courseNodeSelectionLink, Align.rightEdge, false, "o_tool_dropdown dropdown"); - nextLink = LinkFactory.createToolLink("nextelement","", this, "o_icon_next"); + nextLink = LinkFactory.createToolLink("nextelement", translate("next"), this, "o_icon_next"); nextLink.setTitle(translate("command.next")); nextLink.setEnabled(index > 0 && index < numOfNodes); - stackPanel.addTool(nextLink, Align.rightEdge, false, ""); + stackPanel.addTool(nextLink, Align.rightEdge, false); } } diff --git a/src/main/java/org/olat/course/assessment/ui/tool/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/course/assessment/ui/tool/_i18n/LocalStrings_de.properties index cbb6dcae32cec1a0454b0af9e4f8de9c4b4dbfca..9516d34476f9510b45d818fcce51b4db22749461 100644 --- a/src/main/java/org/olat/course/assessment/ui/tool/_i18n/LocalStrings_de.properties +++ b/src/main/java/org/olat/course/assessment/ui/tool/_i18n/LocalStrings_de.properties @@ -24,6 +24,7 @@ waiting.review=Pending reviews no.certificate=Kein Zertifikat vorhanden elements.to.review=<i class="o_icon o_icon_warning"> </i> {0} pending sub.details=Details +previous=Zurück filter=Filter filter.passed=Bestanden filter.failed=Nicht bestanden diff --git a/src/main/java/org/olat/course/assessment/ui/tool/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/course/assessment/ui/tool/_i18n/LocalStrings_en.properties index c31d34757e58110e3f93943f48fe2f8d89ab532f..cb8ce70a3fffecb8d8addae64474ffdbdf39cc0c 100644 --- a/src/main/java/org/olat/course/assessment/ui/tool/_i18n/LocalStrings_en.properties +++ b/src/main/java/org/olat/course/assessment/ui/tool/_i18n/LocalStrings_en.properties @@ -1,3 +1,4 @@ #Fri Feb 06 10:03:07 CET 2015 certificates.wizard.title=$org.olat.course.certificate.ui\:certificates.wizard.title generate.certificate=$org.olat.course.certificate.ui\:generate.certificate +previous=Previous diff --git a/src/main/java/org/olat/course/nodes/CalculatedAssessableCourseNode.java b/src/main/java/org/olat/course/nodes/CalculatedAssessableCourseNode.java new file mode 100644 index 0000000000000000000000000000000000000000..f61c916a8bdf9652199b9e74f18955621456a5bf --- /dev/null +++ b/src/main/java/org/olat/course/nodes/CalculatedAssessableCourseNode.java @@ -0,0 +1,34 @@ +/** + * <a href="http://www.openolat.org"> + * OpenOLAT - Online Learning and Training</a><br> + * <p> + * Licensed under the Apache License, Version 2.0 (the "License"); <br> + * you may not use this file except in compliance with the License.<br> + * You may obtain a copy of the License at the + * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a> + * <p> + * Unless required by applicable law or agreed to in writing,<br> + * software distributed under the License is distributed on an "AS IS" BASIS, <br> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br> + * See the License for the specific language governing permissions and <br> + * limitations under the License. + * <p> + * Initial code contributed and copyrighted by<br> + * frentix GmbH, http://www.frentix.com + * <p> + */ +package org.olat.course.nodes; + +import org.olat.course.run.scoring.ScoreCalculator; + +/** + * + * Initial date: 01.12.2015<br> + * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com + * + */ +public interface CalculatedAssessableCourseNode extends AssessableCourseNode { + + public ScoreCalculator getScoreCalculator(); + +} diff --git a/src/main/java/org/olat/course/nodes/STCourseNode.java b/src/main/java/org/olat/course/nodes/STCourseNode.java index a38d1b30beef19f7a8d1b03581467884bc3f9086..7d022cf8bf117f7cfbf52ee6a3b42158c88fe90e 100644 --- a/src/main/java/org/olat/course/nodes/STCourseNode.java +++ b/src/main/java/org/olat/course/nodes/STCourseNode.java @@ -95,7 +95,7 @@ import org.olat.util.logging.activity.LoggingResourceable; * @author Mike Stock * @author BPS (<a href="http://www.bps-system.de/">BPS Bildungsportal Sachsen GmbH</a>) */ -public class STCourseNode extends AbstractAccessableCourseNode implements AssessableCourseNode { +public class STCourseNode extends AbstractAccessableCourseNode implements CalculatedAssessableCourseNode { private static final long serialVersionUID = -7460670977531082040L; private static final String TYPE = "st"; 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 426feaf09a420827ef08a2d1806cf7cf86ae4e09..f9d77b1939764224883edf0d56ab370f609b0b6c 100644 --- a/src/main/java/org/olat/course/run/preview/PreviewAssessmentManager.java +++ b/src/main/java/org/olat/course/run/preview/PreviewAssessmentManager.java @@ -37,6 +37,7 @@ import org.olat.core.logging.AssertException; import org.olat.core.manager.BasicManager; import org.olat.core.util.event.GenericEventListener; import org.olat.course.assessment.AssessmentManager; +import org.olat.course.nodes.AssessableCourseNode; import org.olat.course.nodes.CourseNode; import org.olat.course.run.scoring.ScoreEvaluation; import org.olat.course.run.userview.UserCourseEnvironment; @@ -84,6 +85,7 @@ final class PreviewAssessmentManager extends BasicManager implements AssessmentM /** * @see org.olat.course.assessment.AssessmentManager#saveNodeAttempts(org.olat.course.nodes.CourseNode, org.olat.core.id.Identity, org.olat.core.id.Identity, java.lang.Integer) */ + @Override public void saveNodeAttempts(CourseNode courseNode, Identity identity, Identity assessedIdentity, Integer attempts) { nodeAttempts.put(courseNode.getIdent(), attempts); } @@ -91,6 +93,7 @@ final class PreviewAssessmentManager extends BasicManager implements AssessmentM /** * @see org.olat.course.assessment.AssessmentManager#saveNodeComment(org.olat.course.nodes.CourseNode, org.olat.core.id.Identity, org.olat.core.id.Identity, java.lang.String) */ + @Override public void saveNodeComment(CourseNode courseNode, Identity identity, Identity assessedIdentity, String comment) { throw new AssertException("Not implemented for preview."); } @@ -98,6 +101,7 @@ final class PreviewAssessmentManager extends BasicManager implements AssessmentM /** * @see org.olat.course.assessment.AssessmentManager#saveNodeCoachComment(org.olat.course.nodes.CourseNode, org.olat.core.id.Identity, java.lang.String) */ + @Override public void saveNodeCoachComment(CourseNode courseNode, Identity assessedIdentity, String comment) { throw new AssertException("Not implemented for preview."); } @@ -112,6 +116,7 @@ final class PreviewAssessmentManager extends BasicManager implements AssessmentM /** * @see org.olat.course.assessment.AssessmentManager#incrementNodeAttempts(org.olat.course.nodes.CourseNode, org.olat.core.id.Identity) */ + @Override public void incrementNodeAttempts(CourseNode courseNode, Identity identity, UserCourseEnvironment userCourseEnvironment) { Integer attempts = nodeAttempts.get(courseNode.getIdent()); if (attempts == null) attempts = new Integer(0); @@ -132,6 +137,7 @@ final class PreviewAssessmentManager extends BasicManager implements AssessmentM /** * @see org.olat.course.assessment.AssessmentManager#getNodeScore(org.olat.course.nodes.CourseNode, org.olat.core.id.Identity) */ + @Override public Float getNodeScore(CourseNode courseNode, Identity identity) { return nodeScores.get(courseNode.getIdent()); } @@ -139,6 +145,7 @@ final class PreviewAssessmentManager extends BasicManager implements AssessmentM /** * @see org.olat.course.assessment.AssessmentManager#getNodeComment(org.olat.course.nodes.CourseNode, org.olat.core.id.Identity) */ + @Override public String getNodeComment(CourseNode courseNode, Identity identity) { return "This is a preview"; //default comment for preview } @@ -146,6 +153,7 @@ final class PreviewAssessmentManager extends BasicManager implements AssessmentM /** * @see org.olat.course.assessment.AssessmentManager#getNodeCoachComment(org.olat.course.nodes.CourseNode, org.olat.core.id.Identity) */ + @Override public String getNodeCoachComment(CourseNode courseNode, Identity identity) { return "This is a preview"; //default comment for preview } @@ -153,6 +161,7 @@ final class PreviewAssessmentManager extends BasicManager implements AssessmentM /** * @see org.olat.course.assessment.AssessmentManager#getNodePassed(org.olat.course.nodes.CourseNode, org.olat.core.id.Identity) */ + @Override public Boolean getNodePassed(CourseNode courseNode, Identity identity) { return nodePassed.get(courseNode.getIdent()); } @@ -165,6 +174,7 @@ final class PreviewAssessmentManager extends BasicManager implements AssessmentM /** * @see org.olat.course.assessment.AssessmentManager#getNodeAttempts(org.olat.course.nodes.CourseNode, org.olat.core.id.Identity) */ + @Override public Integer getNodeAttempts(CourseNode courseNode, Identity identity) { Integer attempts = nodeAttempts.get(courseNode.getIdent()); return (attempts == null ? new Integer(0) : attempts); @@ -173,6 +183,7 @@ final class PreviewAssessmentManager extends BasicManager implements AssessmentM /** * @see org.olat.course.assessment.AssessmentManager#registerForAssessmentChangeEvents(org.olat.core.util.event.GenericEventListener, org.olat.core.id.Identity) */ + @Override public void registerForAssessmentChangeEvents(GenericEventListener gel, Identity identity) { throw new AssertException("Not implemented for preview."); } @@ -180,6 +191,7 @@ final class PreviewAssessmentManager extends BasicManager implements AssessmentM /** * @see org.olat.course.assessment.AssessmentManager#deregisterFromAssessmentChangeEvents(org.olat.core.util.event.GenericEventListener) */ + @Override public void deregisterFromAssessmentChangeEvents(GenericEventListener gel) { throw new AssertException("Not implemented for preview."); } @@ -211,7 +223,8 @@ final class PreviewAssessmentManager extends BasicManager implements AssessmentM * * @see org.olat.course.assessment.AssessmentManager#saveScoreEvaluation(org.olat.course.nodes.CourseNode, org.olat.core.id.Identity, org.olat.core.id.Identity, org.olat.course.run.scoring.ScoreEvaluation) */ - public void saveScoreEvaluation(CourseNode courseNode, Identity identity, Identity assessedIdentity, ScoreEvaluation scoreEvaluation, + @Override + public void saveScoreEvaluation(AssessableCourseNode courseNode, Identity identity, Identity assessedIdentity, ScoreEvaluation scoreEvaluation, UserCourseEnvironment userCourseEnvironment, boolean incrementUserAttempts) { saveNodeScore(courseNode, scoreEvaluation.getScore()); @@ -221,10 +234,9 @@ final class PreviewAssessmentManager extends BasicManager implements AssessmentM incrementNodeAttempts(courseNode, identity, userCourseEnvironment); } } - - + + @Override public OLATResourceable createOLATResourceableForLocking(Identity assessedIdentity) { throw new AssertException("Not implemented for preview."); } - } \ No newline at end of file