Skip to content
Snippets Groups Projects
Commit 337e8884 authored by uhensler's avatar uhensler
Browse files

OO-4207: Migration script to create missing and reevaluate existing assessment entries

parent 680e1ba3
No related branches found
No related tags found
No related merge requests found
...@@ -22,12 +22,15 @@ package org.olat.course.assessment.manager; ...@@ -22,12 +22,15 @@ package org.olat.course.assessment.manager;
import java.io.File; import java.io.File;
import java.util.Date; import java.util.Date;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set;
import javax.annotation.PostConstruct; import javax.annotation.PostConstruct;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
import org.olat.basesecurity.GroupRoles;
import org.olat.core.commons.persistence.DBFactory; 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;
...@@ -46,7 +49,6 @@ import org.olat.course.assessment.handler.NonAssessmentHandler; ...@@ -46,7 +49,6 @@ import org.olat.course.assessment.handler.NonAssessmentHandler;
import org.olat.course.assessment.ui.tool.AssessmentCourseNodeController; 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.nodeaccess.NodeAccessService;
import org.olat.course.nodes.CourseNode; import org.olat.course.nodes.CourseNode;
import org.olat.course.properties.CoursePropertyManager; import org.olat.course.properties.CoursePropertyManager;
import org.olat.course.run.environment.CourseEnvironment; import org.olat.course.run.environment.CourseEnvironment;
...@@ -65,6 +67,8 @@ import org.olat.modules.assessment.model.AssessmentRunStatus; ...@@ -65,6 +67,8 @@ import org.olat.modules.assessment.model.AssessmentRunStatus;
import org.olat.modules.assessment.ui.AssessmentToolContainer; import org.olat.modules.assessment.ui.AssessmentToolContainer;
import org.olat.modules.assessment.ui.AssessmentToolSecurityCallback; import org.olat.modules.assessment.ui.AssessmentToolSecurityCallback;
import org.olat.repository.RepositoryEntry; import org.olat.repository.RepositoryEntry;
import org.olat.repository.RepositoryEntryRelationType;
import org.olat.repository.RepositoryService;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
...@@ -82,7 +86,7 @@ public class CourseAssessmentServiceImpl implements CourseAssessmentService, Nod ...@@ -82,7 +86,7 @@ public class CourseAssessmentServiceImpl implements CourseAssessmentService, Nod
private static final String NON_ASSESSMENT_TYPE = NonAssessmentHandler.NODE_TYPE; private static final String NON_ASSESSMENT_TYPE = NonAssessmentHandler.NODE_TYPE;
@Autowired @Autowired
private NodeAccessService nodeAccsessService; private RepositoryService repositoryService;
@Autowired @Autowired
private List<AssessmentHandler> loadedAssessmentHandlers; private List<AssessmentHandler> loadedAssessmentHandlers;
...@@ -347,13 +351,19 @@ public class CourseAssessmentServiceImpl implements CourseAssessmentService, Nod ...@@ -347,13 +351,19 @@ public class CourseAssessmentServiceImpl implements CourseAssessmentService, Nod
public void evaluateAll(ICourse course) { public void evaluateAll(ICourse course) {
log.debug("Evaluate all score accountings for course {}", course); log.debug("Evaluate all score accountings for course {}", course);
CourseEnvironment courseEnv = course.getCourseEnvironment(); CourseEnvironment courseEnv = course.getCourseEnvironment();
RepositoryEntry courseEntry = courseEnv.getCourseGroupManager().getCourseEntry();
CoursePropertyManager pm = courseEnv.getCoursePropertyManager(); CoursePropertyManager pm = courseEnv.getCoursePropertyManager();
Set<Identity> identities = new HashSet<>();
List<Identity> assessedIdentities = pm.getAllIdentitiesWithCourseAssessmentData(null); List<Identity> assessedIdentities = pm.getAllIdentitiesWithCourseAssessmentData(null);
identities.addAll(assessedIdentities);
List<Identity> members = repositoryService.getMembers(courseEntry, RepositoryEntryRelationType.all, GroupRoles.participant.name());
identities.addAll(members);
int count = 0; int count = 0;
for(Identity assessedIdentity: assessedIdentities) { for(Identity identity: identities) {
evaluateAll(courseEnv, assessedIdentity); evaluateAll(courseEnv, identity);
log.debug("Evaluated score accounting in course {} for {}", course, assessedIdentity); log.debug("Evaluated score accounting in course {} for {}", course, identity);
if(++count % 10 == 0) { if(++count % 10 == 0) {
DBFactory.getInstance().commitAndCloseSession(); DBFactory.getInstance().commitAndCloseSession();
} }
......
/**
* <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.upgrade;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
import org.apache.logging.log4j.Logger;
import org.olat.core.commons.persistence.DB;
import org.olat.core.commons.persistence.QueryBuilder;
import org.olat.core.logging.Tracing;
import org.olat.course.CorruptedCourseException;
import org.olat.course.CourseFactory;
import org.olat.course.ICourse;
import org.olat.course.Structure;
import org.olat.course.assessment.CourseAssessmentService;
import org.olat.course.nodes.CourseNode;
import org.olat.repository.RepositoryEntry;
import org.springframework.beans.factory.annotation.Autowired;
/**
*
* Initial date: 6 dec 2019<br>
* @author uhensler, urs.hensler@frentix.com, http://www.frentix.com
*
*/
public class OLATUpgrade_15_pre_0 extends OLATUpgrade {
private static final Logger log = Tracing.createLoggerFor(OLATUpgrade_15_pre_0.class);
private static final String VERSION = "OLAT_15.pre.0";
private static final String INIT_ASSESSMENT_ENTRY_ROOT = "INIT ASESSMENT ENTRY ROOT";
@Autowired
private DB dbInstance;
@Autowired
private CourseAssessmentService courseAssessmentService;
public OLATUpgrade_15_pre_0() {
super();
}
@Override
public String getVersion() {
return VERSION;
}
@Override
public boolean doPostSystemInitUpgrade(UpgradeManager upgradeManager) {
UpgradeHistoryData uhd = upgradeManager.getUpgradesHistory(VERSION);
if (uhd == null) {
// has never been called, initialize
uhd = new UpgradeHistoryData();
} else if (uhd.isInstallationComplete()) {
return false;
}
boolean allOk = true;
allOk &= migrateAssessmentEntry(upgradeManager, uhd);
uhd.setInstallationComplete(allOk);
upgradeManager.setUpgradesHistory(uhd, VERSION);
if(allOk) {
log.info(Tracing.M_AUDIT, "Finished OLATUpgrade_15_pre_0 successfully!");
} else {
log.info(Tracing.M_AUDIT, "OLATUpgrade_15_pre_0 not finished, try to restart OpenOlat!");
}
return allOk;
}
private boolean migrateAssessmentEntry(UpgradeManager upgradeManager, UpgradeHistoryData uhd) {
boolean allOk = true;
if (!uhd.getBooleanDataValue(INIT_ASSESSMENT_ENTRY_ROOT)) {
try {
migrateCourseAssessmentEntries();
migrateOtherRepositoryEntryRoot();
dbInstance.commitAndCloseSession();
log.info("All assessment entries migrated.");
} catch (Exception e) {
log.error("", e);
allOk = false;
}
uhd.setBooleanDataValue(INIT_ASSESSMENT_ENTRY_ROOT, allOk);
upgradeManager.setUpgradesHistory(uhd, VERSION);
}
return allOk;
}
private void migrateCourseAssessmentEntries() {
List<RepositoryEntry> courseEntries = getCourseEntries();
AtomicInteger migrationCounter = new AtomicInteger(0);
for (RepositoryEntry repositoryEntry : courseEntries) {
migrateCourseAssessmentEntries(repositoryEntry);
migrationCounter.incrementAndGet();
if(migrationCounter.get() % 25 == 0) {
dbInstance.commitAndCloseSession();
} else {
dbInstance.commit();
}
if(migrationCounter.get() % 100 == 0) {
log.info("Assessment entries: num. of courses migrated: {}", migrationCounter);
}
}
}
private List<RepositoryEntry> getCourseEntries() {
QueryBuilder sb = new QueryBuilder();
sb.append("select re");
sb.append(" from repositoryentry re");
sb.append(" inner join re.olatResource as ores");
sb.and().append(" ores.resName = 'CourseModule'");
return dbInstance.getCurrentEntityManager()
.createQuery(sb.toString(), RepositoryEntry.class)
.getResultList();
}
private void migrateCourseAssessmentEntries(RepositoryEntry repositoryEntry) {
try {
ICourse course = CourseFactory.loadCourse(repositoryEntry);
if (course != null) {
Structure runStructure = course.getCourseEnvironment().getRunStructure();
if (runStructure != null) {
CourseNode rootNode = runStructure.getRootNode();
if (rootNode != null) {
String ident = rootNode.getIdent();
setRootEntryTrue(repositoryEntry, ident);
setRootEntryFalse(repositoryEntry, ident);
courseAssessmentService.evaluateAll(course);
log.info("Assessment entries migrated: course {} ({}).",
repositoryEntry.getKey(), repositoryEntry.getDisplayname());
}
}
}
} catch (CorruptedCourseException e) {
// do nothing
}
}
private void setRootEntryTrue(RepositoryEntry repositoryEntry, String ident) {
QueryBuilder sb = new QueryBuilder();
sb.append("update assessmententry ae");
sb.append(" set ae.entryRoot=true");
sb.and().append("entryRoot is null");
sb.and().append("ae.repositoryEntry.key = :repoKey");
sb.and().append("ae.subIdent = :subIdent");
dbInstance.getCurrentEntityManager()
.createQuery(sb.toString())
.setParameter("repoKey", repositoryEntry.getKey())
.setParameter("subIdent", ident)
.executeUpdate();
}
private void setRootEntryFalse(RepositoryEntry repositoryEntry, String ident) {
QueryBuilder sb = new QueryBuilder();
sb.append("update assessmententry ae");
sb.append(" set ae.entryRoot=false");
sb.and().append("entryRoot is null");
sb.and().append("ae.repositoryEntry.key = :repoKey");
sb.and().append("ae.subIdent <> :subIdent");
dbInstance.getCurrentEntityManager()
.createQuery(sb.toString())
.setParameter("repoKey", repositoryEntry.getKey())
.setParameter("subIdent", ident)
.executeUpdate();
}
private void migrateOtherRepositoryEntryRoot() {
QueryBuilder sb = new QueryBuilder();
sb.append("update assessmententry ae");
sb.append(" set ae.entryRoot=true");
sb.and().append("entryRoot is null");
dbInstance.getCurrentEntityManager()
.createQuery(sb.toString())
.executeUpdate();
log.info("Updated entry root for assessment entries of other than courses.");
}
}
...@@ -53,6 +53,7 @@ ...@@ -53,6 +53,7 @@
<bean id="upgrade_14_0_3" class="org.olat.upgrade.OLATUpgrade_14_0_3"/> <bean id="upgrade_14_0_3" class="org.olat.upgrade.OLATUpgrade_14_0_3"/>
<bean id="upgrade_14_0_5" class="org.olat.upgrade.OLATUpgrade_14_0_5"/> <bean id="upgrade_14_0_5" class="org.olat.upgrade.OLATUpgrade_14_0_5"/>
<bean id="upgrade_14_1_0" class="org.olat.upgrade.OLATUpgrade_14_1_0"/> <bean id="upgrade_14_1_0" class="org.olat.upgrade.OLATUpgrade_14_1_0"/>
<bean id="upgrade_14_2_0" class="org.olat.upgrade.OLATUpgrade_15_pre_0"/>
</list> </list>
</property> </property>
</bean> </bean>
......
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