From 1667c398521c5d936e15f8e3ccbd10dcdc59ec8b Mon Sep 17 00:00:00 2001
From: srosse <stephane.rosse@frentix.com>
Date: Thu, 22 Aug 2019 21:24:37 +0200
Subject: [PATCH] OO-4199: count binders as references of template, show infos
 callout

---
 .../modules/portfolio/PortfolioService.java   |  6 ++++++
 .../modules/portfolio/manager/BinderDAO.java  | 15 +++++++++++++++
 .../manager/PortfolioServiceImpl.java         |  5 +++++
 .../_i18n/LocalStrings_de.properties          |  1 +
 .../_i18n/LocalStrings_en.properties          |  1 +
 .../_i18n/LocalStrings_fr.properties          |  3 ++-
 .../manager/RepositoryEntryAuthorQueries.java | 19 +++++++++++++++----
 ...SearchAuthorRepositoryEntryViewParams.java |  4 ++++
 .../ui/author/AuthorListController.java       | 12 ++++++++++++
 .../ui/author/_content/references.html        | 10 ++++++++--
 10 files changed, 69 insertions(+), 7 deletions(-)

diff --git a/src/main/java/org/olat/modules/portfolio/PortfolioService.java b/src/main/java/org/olat/modules/portfolio/PortfolioService.java
index 3420bf7cc1f..8b23a07447e 100644
--- a/src/main/java/org/olat/modules/portfolio/PortfolioService.java
+++ b/src/main/java/org/olat/modules/portfolio/PortfolioService.java
@@ -353,6 +353,12 @@ public interface PortfolioService {
 	 */
 	public boolean isTemplateInUse(Binder template, RepositoryEntry courseEntry, String subIdent);
 	
+	/**
+	 * @param templateEntry The resource of the template
+	 * @return The number of binder which copy this template
+	 */
+	public int getTemplateUsage(RepositoryEntryRef templateEntry);
+	
 	public Binder assignBinder(Identity owner, BinderRef templateBinder, RepositoryEntry entry, String subIdent, Date deadline);
 	
 	public SynchedBinder loadAndSyncBinder(BinderRef binder);
diff --git a/src/main/java/org/olat/modules/portfolio/manager/BinderDAO.java b/src/main/java/org/olat/modules/portfolio/manager/BinderDAO.java
index b64ddf63351..89184885b84 100644
--- a/src/main/java/org/olat/modules/portfolio/manager/BinderDAO.java
+++ b/src/main/java/org/olat/modules/portfolio/manager/BinderDAO.java
@@ -779,6 +779,21 @@ public class BinderDAO {
 		return binderKeys != null && !binderKeys.isEmpty() && binderKeys.get(0) != null && binderKeys.get(0).longValue() >= 0;
 	}
 	
+	public int getTemplateUsage(RepositoryEntryRef templateEntry) {
+		StringBuilder sb = new StringBuilder(128);
+		sb.append("select count(binder.key) from pfbinder as binder")
+		  .append(" inner join binder.template as template")
+		  .append(" inner join template.olatResource as res")
+		  .append(" inner join repositoryentry as v on (res.key=v.olatResource.key)")
+		  .append(" where v.key=:entryKey");
+		
+		List<Long> counter = dbInstance.getCurrentEntityManager()
+			.createQuery(sb.toString(), Long.class)
+			.setParameter("entryKey", templateEntry.getKey())
+			.getResultList();
+		return counter == null || counter.isEmpty() || counter.get(0) == null ? 0 : counter.get(0).intValue();
+	}
+	
 	public Binder getBinder(Identity owner, BinderRef template, RepositoryEntryRef entry, String subIdent) {
 		StringBuilder sb = new StringBuilder();
 		sb.append("select binder from pfbinder as binder")
diff --git a/src/main/java/org/olat/modules/portfolio/manager/PortfolioServiceImpl.java b/src/main/java/org/olat/modules/portfolio/manager/PortfolioServiceImpl.java
index 826483dd527..ea691c70cf6 100644
--- a/src/main/java/org/olat/modules/portfolio/manager/PortfolioServiceImpl.java
+++ b/src/main/java/org/olat/modules/portfolio/manager/PortfolioServiceImpl.java
@@ -663,6 +663,11 @@ public class PortfolioServiceImpl implements PortfolioService {
 	public boolean isTemplateInUse(Binder binder, RepositoryEntry courseEntry, String subIdent) {
 		return binderDao.isTemplateInUse(binder, courseEntry, subIdent);
 	}
+	
+	@Override
+	public int getTemplateUsage(RepositoryEntryRef templateEntry) {
+		return binderDao.getTemplateUsage(templateEntry);
+	}
 
 	@Override
 	public Binder getBinder(Identity owner, BinderRef templateBinder, RepositoryEntryRef courseEntry, String subIdent) {
diff --git a/src/main/java/org/olat/repository/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/repository/_i18n/LocalStrings_de.properties
index bb59aaec5f8..44a8e4f6768 100644
--- a/src/main/java/org/olat/repository/_i18n/LocalStrings_de.properties
+++ b/src/main/java/org/olat/repository/_i18n/LocalStrings_de.properties
@@ -316,6 +316,7 @@ details.read.only.acknowledge=Best\u00E4tigung
 details.read.only.acknowledge.error=Bitte best\u00E4tigen.
 details.read.only.acknowledge.msg=Alle Kursbausteine inklusive Tests, Foren etc. befinden sich im Lesemodus und k\u00F6nnen nicht mehr bearbeitet werden.
 details.referenceinfo=Referenzen
+details.referenceinfo.binder.template=Anzhal Mappe die dieser Vorlage verwenden\: {0}
 details.referenceinfo.data.collections=Anzahl Datenerhebungen\: {0}
 details.referenceinfo.txt=Wird in folgenden Kursen eingesetzt\:
 details.referenceinfoheader=Information zur Verwendung
diff --git a/src/main/java/org/olat/repository/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/repository/_i18n/LocalStrings_en.properties
index 4309539f1c3..0b5f07b2f0d 100644
--- a/src/main/java/org/olat/repository/_i18n/LocalStrings_en.properties
+++ b/src/main/java/org/olat/repository/_i18n/LocalStrings_en.properties
@@ -316,6 +316,7 @@ details.read.only.acknowledge=Confirmation
 details.read.only.acknowledge.error=Please confirm.
 details.read.only.acknowledge.msg=All course elements inclusive tests... will be in read only mode and cannot be edited anymore.
 details.referenceinfo=References
+details.referenceinfo.binder.template=Number of binders using this template\: {0}
 details.referenceinfo.data.collections=Number of data collections\: {0}
 details.referenceinfo.txt=Used in the following courses\:
 details.referenceinfoheader=Information on usage
diff --git a/src/main/java/org/olat/repository/_i18n/LocalStrings_fr.properties b/src/main/java/org/olat/repository/_i18n/LocalStrings_fr.properties
index d8a6b075808..12cd316973b 100644
--- a/src/main/java/org/olat/repository/_i18n/LocalStrings_fr.properties
+++ b/src/main/java/org/olat/repository/_i18n/LocalStrings_fr.properties
@@ -307,7 +307,7 @@ details.notypeinfo=Aucune information typologique disponible
 details.openeditor=Editer
 details.options=Options
 details.orders=R\u00E9servations
-details.override.close=Ouvrir et passer outre "lecture seul"
+details.override.close=Ouvrir et ignorer "lecture seule"
 details.overview=Aper\u00E7u
 details.owner=Propri\u00E9taire d'une ressource didactique
 details.personal=Mes donn\u00E9es
@@ -316,6 +316,7 @@ details.read.only.acknowledge=Confirmation
 details.read.only.acknowledge.error=Confirmer s'il vous pla\u00EEt.
 details.read.only.acknowledge.msg=Tous les \u00E9l\u00E9ments de cours, tests inclus, seront en mode lecture seule et ne pourront plus \u00EAtre \u00E9dit\u00E9s.
 details.referenceinfo=R\u00E9f\u00E9rences
+details.referenceinfo.binder.template=Nombre de classeurs utilisant ce mod\u00E8le\: {0}
 details.referenceinfo.data.collections=Nombre de collectes de donn\u00E9es\: {0}
 details.referenceinfo.txt=Utilis\u00E9 par les cours suivants\:
 details.referenceinfoheader=Informations sur l'application
diff --git a/src/main/java/org/olat/repository/manager/RepositoryEntryAuthorQueries.java b/src/main/java/org/olat/repository/manager/RepositoryEntryAuthorQueries.java
index 9e3ab52fff4..ab366ec0436 100644
--- a/src/main/java/org/olat/repository/manager/RepositoryEntryAuthorQueries.java
+++ b/src/main/java/org/olat/repository/manager/RepositoryEntryAuthorQueries.java
@@ -112,11 +112,14 @@ public class RepositoryEntryAuthorQueries {
 			Number numOfReferences = (Number)object[3];
 			int references = numOfReferences == null ? 0 : numOfReferences.intValue();
 			
+			Number numOfBinders = (Number)object[4];
+			references += numOfBinders == null ? 0 : numOfBinders.intValue();
+
 			boolean lectureEnabled = false;
 			boolean rollCallEnabled = false;
-			if(object.length > 4) {
-				lectureEnabled = PersistenceHelper.extractBoolean(object, 4, false);
-				rollCallEnabled = PersistenceHelper.extractBoolean(object, 5, false);
+			if(object.length > 5) {
+				lectureEnabled = PersistenceHelper.extractBoolean(object, 5, false);
+				rollCallEnabled = PersistenceHelper.extractBoolean(object, 6, false);
 			}
 			
 			String deletedByName = null;
@@ -161,7 +164,15 @@ public class RepositoryEntryAuthorQueries {
 			  .append(" ) as offers,")
 			  .append(" (select count(ref.key) from references as ref ")
 			  .append("   where ref.target.key=res.key")
-			  .append(" ) as references");
+			  .append(" ) as references,");
+			if(params.includeResourceType("BinderTemplate")) {
+				sb.append(" (select count(binder.key) from pfbinder as binder")
+				  .append("   inner join binder.template as template")
+				  .append("   where res.resName='BinderTemplate' and res.key=template.olatResource.key")
+				  .append(" ) as binders");
+			} else {
+				sb.append(" 0 as binders");
+			}
 			if(lectureModule.isEnabled()) {
 				sb.append(", lectureConfig.lectureEnabled")
 				  .append(", case when lectureConfig.rollCallEnabled=true then true else ").append(lectureModule.isRollCallDefaultEnabled()).append(" end as rollCallEnabled");
diff --git a/src/main/java/org/olat/repository/model/SearchAuthorRepositoryEntryViewParams.java b/src/main/java/org/olat/repository/model/SearchAuthorRepositoryEntryViewParams.java
index 5a959e689e3..8159acb57d1 100644
--- a/src/main/java/org/olat/repository/model/SearchAuthorRepositoryEntryViewParams.java
+++ b/src/main/java/org/olat/repository/model/SearchAuthorRepositoryEntryViewParams.java
@@ -132,6 +132,10 @@ public class SearchAuthorRepositoryEntryViewParams {
 		return resourceTypes;
 	}
 	
+	public boolean includeResourceType(String resourceType) {
+		return resourceTypes == null || resourceTypes.contains(resourceType);
+	}
+	
 	public void setResourceTypes(List<String> resourceTypes) {
 		this.resourceTypes = resourceTypes;
 	}
diff --git a/src/main/java/org/olat/repository/ui/author/AuthorListController.java b/src/main/java/org/olat/repository/ui/author/AuthorListController.java
index 8165e395e98..a8925d5fd99 100644
--- a/src/main/java/org/olat/repository/ui/author/AuthorListController.java
+++ b/src/main/java/org/olat/repository/ui/author/AuthorListController.java
@@ -93,6 +93,8 @@ import org.olat.core.util.resource.OresHelper;
 import org.olat.course.CorruptedCourseException;
 import org.olat.course.CourseModule;
 import org.olat.login.LoginModule;
+import org.olat.modules.portfolio.PortfolioService;
+import org.olat.modules.portfolio.handler.BinderTemplateResource;
 import org.olat.modules.quality.QualityDataCollectionLight;
 import org.olat.repository.RepositoryEntry;
 import org.olat.repository.RepositoryEntryManagedFlag;
@@ -1203,6 +1205,8 @@ public class AuthorListController extends FormBasicController implements Activat
 	
 	private class ReferencesController extends BasicController {
 
+		@Autowired
+		private PortfolioService portfolioService;
 		@Autowired
 		private ReferenceManager referenceManager;
 		
@@ -1231,6 +1235,14 @@ public class AuthorListController extends FormBasicController implements Activat
 						new String[] { String.valueOf(references.size()) }));
 			}
 			
+			if(BinderTemplateResource.TYPE_NAME.equals(entry.getOlatResource().getResourceableTypeName())) {
+				int usage = portfolioService.getTemplateUsage(entry);
+				if(usage > 0) {
+					mainVC.contextPut("binderTemplateUsage", translate("details.referenceinfo.binder.template",
+							new String[] { String.valueOf(usage) }));
+				}
+			}
+			
 			putInitialPanel(mainVC);
 		}
 
diff --git a/src/main/java/org/olat/repository/ui/author/_content/references.html b/src/main/java/org/olat/repository/ui/author/_content/references.html
index 3bacd22ac28..27962779291 100644
--- a/src/main/java/org/olat/repository/ui/author/_content/references.html
+++ b/src/main/java/org/olat/repository/ui/author/_content/references.html
@@ -1,6 +1,6 @@
 #if(!$referenceLinks.isEmpty())
 	$r.translate("details.referenceinfo.txt")
-	<ul class="o_dropdown list-unstyled">
+	<ul class="list-unstyled">
 	#foreach($referenceLink in $referenceLinks)
 		<li>$r.render($referenceLink)</li>
 	#end
@@ -10,4 +10,10 @@
 	#if($r.isNotNull($qualityDataCollections))
 		$qualityDataCollections
 	#end
-</div>
\ No newline at end of file
+</div>
+<div class="o_block_small_top">
+	#if($r.isNotNull($binderTemplateUsage))
+		$binderTemplateUsage
+	#end
+</div>
+
-- 
GitLab