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