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 36ca56576e7e609aec5b899ca5b02049706f9908..a0655b8254f475be188f6fbabc182c76e6a01008 100644 --- a/src/main/java/org/olat/course/assessment/manager/CourseAssessmentServiceImpl.java +++ b/src/main/java/org/olat/course/assessment/manager/CourseAssessmentServiceImpl.java @@ -22,12 +22,15 @@ package org.olat.course.assessment.manager; import java.io.File; import java.util.Date; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Set; import javax.annotation.PostConstruct; import org.apache.logging.log4j.Logger; +import org.olat.basesecurity.GroupRoles; import org.olat.core.commons.persistence.DBFactory; import org.olat.core.gui.UserRequest; import org.olat.core.gui.components.stack.BreadcrumbPanel; @@ -46,7 +49,6 @@ import org.olat.course.assessment.handler.NonAssessmentHandler; import org.olat.course.assessment.ui.tool.AssessmentCourseNodeController; import org.olat.course.auditing.UserNodeAuditManager; import org.olat.course.config.CourseConfig; -import org.olat.course.nodeaccess.NodeAccessService; import org.olat.course.nodes.CourseNode; import org.olat.course.properties.CoursePropertyManager; import org.olat.course.run.environment.CourseEnvironment; @@ -65,6 +67,8 @@ import org.olat.modules.assessment.model.AssessmentRunStatus; import org.olat.modules.assessment.ui.AssessmentToolContainer; import org.olat.modules.assessment.ui.AssessmentToolSecurityCallback; 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.stereotype.Service; @@ -82,7 +86,7 @@ public class CourseAssessmentServiceImpl implements CourseAssessmentService, Nod private static final String NON_ASSESSMENT_TYPE = NonAssessmentHandler.NODE_TYPE; @Autowired - private NodeAccessService nodeAccsessService; + private RepositoryService repositoryService; @Autowired private List<AssessmentHandler> loadedAssessmentHandlers; @@ -347,13 +351,19 @@ public class CourseAssessmentServiceImpl implements CourseAssessmentService, Nod public void evaluateAll(ICourse course) { log.debug("Evaluate all score accountings for course {}", course); CourseEnvironment courseEnv = course.getCourseEnvironment(); + RepositoryEntry courseEntry = courseEnv.getCourseGroupManager().getCourseEntry(); CoursePropertyManager pm = courseEnv.getCoursePropertyManager(); + + Set<Identity> identities = new HashSet<>(); 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; - for(Identity assessedIdentity: assessedIdentities) { - evaluateAll(courseEnv, assessedIdentity); - log.debug("Evaluated score accounting in course {} for {}", course, assessedIdentity); + for(Identity identity: identities) { + evaluateAll(courseEnv, identity); + log.debug("Evaluated score accounting in course {} for {}", course, identity); if(++count % 10 == 0) { DBFactory.getInstance().commitAndCloseSession(); } diff --git a/src/main/java/org/olat/upgrade/OLATUpgrade_15_pre_0.java b/src/main/java/org/olat/upgrade/OLATUpgrade_15_pre_0.java new file mode 100644 index 0000000000000000000000000000000000000000..3b28bb575876d08f362fb2064a1ce7a8353a8ad6 --- /dev/null +++ b/src/main/java/org/olat/upgrade/OLATUpgrade_15_pre_0.java @@ -0,0 +1,203 @@ +/** + * <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."); + } + +} diff --git a/src/main/java/org/olat/upgrade/_spring/upgradeContext.xml b/src/main/java/org/olat/upgrade/_spring/upgradeContext.xml index 41caa9939e29024b5522b5b12ca5de9fb1a6427d..fe20eb327e2851641c31f351ad9b25d09acc9b41 100644 --- a/src/main/java/org/olat/upgrade/_spring/upgradeContext.xml +++ b/src/main/java/org/olat/upgrade/_spring/upgradeContext.xml @@ -53,6 +53,7 @@ <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_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> </property> </bean>