Skip to content
Snippets Groups Projects
Commit 8f9efa07 authored by uhensler's avatar uhensler
Browse files

OO-4207: Evaluate assessment informations after course publish

parent 7847f1ba
No related branches found
No related tags found
No related merge requests found
...@@ -28,6 +28,7 @@ import org.olat.core.gui.components.stack.TooledStackedPanel; ...@@ -28,6 +28,7 @@ import org.olat.core.gui.components.stack.TooledStackedPanel;
import org.olat.core.gui.control.Controller; import org.olat.core.gui.control.Controller;
import org.olat.core.gui.control.WindowControl; import org.olat.core.gui.control.WindowControl;
import org.olat.core.id.Identity; import org.olat.core.id.Identity;
import org.olat.course.ICourse;
import org.olat.course.assessment.handler.AssessmentConfig; import org.olat.course.assessment.handler.AssessmentConfig;
import org.olat.course.assessment.ui.tool.AssessmentCourseNodeController; import org.olat.course.assessment.ui.tool.AssessmentCourseNodeController;
import org.olat.course.config.CourseConfig; import org.olat.course.config.CourseConfig;
...@@ -318,4 +319,11 @@ public interface CourseAssessmentService { ...@@ -318,4 +319,11 @@ public interface CourseAssessmentService {
UserCourseEnvironment coachCourseEnv, AssessmentToolContainer toolContainer, UserCourseEnvironment coachCourseEnv, AssessmentToolContainer toolContainer,
AssessmentToolSecurityCallback assessmentCallback); AssessmentToolSecurityCallback assessmentCallback);
/**
* Recalculates all AssessmentEvaluation of all users in the course.
*
* @param course
*/
public void evaluateAll(ICourse course);
} }
...@@ -27,12 +27,17 @@ import java.util.Map; ...@@ -27,12 +27,17 @@ import java.util.Map;
import javax.annotation.PostConstruct; import javax.annotation.PostConstruct;
import org.apache.logging.log4j.Logger;
import org.olat.core.commons.persistence.DBFactory;
import org.olat.core.gui.UserRequest; import org.olat.core.gui.UserRequest;
import org.olat.core.gui.components.stack.BreadcrumbPanel; import org.olat.core.gui.components.stack.BreadcrumbPanel;
import org.olat.core.gui.components.stack.TooledStackedPanel; import org.olat.core.gui.components.stack.TooledStackedPanel;
import org.olat.core.gui.control.Controller; import org.olat.core.gui.control.Controller;
import org.olat.core.gui.control.WindowControl; import org.olat.core.gui.control.WindowControl;
import org.olat.core.id.Identity; import org.olat.core.id.Identity;
import org.olat.core.id.IdentityEnvironment;
import org.olat.core.logging.Tracing;
import org.olat.course.ICourse;
import org.olat.course.assessment.AssessmentManager; import org.olat.course.assessment.AssessmentManager;
import org.olat.course.assessment.CourseAssessmentService; import org.olat.course.assessment.CourseAssessmentService;
import org.olat.course.assessment.handler.AssessmentConfig; import org.olat.course.assessment.handler.AssessmentConfig;
...@@ -42,12 +47,15 @@ import org.olat.course.assessment.ui.tool.AssessmentCourseNodeController; ...@@ -42,12 +47,15 @@ import org.olat.course.assessment.ui.tool.AssessmentCourseNodeController;
import org.olat.course.auditing.UserNodeAuditManager; import org.olat.course.auditing.UserNodeAuditManager;
import org.olat.course.config.CourseConfig; import org.olat.course.config.CourseConfig;
import org.olat.course.nodes.CourseNode; import org.olat.course.nodes.CourseNode;
import org.olat.course.properties.CoursePropertyManager;
import org.olat.course.run.environment.CourseEnvironment;
import org.olat.course.run.navigation.NodeVisitedListener; import org.olat.course.run.navigation.NodeVisitedListener;
import org.olat.course.run.scoring.AccountingEvaluators; import org.olat.course.run.scoring.AccountingEvaluators;
import org.olat.course.run.scoring.AssessmentEvaluation; import org.olat.course.run.scoring.AssessmentEvaluation;
import org.olat.course.run.scoring.ScoreCalculator; import org.olat.course.run.scoring.ScoreCalculator;
import org.olat.course.run.scoring.ScoreEvaluation; import org.olat.course.run.scoring.ScoreEvaluation;
import org.olat.course.run.userview.UserCourseEnvironment; import org.olat.course.run.userview.UserCourseEnvironment;
import org.olat.course.run.userview.UserCourseEnvironmentImpl;
import org.olat.group.BusinessGroup; import org.olat.group.BusinessGroup;
import org.olat.modules.assessment.AssessmentEntry; import org.olat.modules.assessment.AssessmentEntry;
import org.olat.modules.assessment.Role; import org.olat.modules.assessment.Role;
...@@ -67,8 +75,10 @@ import org.springframework.stereotype.Service; ...@@ -67,8 +75,10 @@ import org.springframework.stereotype.Service;
*/ */
@Service @Service
public class CourseAssessmentServiceImpl implements CourseAssessmentService, NodeVisitedListener { public class CourseAssessmentServiceImpl implements CourseAssessmentService, NodeVisitedListener {
private static final Logger log = Tracing.createLoggerFor(CourseAssessmentServiceImpl.class);
private static final String NON_ASSESSMENT_TYPE = NonAssessmentHandler.NODE_TYPE; private static final String NON_ASSESSMENT_TYPE = NonAssessmentHandler.NODE_TYPE;
@Autowired @Autowired
private List<AssessmentHandler> loadedAssessmentHandlers; private List<AssessmentHandler> loadedAssessmentHandlers;
...@@ -329,4 +339,29 @@ public class CourseAssessmentServiceImpl implements CourseAssessmentService, Nod ...@@ -329,4 +339,29 @@ public class CourseAssessmentServiceImpl implements CourseAssessmentService, Nod
return false; return false;
} }
@Override
public void evaluateAll(ICourse course) {
log.debug("Evaluate all score accountings for course {}", course);
CourseEnvironment courseEnv = course.getCourseEnvironment();
CoursePropertyManager pm = courseEnv.getCoursePropertyManager();
List<Identity> assessedIdentities = pm.getAllIdentitiesWithCourseAssessmentData(null);
int count = 0;
for(Identity assessedIdentity: assessedIdentities) {
evaluateAll(courseEnv, assessedIdentity);
log.debug("Evaluated score accounting in course {} for {}", course, assessedIdentity);
if(++count % 10 == 0) {
DBFactory.getInstance().commitAndCloseSession();
}
}
DBFactory.getInstance().commitAndCloseSession();
}
private void evaluateAll(CourseEnvironment courseEnv, Identity assessedIdentity) {
IdentityEnvironment identityEnv = new IdentityEnvironment();
identityEnv.setIdentity(assessedIdentity);
UserCourseEnvironment userCourseEnv = new UserCourseEnvironmentImpl(identityEnv, courseEnv);
userCourseEnv.getScoreAccounting().evaluateAll(true);
}
} }
...@@ -26,6 +26,7 @@ import org.olat.core.gui.control.WindowControl; ...@@ -26,6 +26,7 @@ import org.olat.core.gui.control.WindowControl;
import org.olat.core.gui.control.generic.tabbable.TabbableController; import org.olat.core.gui.control.generic.tabbable.TabbableController;
import org.olat.core.gui.translator.Translator; import org.olat.core.gui.translator.Translator;
import org.olat.core.util.Util; import org.olat.core.util.Util;
import org.olat.course.ICourse;
import org.olat.course.editor.ConditionAccessEditConfig; import org.olat.course.editor.ConditionAccessEditConfig;
import org.olat.course.nodeaccess.NodeAccessProvider; import org.olat.course.nodeaccess.NodeAccessProvider;
import org.olat.course.nodes.AbstractAccessableCourseNode; import org.olat.course.nodes.AbstractAccessableCourseNode;
...@@ -119,4 +120,9 @@ public class ConditionNodeAccessProvider implements NodeAccessProvider { ...@@ -119,4 +120,9 @@ public class ConditionNodeAccessProvider implements NodeAccessProvider {
// nothing to do // nothing to do
} }
@Override
public void onCoursePublished(ICourse course) {
// nothing to do
}
} }
...@@ -36,13 +36,13 @@ import java.util.Locale; ...@@ -36,13 +36,13 @@ import java.util.Locale;
import java.util.Set; import java.util.Set;
import java.util.zip.ZipOutputStream; import java.util.zip.ZipOutputStream;
import org.apache.logging.log4j.Logger;
import org.olat.core.CoreSpringFactory; import org.olat.core.CoreSpringFactory;
import org.olat.core.commons.persistence.DBFactory; import org.olat.core.commons.persistence.DBFactory;
import org.olat.core.gui.translator.Translator; import org.olat.core.gui.translator.Translator;
import org.olat.core.id.Identity; import org.olat.core.id.Identity;
import org.olat.core.id.OLATResourceable; import org.olat.core.id.OLATResourceable;
import org.olat.core.logging.AssertException; import org.olat.core.logging.AssertException;
import org.apache.logging.log4j.Logger;
import org.olat.core.logging.Tracing; import org.olat.core.logging.Tracing;
import org.olat.core.util.Formatter; import org.olat.core.util.Formatter;
import org.olat.core.util.ObjectCloner; import org.olat.core.util.ObjectCloner;
...@@ -61,6 +61,7 @@ import org.olat.course.CourseFactory; ...@@ -61,6 +61,7 @@ import org.olat.course.CourseFactory;
import org.olat.course.ICourse; import org.olat.course.ICourse;
import org.olat.course.Structure; import org.olat.course.Structure;
import org.olat.course.editor.PublishStepCatalog.CategoryLabel; import org.olat.course.editor.PublishStepCatalog.CategoryLabel;
import org.olat.course.nodeaccess.NodeAccessService;
import org.olat.course.nodes.CourseNode; import org.olat.course.nodes.CourseNode;
import org.olat.course.nodes.CourseNodeConfiguration; import org.olat.course.nodes.CourseNodeConfiguration;
import org.olat.course.nodes.CourseNodeFactory; import org.olat.course.nodes.CourseNodeFactory;
...@@ -500,6 +501,9 @@ public class PublishProcess { ...@@ -500,6 +501,9 @@ public class PublishProcess {
//commit all changes before sending an event //commit all changes before sending an event
DBFactory.getInstance().commitAndCloseSession(); DBFactory.getInstance().commitAndCloseSession();
NodeAccessService nodeAccessService = CoreSpringFactory.getImpl(NodeAccessService.class);
nodeAccessService.onCoursePublished(course);
/* /*
* broadcast event * broadcast event
*/ */
......
...@@ -27,6 +27,7 @@ import org.olat.core.gui.control.WindowControl; ...@@ -27,6 +27,7 @@ import org.olat.core.gui.control.WindowControl;
import org.olat.core.gui.control.generic.tabbable.TabbableController; import org.olat.core.gui.control.generic.tabbable.TabbableController;
import org.olat.core.gui.translator.Translator; import org.olat.core.gui.translator.Translator;
import org.olat.core.util.Util; import org.olat.core.util.Util;
import org.olat.course.ICourse;
import org.olat.course.assessment.CourseAssessmentService; import org.olat.course.assessment.CourseAssessmentService;
import org.olat.course.learningpath.LearningPathConfigs; import org.olat.course.learningpath.LearningPathConfigs;
import org.olat.course.learningpath.LearningPathConfigs.FullyAssessedResult; import org.olat.course.learningpath.LearningPathConfigs.FullyAssessedResult;
...@@ -164,4 +165,9 @@ public class LearningPathNodeAccessProvider implements NodeAccessProvider { ...@@ -164,4 +165,9 @@ public class LearningPathNodeAccessProvider implements NodeAccessProvider {
: courseAssessmentService.getAssessmentEntry(courseNode, userCourseEnvironment).getAssessmentStatus(); : courseAssessmentService.getAssessmentEntry(courseNode, userCourseEnvironment).getAssessmentStatus();
} }
@Override
public void onCoursePublished(ICourse course) {
courseAssessmentService.evaluateAll(course);
}
} }
...@@ -22,6 +22,7 @@ package org.olat.course.nodeaccess; ...@@ -22,6 +22,7 @@ package org.olat.course.nodeaccess;
import org.olat.core.gui.UserRequest; import org.olat.core.gui.UserRequest;
import org.olat.core.gui.control.WindowControl; import org.olat.core.gui.control.WindowControl;
import org.olat.core.gui.control.generic.tabbable.TabbableController; import org.olat.core.gui.control.generic.tabbable.TabbableController;
import org.olat.course.ICourse;
import org.olat.course.nodes.CourseNode; import org.olat.course.nodes.CourseNode;
import org.olat.course.run.userview.CourseTreeModelBuilder; import org.olat.course.run.userview.CourseTreeModelBuilder;
import org.olat.course.run.userview.UserCourseEnvironment; import org.olat.course.run.userview.UserCourseEnvironment;
...@@ -60,4 +61,6 @@ public interface NodeAccessProvider extends NodeAccessProviderIdentifier { ...@@ -60,4 +61,6 @@ public interface NodeAccessProvider extends NodeAccessProviderIdentifier {
public void onStatusUpdated(CourseNode courseNode, UserCourseEnvironment userCourseEnv, public void onStatusUpdated(CourseNode courseNode, UserCourseEnvironment userCourseEnv,
AssessmentEntryStatus status, Role by); AssessmentEntryStatus status, Role by);
public void onCoursePublished(ICourse course);
} }
...@@ -25,6 +25,7 @@ import java.util.Locale; ...@@ -25,6 +25,7 @@ import java.util.Locale;
import org.olat.core.gui.UserRequest; import org.olat.core.gui.UserRequest;
import org.olat.core.gui.control.WindowControl; import org.olat.core.gui.control.WindowControl;
import org.olat.core.gui.control.generic.tabbable.TabbableController; import org.olat.core.gui.control.generic.tabbable.TabbableController;
import org.olat.course.ICourse;
import org.olat.course.nodes.CourseNode; import org.olat.course.nodes.CourseNode;
import org.olat.course.run.userview.CourseTreeModelBuilder; import org.olat.course.run.userview.CourseTreeModelBuilder;
import org.olat.course.run.userview.UserCourseEnvironment; import org.olat.course.run.userview.UserCourseEnvironment;
...@@ -132,4 +133,11 @@ public interface NodeAccessService { ...@@ -132,4 +133,11 @@ public interface NodeAccessService {
public void onStatusUpdated(CourseNode courseNode, UserCourseEnvironment userCourseEnv, public void onStatusUpdated(CourseNode courseNode, UserCourseEnvironment userCourseEnv,
AssessmentEntryStatus status, Role by); AssessmentEntryStatus status, Role by);
/**
* Hook after a course was published.
*
* @param course
*/
public void onCoursePublished(ICourse course);
} }
...@@ -27,6 +27,7 @@ import org.olat.core.gui.UserRequest; ...@@ -27,6 +27,7 @@ import org.olat.core.gui.UserRequest;
import org.olat.core.gui.control.WindowControl; import org.olat.core.gui.control.WindowControl;
import org.olat.core.gui.control.generic.tabbable.TabbableController; import org.olat.core.gui.control.generic.tabbable.TabbableController;
import org.olat.core.logging.Tracing; import org.olat.core.logging.Tracing;
import org.olat.course.ICourse;
import org.olat.course.nodeaccess.NodeAccessProvider; import org.olat.course.nodeaccess.NodeAccessProvider;
import org.olat.course.nodeaccess.NodeAccessProviderIdentifier; import org.olat.course.nodeaccess.NodeAccessProviderIdentifier;
import org.olat.course.nodeaccess.NodeAccessService; import org.olat.course.nodeaccess.NodeAccessService;
...@@ -140,4 +141,10 @@ public class NodeAccessServiceImpl implements NodeAccessService, NodeVisitedList ...@@ -140,4 +141,10 @@ public class NodeAccessServiceImpl implements NodeAccessService, NodeVisitedList
NodeAccessType type = NodeAccessType.of(userCourseEnv); NodeAccessType type = NodeAccessType.of(userCourseEnv);
return getNodeAccessProvider(type).onNodeVisited(courseNode, userCourseEnv); return getNodeAccessProvider(type).onNodeVisited(courseNode, userCourseEnv);
} }
@Override
public void onCoursePublished(ICourse course) {
NodeAccessType type = NodeAccessType.of(course);
getNodeAccessProvider(type).onCoursePublished(course);
}
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment