From 0860b20734e017a9b79f9a8aec1d7f1bacd3dc16 Mon Sep 17 00:00:00 2001
From: hg <none@none>
Date: Tue, 9 May 2017 15:08:45 +0200
Subject: [PATCH] OO-2730 Option to hide user score change log and info button
 in assessable course node

---
 .../java/org/olat/course/CourseModule.java    | 30 +++++-
 .../org/olat/course/_spring/courseContext.xml | 18 ++++
 .../AssessableCourseNodeAdminController.java  | 94 +++++++++++++++++++
 .../_i18n/LocalStrings_de.properties          | 16 +---
 .../_i18n/LocalStrings_en.properties          | 16 +---
 .../nodes/gta/ui/GTAAbstractController.java   |  5 +
 .../course/nodes/gta/ui/_content/run.html     | 25 ++---
 .../olat/course/nodes/iq/IQRunController.java | 13 +++
 .../iq/QTI21AssessmentRunController.java      |  6 ++
 .../nodes/iq/_content/assessment_run.html     | 46 ++++-----
 .../course/nodes/iq/_content/selftestrun.html | 37 ++++----
 .../course/nodes/iq/_content/surveyrun.html   | 25 ++---
 .../course/nodes/iq/_content/testrun.html     | 40 ++++----
 .../nodes/ms/MSCourseNodeRunController.java   |  8 ++
 .../olat/course/nodes/ms/_content/run.html    | 17 ++--
 .../repository/_spring/repositoryContext.xml  |  4 +-
 .../resources/serviceconfig/olat.properties   | 14 ++-
 17 files changed, 296 insertions(+), 118 deletions(-)
 create mode 100644 src/main/java/org/olat/course/assessment/AssessableCourseNodeAdminController.java

diff --git a/src/main/java/org/olat/course/CourseModule.java b/src/main/java/org/olat/course/CourseModule.java
index 791d7ca7f05..b04dac2a84d 100644
--- a/src/main/java/org/olat/course/CourseModule.java
+++ b/src/main/java/org/olat/course/CourseModule.java
@@ -48,6 +48,7 @@ import org.springframework.stereotype.Service;
  * @author Mike Stock
  * @author guido
  * @author Florian Gnägi
+ * @author fkiefer
  */
 @Service
 public class CourseModule extends AbstractSpringModule {
@@ -58,6 +59,10 @@ public class CourseModule extends AbstractSpringModule {
 	private String helpCourseSoftkey;
 	@Autowired @Qualifier("logVisibilityForCourseAuthor")
 	private HashMap<String, String> logVisibilities;
+	@Value("${course.display.infobox}")
+	private boolean displayInfoBox;
+	@Value("${course.display.changelog}")
+	private boolean displayChangeLog;
 	
 	// Repository types
 	public static String ORES_TYPE_COURSE = OresHelper.calculateTypeName(CourseModule.class);
@@ -74,12 +79,13 @@ public class CourseModule extends AbstractSpringModule {
 	
 	@Override
 	protected void initFromChangedProperties() {
-		//
+		displayInfoBox = getBooleanPropertyValue("course.display.infobox");
+		displayChangeLog = getBooleanPropertyValue("course.display.changelog");
 	}
 
 	@Override
 	public void init() {
-		//
+		initFromChangedProperties();
 	}
 	
 	/**
@@ -174,4 +180,24 @@ public class CourseModule extends AbstractSpringModule {
 	public boolean displayParticipantsCount() {
 		return displayParticipantsCount;
 	}
+
+	public boolean isDisplayInfoBox() {
+		return displayInfoBox;
+	}
+
+	public void setDisplayInfoBox(boolean enabled) {
+		this.displayInfoBox = enabled;
+		setBooleanProperty("course.display.infobox", enabled, true);
+	}
+
+	public boolean isDisplayChangeLog() {
+		return displayChangeLog;
+	}
+
+	public void setDisplayChangeLog(boolean enabled) {
+		this.displayChangeLog = enabled;
+		setBooleanProperty("course.display.changelog", enabled, true);
+	}
+	
+	
 }
diff --git a/src/main/java/org/olat/course/_spring/courseContext.xml b/src/main/java/org/olat/course/_spring/courseContext.xml
index 4dd9f94ad41..7407a7b127e 100644
--- a/src/main/java/org/olat/course/_spring/courseContext.xml
+++ b/src/main/java/org/olat/course/_spring/courseContext.xml
@@ -75,5 +75,23 @@
 			</list>
 		</property>
 	</bean>
+		<bean class="org.olat.core.extensions.action.GenericActionExtension" init-method="initExtensionPoints">
+		<property name="order" value="8210" />
+		<property name="actionController">	
+			<bean class="org.olat.core.gui.control.creator.AutoCreator" scope="prototype">
+				<property name="className" value="org.olat.course.assessment.AssessableCourseNodeAdminController"/>
+			</bean>
+		</property>
+		<property name="navigationKey" value="certificates" />
+		<property name="i18nActionKey" value="admin.menu.title"/>
+		<property name="i18nDescriptionKey" value="admin.menu.title.alt"/>
+		<property name="translationPackage" value="org.olat.course.assessment"/>
+		<property name="parentTreeNodeIdentifier" value="modulesParent" /> 
+		<property name="extensionPoints">
+			<list>	
+				<value>org.olat.admin.SystemAdminMainController</value>		
+			</list>
+		</property>
+	</bean>
 
 </beans>
\ No newline at end of file
diff --git a/src/main/java/org/olat/course/assessment/AssessableCourseNodeAdminController.java b/src/main/java/org/olat/course/assessment/AssessableCourseNodeAdminController.java
new file mode 100644
index 00000000000..af59f466f78
--- /dev/null
+++ b/src/main/java/org/olat/course/assessment/AssessableCourseNodeAdminController.java
@@ -0,0 +1,94 @@
+/**
+ * <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.assessment;
+
+import org.olat.core.gui.UserRequest;
+import org.olat.core.gui.components.form.flexible.FormItem;
+import org.olat.core.gui.components.form.flexible.FormItemContainer;
+import org.olat.core.gui.components.form.flexible.elements.MultipleSelectionElement;
+import org.olat.core.gui.components.form.flexible.impl.FormBasicController;
+import org.olat.core.gui.components.form.flexible.impl.FormEvent;
+import org.olat.core.gui.control.Controller;
+import org.olat.core.gui.control.WindowControl;
+import org.olat.course.CourseModule;
+import org.springframework.beans.factory.annotation.Autowired;
+/**
+ * 
+ * Initial date: 08.05.2017<br>
+ * @author fkiefer
+ *
+ */
+public class AssessableCourseNodeAdminController extends FormBasicController {
+	
+	private static final String[] onKeys = new String[]{ "on" };
+	private final String[] onValues;
+	
+	private MultipleSelectionElement infoBoxEl, changeLogEl;
+
+	@Autowired
+	private CourseModule courseModule;
+	
+	public AssessableCourseNodeAdminController(UserRequest ureq, WindowControl wControl) {
+		super(ureq, wControl);
+		
+		onValues = new String[]{ translate("on") };
+
+		initForm(ureq);
+	}
+
+	@Override
+	protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) {
+	    setFormTitle("admin.assessable.coursenode");
+		
+		infoBoxEl = uifactory.addCheckboxesHorizontal("admin.info.box", formLayout, onKeys, onValues);
+		infoBoxEl.addActionListener(FormEvent.ONCHANGE);
+		if (courseModule.isDisplayInfoBox()) {
+			infoBoxEl.select(onKeys[0], true);
+		}
+		
+		changeLogEl = uifactory.addCheckboxesHorizontal("admin.user.changelog", formLayout, onKeys, onValues);
+		changeLogEl.addActionListener(FormEvent.ONCHANGE);
+		if (courseModule.isDisplayChangeLog()) {
+			changeLogEl.select(onKeys[0], true);
+		}
+
+	}
+	
+	@Override
+	protected void formInnerEvent(UserRequest ureq, FormItem source, FormEvent event) {
+		if (source == infoBoxEl) {
+			courseModule.setDisplayInfoBox(infoBoxEl.isSelected(0));
+		} else if (source == changeLogEl) {
+			courseModule.setDisplayChangeLog(changeLogEl.isSelected(0));
+		}	
+		super.formInnerEvent(ureq, source, event);
+	}
+
+	@Override
+	protected void formOK(UserRequest ureq) {
+		// nothing
+	}
+
+	@Override
+	protected void doDispose() {
+		// nothing
+	}
+
+}
diff --git a/src/main/java/org/olat/course/assessment/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/course/assessment/_i18n/LocalStrings_de.properties
index 5ec603b7213..50cc2a9899a 100644
--- a/src/main/java/org/olat/course/assessment/_i18n/LocalStrings_de.properties
+++ b/src/main/java/org/olat/course/assessment/_i18n/LocalStrings_de.properties
@@ -1,17 +1,11 @@
 #Mon Mar 02 09:54:04 CET 2009
 action.choose=Select 
 artefact.title=Leistungsnachweis f\u00FCr Kurs {0}
-
-
-
-
-
-
-
-
-
-
-
+admin.menu.title=Kurs
+admin.menu.title.alt=$\:admin.menu.title Einstellungen
+admin.info.box=Infobox beim Start anzeigen
+admin.user.changelog=Bewertungsverlauf dem Benutzer anzeigen
+admin.assessable.coursenode=Einstellungen f\u00FCr bewertbare Kursbausteine
 cmd.all.users=Alle Benutzer anzeigen
 cmd.filterCourseNodes=Von mir bewertbare Kursbausteine anzeigen
 cmd.filterGroups=Von mir betreute Gruppen mit Zugriff auf gew\u00E4hlten Kursbaustein
diff --git a/src/main/java/org/olat/course/assessment/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/course/assessment/_i18n/LocalStrings_en.properties
index bad2ea244b2..7264f5a74bd 100644
--- a/src/main/java/org/olat/course/assessment/_i18n/LocalStrings_en.properties
+++ b/src/main/java/org/olat/course/assessment/_i18n/LocalStrings_en.properties
@@ -3,17 +3,11 @@ action.choose=Select
 artefact.title=Evidence of achievement for course {0}
 assessment.testresults.finished=<font color\="green">Assessment completed</font>
 assessment.testresults.open=<font color\="orange">Assessment pending</font>
-
-
-
-
-
-
-
-
-
-
-
+admin.menu.title=Course
+admin.menu.title.alt=$\:admin.menu.title settings
+admin.info.box=Show info box on start
+admin.user.changelog=Show assessment changelog to user
+admin.assessable.coursenode=Settings for assessable course elements
 cmd.all.users=Show all users
 cmd.filterCourseNodes=Show assessable course elements
 cmd.filterGroups=Supervised groups with access to selected course element
diff --git a/src/main/java/org/olat/course/nodes/gta/ui/GTAAbstractController.java b/src/main/java/org/olat/course/nodes/gta/ui/GTAAbstractController.java
index 06a8faa7efb..d2cf903fb61 100644
--- a/src/main/java/org/olat/course/nodes/gta/ui/GTAAbstractController.java
+++ b/src/main/java/org/olat/course/nodes/gta/ui/GTAAbstractController.java
@@ -41,6 +41,7 @@ import org.olat.core.util.coordinate.CoordinatorManager;
 import org.olat.core.util.event.GenericEventListener;
 import org.olat.core.util.resource.OresHelper;
 import org.olat.course.CourseFactory;
+import org.olat.course.CourseModule;
 import org.olat.course.ICourse;
 import org.olat.course.assessment.AssessmentHelper;
 import org.olat.course.assessment.manager.UserCourseInformationsManager;
@@ -109,6 +110,8 @@ public abstract class GTAAbstractController extends BasicController implements G
 	protected BusinessGroupService businessGroupService;
 	@Autowired
 	protected UserCourseInformationsManager userCourseInformationsManager;
+	@Autowired
+	protected CourseModule courseModule;
 	
 	public GTAAbstractController(UserRequest ureq, WindowControl wControl,
 			GTACourseNode gtaNode, CourseEnvironment courseEnv, boolean withTitle, boolean withGrading, boolean withSubscription) {
@@ -242,6 +245,8 @@ public abstract class GTAAbstractController extends BasicController implements G
 			task = gtaManager.nextStep(task, gtaNode);
 		}
 		
+		mainVC.contextPut("changelogconfig", courseModule.isDisplayChangeLog());
+		
 		nodeLog();
 		collapsedContents(task);
 	}
diff --git a/src/main/java/org/olat/course/nodes/gta/ui/_content/run.html b/src/main/java/org/olat/course/nodes/gta/ui/_content/run.html
index 4b839628161..4e5c2747cba 100644
--- a/src/main/java/org/olat/course/nodes/gta/ui/_content/run.html
+++ b/src/main/java/org/olat/course/nodes/gta/ui/_content/run.html
@@ -183,16 +183,17 @@
 #if ($r.available("highScore"))
 	$r.render("highScore")
 #end
-
-#if($userLog || $groupLog)
-<div class="o_box">
-    #o_togglebox_start("o_course_run_log" $r.translate("log.title"))
-	#if($groupLog)
-    <pre class="small">$groupLog</pre>
-    #end
-    #if($userLog)
-    <pre class="small">$userLog</pre>
-    #end
-    #o_togglebox_end()
-</div>
+#if ($changelogconfig)
+	#if($userLog || $groupLog)
+	<div class="o_box">
+	    #o_togglebox_start("o_course_run_log" $r.translate("log.title"))
+		#if($groupLog)
+	    <pre class="small">$groupLog</pre>
+	    #end
+	    #if($userLog)
+	    <pre class="small">$userLog</pre>
+	    #end
+	    #o_togglebox_end()
+	</div>
+	#end
 #end
\ No newline at end of file
diff --git a/src/main/java/org/olat/course/nodes/iq/IQRunController.java b/src/main/java/org/olat/course/nodes/iq/IQRunController.java
index ba6396759bd..9836e183401 100644
--- a/src/main/java/org/olat/course/nodes/iq/IQRunController.java
+++ b/src/main/java/org/olat/course/nodes/iq/IQRunController.java
@@ -63,6 +63,7 @@ import org.olat.core.util.event.GenericEventListener;
 import org.olat.core.util.resource.OresHelper;
 import org.olat.core.util.vfs.VFSContainer;
 import org.olat.course.CourseFactory;
+import org.olat.course.CourseModule;
 import org.olat.course.DisposedCourseRestartController;
 import org.olat.course.ICourse;
 import org.olat.course.assessment.AssessmentHelper;
@@ -138,6 +139,8 @@ public class IQRunController extends BasicController implements GenericEventList
 	private IQManager iqManager;
 	@Autowired
 	private AssessmentNotificationsHandler assessmentNotificationsHandler;
+	@Autowired
+	private CourseModule courseModule;
 	
 	/**
 	 * Constructor for a test run controller
@@ -193,6 +196,10 @@ public class IQRunController extends BasicController implements GenericEventList
 	  //if show results on test home page configured - show log
 		Boolean showResultOnHomePage = testCourseNode.getModuleConfiguration().getBooleanEntry(IQEditController.CONFIG_KEY_RESULT_ON_HOME_PAGE);		
 		myContent.contextPut("showChangelog", showResultOnHomePage);
+
+		//admin setting whether to show change log and info box or not
+		myContent.contextPut("infobox", courseModule.isDisplayInfoBox());
+		myContent.contextPut("changelogconfig", courseModule.isDisplayChangeLog());
 	}
 
 	/**
@@ -279,6 +286,9 @@ public class IQRunController extends BasicController implements GenericEventList
 		}
 		//per default change log is not open
 		myContent.contextPut("showChangelog", Boolean.FALSE);
+		//admin setting whether to show change log and info box or not
+		myContent.contextPut("infobox", courseModule.isDisplayInfoBox());
+		myContent.contextPut("changelogconfig", courseModule.isDisplayChangeLog());
 	}
 
 	/**
@@ -322,6 +332,9 @@ public class IQRunController extends BasicController implements GenericEventList
 		}
 		//per default change log is not open
 		myContent.contextPut("showChangelog", Boolean.FALSE);
+		//admin setting whether to show change log and info box or not
+		myContent.contextPut("infobox", courseModule.isDisplayInfoBox());
+		myContent.contextPut("changelogconfig", courseModule.isDisplayChangeLog());
 	}
 
 	
diff --git a/src/main/java/org/olat/course/nodes/iq/QTI21AssessmentRunController.java b/src/main/java/org/olat/course/nodes/iq/QTI21AssessmentRunController.java
index d424995e395..37eb2f76eef 100644
--- a/src/main/java/org/olat/course/nodes/iq/QTI21AssessmentRunController.java
+++ b/src/main/java/org/olat/course/nodes/iq/QTI21AssessmentRunController.java
@@ -53,6 +53,7 @@ import org.olat.core.util.event.GenericEventListener;
 import org.olat.core.util.mail.MailBundle;
 import org.olat.core.util.resource.OresHelper;
 import org.olat.core.util.vfs.VFSContainer;
+import org.olat.course.CourseModule;
 import org.olat.course.DisposedCourseRestartController;
 import org.olat.course.assessment.AssessmentHelper;
 import org.olat.course.assessment.AssessmentManager;
@@ -126,6 +127,8 @@ public class QTI21AssessmentRunController extends BasicController implements Gen
 	
 	@Autowired
 	private QTI21Service qtiService;
+	@Autowired
+	private CourseModule courseModule;
 	
 	public QTI21AssessmentRunController(UserRequest ureq, WindowControl wControl,
 			UserCourseEnvironment userCourseEnv, QTICourseNode courseNode) {
@@ -143,6 +146,9 @@ public class QTI21AssessmentRunController extends BasicController implements Gen
 						
 		addLoggingResourceable(LoggingResourceable.wrap(courseNode));
 		
+		mainVC.contextPut("infobox", courseModule.isDisplayInfoBox());
+		mainVC.contextPut("changelogconfig", courseModule.isDisplayChangeLog());
+		
 		if(courseNode instanceof IQTESTCourseNode) {
 			mainVC.contextPut("type", "test");
 		} else if(courseNode instanceof IQSELFCourseNode) {
diff --git a/src/main/java/org/olat/course/nodes/iq/_content/assessment_run.html b/src/main/java/org/olat/course/nodes/iq/_content/assessment_run.html
index 6305ce0af90..0f007e01b8e 100644
--- a/src/main/java/org/olat/course/nodes/iq/_content/assessment_run.html
+++ b/src/main/java/org/olat/course/nodes/iq/_content/assessment_run.html
@@ -151,28 +151,32 @@
   		</div></div>
 	</div>
 	#end
-	
-	#if($type == "test")
-	<div class="o_statusinfo">
-		<p>$r.translate("Intro.test")</p>
-		<p>$r.translate("info.assessment")</p>
-		#if ($hasChatWindowOpen)
-		<p>$r.translate("close.chat.windows.for.test")</p>
+
+	#if($infobox)	
+		#if($type == "test")
+		<div class="o_statusinfo">
+			<p>$r.translate("Intro.test")</p>
+			<p>$r.translate("info.assessment")</p>
+			#if ($hasChatWindowOpen)
+			<p>$r.translate("close.chat.windows.for.test")</p>
+			#end
+		</div>
+		#elseif($type == "self")
+		<div class="o_statusinfo">
+			<p>$r.translate("Intro.self")</p>
+			<p>$r.translate("info.selfassessment")</p>
+		</div>
 		#end
-	</div>
-	#elseif($type == "self")
-	<div class="o_statusinfo">
-		<p>$r.translate("Intro.self")</p>
-		<p>$r.translate("info.selfassessment")</p>
-	</div>
-	#end
-	
+	#end	
 	<div class="o_button_group">$r.render("start")</div>
 #end
-#if($r.isNotNull($log) && $r.isNotNull($showChangeLog) && $showChangeLog)
-<div class="o_box">
-    #o_togglebox_start("o_course_run_log" $r.translate("log.title"))
-    <pre class="small">$log</pre>
-    #o_togglebox_end()
-</div>    
+#if($changelogconfig)
+	#if($r.isNotNull($log) && $r.isNotNull($showChangeLog) && $showChangeLog)
+	<div class="o_box">
+	    #o_togglebox_start("o_course_run_log" $r.translate("log.title"))
+	    <pre class="small">$log</pre>
+	    #o_togglebox_end()
+	</div>    
+	#end
 #end
+
diff --git a/src/main/java/org/olat/course/nodes/iq/_content/selftestrun.html b/src/main/java/org/olat/course/nodes/iq/_content/selftestrun.html
index 71f2f3f9254..1b0f8f3b1e7 100644
--- a/src/main/java/org/olat/course/nodes/iq/_content/selftestrun.html
+++ b/src/main/java/org/olat/course/nodes/iq/_content/selftestrun.html
@@ -116,26 +116,27 @@
  		</div>
 </div>
 #end
-
-<div class="o_statusinfo">
-	<p>
-		$r.translate("Intro.self")
-	</p>
-	<p>	
-		$r.translate("info.selfassessment")
-	</p>
-</div>
-		
+#if ($infobox)		
+	<div class="o_statusinfo">
+		<p>
+			$r.translate("Intro.self")
+		</p>
+		<p>	
+			$r.translate("info.selfassessment")
+		</p>
+	</div>
+#end		
 <div class="o_button_group">
 	$r.render("start")
 </div>	
-	
-#if($changeLog)
-<div class="o_box">
-	#o_togglebox_start("o_course_run_changelog" $r.translate("changelog.title"))
-    <pre class="small">	
+#if ($changelogconfig)		
+	#if($changeLog)
+	<div class="o_box">
+		#o_togglebox_start("o_course_run_changelog" $r.translate("changelog.title"))
+	    <pre class="small">	
 $changeLog
-	</pre>
-	#o_togglebox_end()
-</div>
+		</pre>
+		#o_togglebox_end()
+	</div>
+	#end
 #end
\ No newline at end of file
diff --git a/src/main/java/org/olat/course/nodes/iq/_content/surveyrun.html b/src/main/java/org/olat/course/nodes/iq/_content/surveyrun.html
index 244267d6eb5..876954b23dc 100644
--- a/src/main/java/org/olat/course/nodes/iq/_content/surveyrun.html
+++ b/src/main/java/org/olat/course/nodes/iq/_content/surveyrun.html
@@ -9,8 +9,8 @@
 	</div>
 #end
 	
-	
 #if ($attempts == 0)
+	#if ($infobox)			
 	<div class="o_statusinfo">
 		<p>
 			$r.translate("Intro.surv")	
@@ -19,6 +19,7 @@
 			$r.translate("info.survey")
 		</p>
 	</div>
+	#end
 			
 	<div class="o_button_group">
 		$r.render("start")
@@ -28,17 +29,19 @@
 		$r.translate("info.survey.alreadydone")
 	</div>
 #end
-	
-	
-#if($changeLog)
-<div class="o_box">
-	#o_togglebox_start("o_course_run_changelog" $r.translate("changelog.title"))
-	<pre class="small">
+
+#if ($changelogconfig)			
+	#if($changeLog)
+	<div class="o_box">
+		#o_togglebox_start("o_course_run_changelog" $r.translate("changelog.title"))
+		<pre class="small">
 $changeLog
-	</pre>
-	#o_togglebox_end()
-</div>
-#end
+		</pre>
+		#o_togglebox_end()
+	</div>
+	#end
+#end	
+	
 #if ($r.available("highScore"))
 	$r.render("highScore")
 #end
\ No newline at end of file
diff --git a/src/main/java/org/olat/course/nodes/iq/_content/testrun.html b/src/main/java/org/olat/course/nodes/iq/_content/testrun.html
index 2c663d744df..56c8f366604 100644
--- a/src/main/java/org/olat/course/nodes/iq/_content/testrun.html
+++ b/src/main/java/org/olat/course/nodes/iq/_content/testrun.html
@@ -166,7 +166,7 @@
   		</div></div>
 	</div>
 	#end
-		
+	#if ($infobox)		
 	<div class="o_statusinfo">
 		<p>
 		$r.translate("Intro.test")
@@ -180,7 +180,7 @@
 		</p>
 		#end
 	</div>
-		
+	#end		
 	<div class="o_button_group">
 		$r.render("start")
 	</div>
@@ -196,23 +196,25 @@
 			})
 		/* ]]> */
 	</script>
-
-#if ($log && $showChangelog)
-<div class="o_box">
-    #o_togglebox_start("o_course_run_log" $r.translate("log.title"))
-    <pre class="small">
+	
+#if ($changelogconfig)
+	#if ($log && $showChangelog)
+	<div class="o_box">
+	    #o_togglebox_start("o_course_run_log" $r.translate("log.title"))
+	    <pre class="small">
 $log
-    </pre>
-    #o_togglebox_end()
-</div>    
-#end
-    
-#if($changeLog)
-<div class="o_box">
-    #o_togglebox_start("o_course_run_changelog" $r.translate("changelog.title"))
-    <pre class="small">
+	    </pre>
+	    #o_togglebox_end()
+	</div>    
+	#end
+	    
+	#if($changeLog)
+	<div class="o_box">
+	    #o_togglebox_start("o_course_run_changelog" $r.translate("changelog.title"))
+	    <pre class="small">
 $changeLog
-    </pre>
-    #o_togglebox_end()
-</div>
+	    </pre>
+	    #o_togglebox_end()
+	</div>
+	#end
 #end
diff --git a/src/main/java/org/olat/course/nodes/ms/MSCourseNodeRunController.java b/src/main/java/org/olat/course/nodes/ms/MSCourseNodeRunController.java
index b7959e281d2..3ed0f26a420 100644
--- a/src/main/java/org/olat/course/nodes/ms/MSCourseNodeRunController.java
+++ b/src/main/java/org/olat/course/nodes/ms/MSCourseNodeRunController.java
@@ -34,6 +34,7 @@ import org.olat.core.gui.control.controller.BasicController;
 import org.olat.core.util.Formatter;
 import org.olat.core.util.StringHelper;
 import org.olat.core.util.Util;
+import org.olat.course.CourseModule;
 import org.olat.course.assessment.AssessmentHelper;
 import org.olat.course.auditing.UserNodeAuditManager;
 import org.olat.course.highscore.ui.HighScoreRunController;
@@ -44,6 +45,7 @@ import org.olat.course.nodes.PersistentAssessableCourseNode;
 import org.olat.course.run.userview.UserCourseEnvironment;
 import org.olat.modules.ModuleConfiguration;
 import org.olat.modules.assessment.AssessmentEntry;
+import org.springframework.beans.factory.annotation.Autowired;
 
 /**
  * Initial Date:  Jun 16, 2004
@@ -55,6 +57,9 @@ public class MSCourseNodeRunController extends BasicController {
 	private final boolean showLog;
 	private boolean hasScore, hasPassed, hasComment;
 	private final boolean overrideUserResultsVisiblity;
+	
+	@Autowired
+	private CourseModule courseModule;
 
 	/**
 	 * Constructor for a manual scoring course run controller
@@ -113,6 +118,9 @@ public class MSCourseNodeRunController extends BasicController {
 				myContent.contextPut("hasObjectives", learningObj); // dummy value, just an exists operator					
 			}
 		} 
+		
+		//admin setting whether to show change log or not
+		myContent.contextPut("changelogconfig", courseModule.isDisplayChangeLog());
 
 		// Push variables to velcity page
 		exposeConfigToVC(config);		
diff --git a/src/main/java/org/olat/course/nodes/ms/_content/run.html b/src/main/java/org/olat/course/nodes/ms/_content/run.html
index a30e353d90d..6ca131639f1 100644
--- a/src/main/java/org/olat/course/nodes/ms/_content/run.html
+++ b/src/main/java/org/olat/course/nodes/ms/_content/run.html
@@ -106,13 +106,14 @@
 #if ($r.available("highScore"))
 	$r.render("highScore")
 #end
-
-#if($log)
-<div class="o_box">
-    #o_togglebox_start("o_course_run_log" $r.translate("log.title"))
-    <pre class="small">
+#if ($changelogconfig)
+	#if($log)
+	<div class="o_box">
+	    #o_togglebox_start("o_course_run_log" $r.translate("log.title"))
+	    <pre class="small">
 $log
-    </pre>
-    #o_togglebox_end()
-</div>
+	    </pre>
+	    #o_togglebox_end()
+	</div>
+	#end
 #end
\ No newline at end of file
diff --git a/src/main/java/org/olat/repository/_spring/repositoryContext.xml b/src/main/java/org/olat/repository/_spring/repositoryContext.xml
index beff3aea2c9..42418ac70ce 100644
--- a/src/main/java/org/olat/repository/_spring/repositoryContext.xml
+++ b/src/main/java/org/olat/repository/_spring/repositoryContext.xml
@@ -43,7 +43,7 @@
 	
 	<!-- Catalog admin. panel -->
 	<bean class="org.olat.core.extensions.action.GenericActionExtension" init-method="initExtensionPoints">
-		<property name="order" value="8209" />
+		<property name="order" value="8211" />
 		<property name="actionController">	
 			<bean class="org.olat.core.gui.control.creator.AutoCreator" scope="prototype">
 				<property name="className" value="org.olat.repository.ui.admin.CatalogAdminController"/>
@@ -63,7 +63,7 @@
 	
 	<!-- Repository admin. panel -->
 	<bean class="org.olat.core.extensions.action.GenericActionExtension" init-method="initExtensionPoints">
-		<property name="order" value="8210" />
+		<property name="order" value="8212" />
 		<property name="navigationKey" value="repositoryAdmin" />
 		<property name="actionController">	
 			<bean class="org.olat.core.gui.control.creator.AutoCreator" scope="prototype">
diff --git a/src/main/resources/serviceconfig/olat.properties b/src/main/resources/serviceconfig/olat.properties
index 27a00091f99..9c28ad05743 100644
--- a/src/main/resources/serviceconfig/olat.properties
+++ b/src/main/resources/serviceconfig/olat.properties
@@ -612,9 +612,6 @@ velocity.parser.pool.size.comment=20 is Velocity default value, use more when yo
 # of the instant messaging / chat infrastructure is done in the admin GUI
 instantMessaging.enable=true
 
-#whether to display current course participant count in the course toolbox
-course.display.participants.count=true
-
 ########################################################################
 # Calendar
 ########################################################################
@@ -1096,6 +1093,17 @@ paypal.sandbox.values=true,false
 paypal.data.format=XML
 paypal.data.format.values=XML,JSON,SOAP11
 
+########################################
+# Course specific settings
+########################################
+
+#whether to display current course participant count in the course toolbox
+course.display.participants.count=true
+#whether to display infobox on assessable coursenodes
+course.display.infobox=true
+#whether to display changelog on assessable coursenodes
+course.display.changelog=true
+
 ########################################
 # Course building blocks, every course building block can be disabled by adding a property here and reference it in
 # appropriate spring config file (by default are course bb are enabled)
-- 
GitLab