diff --git a/src/main/java/org/olat/group/manager/BusinessGroupDAO.java b/src/main/java/org/olat/group/manager/BusinessGroupDAO.java index 47134e92332a49dfb844197e0968e1c5eff1b4a5..5ac7de6ee68992e0988b8e4b8e758466000cb41a 100644 --- a/src/main/java/org/olat/group/manager/BusinessGroupDAO.java +++ b/src/main/java/org/olat/group/manager/BusinessGroupDAO.java @@ -169,6 +169,17 @@ public class BusinessGroupDAO { return groups == null || groups.isEmpty() ? null : groups.get(0); } + public String loadDescription(Long key) { + StringBuilder sb = new StringBuilder(); + sb.append("select bgi.description from businessgroup bgi where bgi.key=:key"); + List<String> descriptions = dbInstance.getCurrentEntityManager() + .createQuery(sb.toString(), String.class) + .setParameter("key", key) + .setHint("org.hibernate.cacheable", Boolean.TRUE) + .getResultList(); + return descriptions == null || descriptions.isEmpty() ? null : descriptions.get(0); + } + public List<BusinessGroupShort> loadShort(Collection<Long> ids) { if(ids == null || ids.isEmpty()) { return Collections.emptyList(); diff --git a/src/main/java/org/olat/group/manager/BusinessGroupMailing.java b/src/main/java/org/olat/group/manager/BusinessGroupMailing.java index bbf8eda8c48b89970a6bad651c767562e42dfc7b..4d558a10663a699d7df3c3f47d60a8220c49e637 100644 --- a/src/main/java/org/olat/group/manager/BusinessGroupMailing.java +++ b/src/main/java/org/olat/group/manager/BusinessGroupMailing.java @@ -19,25 +19,34 @@ */ package org.olat.group.manager; +import java.io.File; +import java.util.Collections; import java.util.List; +import org.apache.velocity.VelocityContext; import org.olat.basesecurity.BaseSecurity; import org.olat.core.CoreSpringFactory; import org.olat.core.id.Identity; import org.olat.core.id.Roles; +import org.olat.core.id.context.BusinessControlFactory; +import org.olat.core.util.StringHelper; +import org.olat.core.util.filter.FilterFactory; import org.olat.core.util.mail.MailBundle; import org.olat.core.util.mail.MailContext; import org.olat.core.util.mail.MailContextImpl; -import org.olat.core.util.mail.MailPackage; import org.olat.core.util.mail.MailManager; +import org.olat.core.util.mail.MailPackage; import org.olat.core.util.mail.MailTemplate; import org.olat.core.util.mail.MailerResult; +import org.olat.group.BusinessGroup; import org.olat.group.BusinessGroupModule; +import org.olat.group.BusinessGroupService; import org.olat.group.BusinessGroupShort; import org.olat.group.model.BusinessGroupMembershipChange; import org.olat.group.model.MembershipModification; import org.olat.group.ui.BGMailHelper; import org.olat.group.ui.main.MemberPermissionChangeEvent; +import org.olat.repository.RepositoryEntryShort; /** * @@ -120,6 +129,10 @@ public class BusinessGroupMailing { MailTemplate template = mailing == null ? null : mailing.getTemplate(); if(mailing == null || mailing.getTemplate() == null) { template = getDefaultTemplate(type, group, ureqIdentity); + } else if(group != null && template.getContext() != null && needTemplateEnhancement(template)) { + BusinessGroupService businessGroupService = CoreSpringFactory.getImpl(BusinessGroupService.class); + List<RepositoryEntryShort> repoEntries = businessGroupService.findShortRepositoryEntries(Collections.singletonList(group), 0, -1); + template = new MailTemplateDelegate(template, group, repoEntries); } MailContext context = mailing == null ? null : mailing.getContext(); @@ -138,6 +151,16 @@ public class BusinessGroupMailing { mailing.appendResult(result); } } + + private static boolean needTemplateEnhancement(MailTemplate template) { + String body = template.getBodyTemplate(); + if(body.contains("groupname") || body.contains("groupdescription") || body.contains("courselist")) { + if(!StringHelper.containsNonWhitespace((String)template.getContext().get("groupname"))) { + return true; + } + } + return false; + } public enum MailType { addParticipant, @@ -148,4 +171,99 @@ public class BusinessGroupMailing { removeToWaitingList, graduateFromWaitingListToParticpant, } -} + + public static class MailTemplateDelegate extends MailTemplate { + + private final MailTemplate delegate; + private final BusinessGroupShort group; + private final List<RepositoryEntryShort> entries; + + public MailTemplateDelegate(MailTemplate delegate, BusinessGroupShort group, List<RepositoryEntryShort> entries) { + super(null, null, null); + this.delegate = delegate; + this.group = group; + this.entries = entries; + } + + @Override + public void putVariablesInMailContext(VelocityContext vContext, Identity recipient) { + delegate.putVariablesInMailContext(vContext, recipient); + + StringBuilder learningResources = new StringBuilder(); + if(entries != null && entries.size() > 0) { + for (RepositoryEntryShort entry: entries) { + String title = entry.getDisplayname(); + String url = BusinessControlFactory.getInstance().getURLFromBusinessPathString("[RepositoryEntry:" + entry.getKey() + "]"); + learningResources.append(title); + learningResources.append(" ("); + learningResources.append(url); + learningResources.append(")\n"); + } + } + vContext.put("courselist", learningResources.toString()); + + if(group != null) { + vContext.put("groupname", group.getName()); + + String description; + if(group instanceof BusinessGroup) { + description = ((BusinessGroup)group).getDescription(); + } else { + description = CoreSpringFactory.getImpl(BusinessGroupDAO.class).loadDescription(group.getKey()); + } + description = FilterFactory.getHtmlTagAndDescapingFilter().filter(description); + vContext.put("groupdescription", description); + } + } + + @Override + public Boolean getCpfrom() { + return delegate.getCpfrom(); + } + + @Override + public void setCpfrom(Boolean cpfrom) { + delegate.setCpfrom(cpfrom); + } + + @Override + public String getSubjectTemplate() { + return delegate.getSubjectTemplate(); + } + + @Override + public void setSubjectTemplate(String subjectTemplate) { + delegate.setSubjectTemplate(subjectTemplate); + } + + @Override + public String getBodyTemplate() { + return delegate.getBodyTemplate(); + } + + @Override + public void setBodyTemplate(String bodyTemplate) { + delegate.setBodyTemplate(bodyTemplate); + } + + @Override + public File[] getAttachments() { + return delegate.getAttachments(); + } + + @Override + public void setAttachments(File[] attachments) { + delegate.setAttachments(attachments); + } + + @Override + public void addToContext(String name, String value) { + delegate.addToContext(name, value); + } + + @Override + public VelocityContext getContext() { + return delegate.getContext(); + } + } +} \ No newline at end of file diff --git a/src/main/java/org/olat/group/model/BusinessGroupShortImpl.java b/src/main/java/org/olat/group/model/BusinessGroupShortImpl.java index 1772f18ef1ad2a2bcf2acda61953ab713c1e3f35..f9544ae0221e96edec76b874fa2818245a2d2bfb 100644 --- a/src/main/java/org/olat/group/model/BusinessGroupShortImpl.java +++ b/src/main/java/org/olat/group/model/BusinessGroupShortImpl.java @@ -46,7 +46,7 @@ import org.olat.group.BusinessGroupShort; @Entity(name="businessgroupshort") @Table(name="o_gp_business") @NamedQueries({ - @NamedQuery(name="loadBusinessGroupShortByIds",query="select bgi from businessgroupshort bgi where bgi.key in (:ids)") + @NamedQuery(name="loadBusinessGroupShortByIds",query="select bgi from businessgroupshort bgi where bgi.key in (:ids)") }) public class BusinessGroupShortImpl implements Persistable, BusinessGroupShort { diff --git a/src/main/java/org/olat/group/ui/BGMailHelper.java b/src/main/java/org/olat/group/ui/BGMailHelper.java index 96ef4b21269ed6549b04f821bd9fa2cf5f834efb..bb389b9e94e8146a9fcaf37d12e76bdc96066a51 100644 --- a/src/main/java/org/olat/group/ui/BGMailHelper.java +++ b/src/main/java/org/olat/group/ui/BGMailHelper.java @@ -52,6 +52,7 @@ import org.olat.core.util.mail.MailTemplate; import org.olat.group.BusinessGroup; import org.olat.group.BusinessGroupService; import org.olat.group.BusinessGroupShort; +import org.olat.group.manager.BusinessGroupDAO; import org.olat.group.ui.main.BusinessGroupListController; import org.olat.repository.RepositoryEntryShort; @@ -207,8 +208,8 @@ public class BGMailHelper { final String courselist; final String groupname; final String groupdescription; - StringBuilder learningResources = new StringBuilder(); if(group != null) { + StringBuilder learningResources = new StringBuilder(); BusinessGroupService businessGroupService = CoreSpringFactory.getImpl(BusinessGroupService.class); List<RepositoryEntryShort> repoEntries = businessGroupService.findShortRepositoryEntries(Collections.singletonList(group), 0, -1); for (RepositoryEntryShort entry: repoEntries) { @@ -223,8 +224,14 @@ public class BGMailHelper { courselist = learningResources.toString(); // get group name and description groupname = group.getName(); - groupdescription = (group instanceof BusinessGroup ? - FilterFactory.getHtmlTagAndDescapingFilter().filter(((BusinessGroup)group).getDescription()) : ""); + + String description; + if(group instanceof BusinessGroup) { + description = ((BusinessGroup)group).getDescription(); + } else { + description = CoreSpringFactory.getImpl(BusinessGroupDAO.class).loadDescription(group.getKey()); + } + groupdescription = FilterFactory.getHtmlTagAndDescapingFilter().filter(description); subject = subject.replace("$groupname", groupname == null ? "" : groupname); body = body.replace("$groupname", groupname == null ? "" : groupname); diff --git a/src/test/java/org/olat/group/test/BusinessGroupDAOTest.java b/src/test/java/org/olat/group/test/BusinessGroupDAOTest.java index 58f531d8ef13f1cf236ff73232014c98c0156d7d..e2b2ddbed2875225adc6266e5c74501f37577d87 100644 --- a/src/test/java/org/olat/group/test/BusinessGroupDAOTest.java +++ b/src/test/java/org/olat/group/test/BusinessGroupDAOTest.java @@ -262,6 +262,17 @@ public class BusinessGroupDAOTest extends OlatTestCase { Assert.assertTrue(groupShortKeys3.contains(group1.getKey())); Assert.assertTrue(groupShortKeys3.contains(group2.getKey())); } + + @Test + public void loadDescription() { + String description = "My desc " + UUID.randomUUID(); + BusinessGroup group = businessGroupDao.createAndPersist(null, "load descr", description, 0, 10, true, true, false, false, false); + dbInstance.commitAndCloseSession(); + + String loadDescription = businessGroupDao.loadDescription(group.getKey()); + Assert.assertNotNull(loadDescription); + Assert.assertEquals(description, loadDescription); + } @Test public void loadAllBusinessGroups() {