diff --git a/src/main/java/org/olat/admin/user/imp/SendMailConfirmationController.java b/src/main/java/org/olat/admin/user/imp/SendMailConfirmationController.java index e4bdc1b3e1003dc1944c0a964ca688866d4c62fa..d94f46d4bc9b7fe8f7853db78d3f4a86996b78da 100644 --- a/src/main/java/org/olat/admin/user/imp/SendMailConfirmationController.java +++ b/src/main/java/org/olat/admin/user/imp/SendMailConfirmationController.java @@ -57,10 +57,14 @@ public class SendMailConfirmationController extends StepFormBasicController { List<Long> ownGroups = (List<Long>) getFromRunContext("ownerGroups"); @SuppressWarnings("unchecked") List<Long> partGroups = (List<Long>) getFromRunContext("partGroups"); + @SuppressWarnings("unchecked") + List<TransientIdentity> newIdents = (List<TransientIdentity>)getFromRunContext("newIdents"); String[] values = new String[] { translate("step3.send.mail") }; typEl = uifactory.addCheckboxesVertical("typ", "step3.send.label", formLayout, keys, values, 1); - typEl.setEnabled(ownGroups.size() > 0 || partGroups.size() > 0); + typEl.setEnabled((ownGroups != null && ownGroups.size() > 0) + || (partGroups != null && partGroups.size() > 0) + || (newIdents != null && newIdents.size() > 0)); } @Override diff --git a/src/main/java/org/olat/admin/user/imp/UserImportController.java b/src/main/java/org/olat/admin/user/imp/UserImportController.java index e65cea510efd30355c34f5670f8f49fe123d6424..e293f003f6c6ae5ba8f5c96d66a316b9b27f7a39 100644 --- a/src/main/java/org/olat/admin/user/imp/UserImportController.java +++ b/src/main/java/org/olat/admin/user/imp/UserImportController.java @@ -27,11 +27,15 @@ package org.olat.admin.user.imp; import java.util.ArrayList; import java.util.Collection; +import java.util.HashMap; import java.util.HashSet; import java.util.List; +import java.util.Locale; +import java.util.Map; import java.util.Set; import java.util.concurrent.atomic.AtomicInteger; +import org.apache.velocity.VelocityContext; import org.olat.basesecurity.Authentication; import org.olat.basesecurity.BaseSecurity; import org.olat.core.commons.persistence.DB; @@ -49,10 +53,19 @@ import org.olat.core.gui.control.generic.wizard.Step; import org.olat.core.gui.control.generic.wizard.StepRunnerCallback; import org.olat.core.gui.control.generic.wizard.StepsMainRunController; import org.olat.core.gui.control.generic.wizard.StepsRunContext; +import org.olat.core.gui.translator.Translator; +import org.olat.core.helpers.Settings; import org.olat.core.id.Identity; import org.olat.core.id.User; +import org.olat.core.id.UserConstants; import org.olat.core.util.StringHelper; +import org.olat.core.util.Util; +import org.olat.core.util.i18n.I18nManager; +import org.olat.core.util.mail.MailBundle; +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.BusinessGroupService; import org.olat.group.model.BusinessGroupMembershipChange; import org.olat.login.auth.OLATAuthManager; @@ -89,6 +102,8 @@ public class UserImportController extends BasicController { @Autowired private UserManager um; @Autowired + private MailManager mailService; + @Autowired private BaseSecurity securityManager; @Autowired private OLATAuthManager olatAuthManager; @@ -252,11 +267,14 @@ public class UserImportController extends BasicController { if (runContext.containsKey("validImport") && ((Boolean) runContext.get("validImport")).booleanValue()) { // create new users and persist int count = 0; - @SuppressWarnings("unchecked") List<TransientIdentity> newIdents = (List<TransientIdentity>) runContext.get("newIdents"); + Map<TransientIdentity,Identity> newPersistedIdentities = new HashMap<>(); for (TransientIdentity newIdent:newIdents) { - doCreateAndPersistIdentity(newIdent, report); + Identity newIdentity = doCreateAndPersistIdentity(newIdent, report); + if(newIdentity != null) { + newPersistedIdentities.put(newIdent, newIdentity); + } if(++count % 10 == 0) { dbInstance.commitAndCloseSession(); } @@ -286,6 +304,11 @@ public class UserImportController extends BasicController { Boolean sendMailObj = (Boolean)runContext.get("sendMail"); boolean sendmail = sendMailObj == null ? true : sendMailObj.booleanValue(); processGroupAdditionForAllIdents(allIdents, ownGroups, partGroups, sendmail); + } else { + Boolean sendMailObj = (Boolean)runContext.get("sendMail"); + if(sendMailObj != null && sendMailObj) { + sendMailToNewIdentities(newPersistedIdentities); + } } report.setHasChanges(true); } @@ -322,6 +345,51 @@ public class UserImportController extends BasicController { identities.addAll(nextIds); return identities; } + + private void sendMailToNewIdentities(Map<TransientIdentity,Identity> newIdentities) { + MailerResult result = new MailerResult(); + for(Map.Entry<TransientIdentity, Identity> newEntry:newIdentities.entrySet()) { + if(newEntry.getKey() != null && newEntry.getValue() != null) { + Identity newIdentity = newEntry.getValue(); + MailTemplate template = createMailTemplateForNewIdentity(newIdentity, newEntry.getKey()); + MailBundle bundle = mailService.makeMailBundle(null, newIdentity, template, getIdentity(), null, result); + if(bundle != null) { + mailService.sendExternMessage(bundle, result, true); + } + } + } + } + + private MailTemplate createMailTemplateForNewIdentity(Identity identity, TransientIdentity transientIdentity) { + // get some data about the actor and fetch the translated subject / body via i18n module + String[] bodyArgs = new String[] { + identity.getName(), //{0} + identity.getUser().getProperty(UserConstants.FIRSTNAME, null), //{1} + identity.getUser().getProperty(UserConstants.LASTNAME, null), //{2} + identity.getUser().getProperty(UserConstants.EMAIL, null), //{3} + Settings.getServerContextPathURI(), //{4} + transientIdentity.getPassword() //{5} + }; + Locale locale = I18nManager.getInstance().getLocaleOrDefault(identity.getUser().getPreferences().getLanguage()); + Translator translator = Util.createPackageTranslator(UserImportController.class, locale); + + String subject = translator.translate("mail.new.identity.subject"); + String body = translator.translate("mail.new.identity.text", bodyArgs); + + // create a mail template which all these data + MailTemplate mailTempl = new MailTemplate(subject, body, null) { + @Override + public void putVariablesInMailContext(VelocityContext context, Identity identity) { + // Put user variables into velocity context + User user = identity.getUser(); + context.put("firstname", user.getProperty(UserConstants.FIRSTNAME, null)); + context.put("lastname", user.getProperty(UserConstants.LASTNAME, null)); + //the email of the user, needs to stay named 'login' + context.put("login", user.getProperty(UserConstants.EMAIL, null)); + } + }; + return mailTempl; + } private void processGroupAdditionForAllIdents(List<Identity> allIdents, List<Long> tutorGroups, List<Long> partGroups, boolean sendmail) { Collection<Identity> identities = getIdentities(allIdents); diff --git a/src/main/java/org/olat/admin/user/imp/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/admin/user/imp/_i18n/LocalStrings_de.properties index 73245880583666f504a86cd13deeaa0c4e95df61..d2b88bbce94b302cbe4452e26cf72217c9d37da7 100644 --- a/src/main/java/org/olat/admin/user/imp/_i18n/LocalStrings_de.properties +++ b/src/main/java/org/olat/admin/user/imp/_i18n/LocalStrings_de.properties @@ -32,6 +32,8 @@ import.start=Benutzerimport starten import.success=Die neuen Benutzer wurden erfolgreich angelegt. import.user.existing.alt=Dieser Benutzer existiert bereits, er wird nicht neu angelegt import.user.new.alt=Dieser Benutzer existiert noch nicht, er wird neu angelegt +mail.new.identity.subject=Benutzerkonto Lernplattform +mail.new.identity.text=Guten Tag {1} {2},\n\nSoeben wurde f\u00FCr Sie ein Benutzerkonto auf der Lernplattform {4} erstellt. Um auf die Lerninhalte zugreifen zu k\u00F6nnen, gehen Sie bitte auf {4} und geben dort Ihren Benutzernamen {0} oder Ihre email-Adresse {3} ein sowie Ihr Passwort {5} ein. \n\nMit freundlichen Gr\u00FCssen\nDas elearning Team step0.description=Datenbeispiele und Daten einf\u00FCgen step0.short.descr=User importieren. step1.description=Vorschau der Benutzerdaten diff --git a/src/main/java/org/olat/admin/user/imp/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/admin/user/imp/_i18n/LocalStrings_en.properties index 84e5ceccb2e8307ab748b6fae122729c1748a691..f6835fb70fcd4cadcfb6ae79d5883bd59c013da7 100644 --- a/src/main/java/org/olat/admin/user/imp/_i18n/LocalStrings_en.properties +++ b/src/main/java/org/olat/admin/user/imp/_i18n/LocalStrings_en.properties @@ -32,6 +32,8 @@ import.start=Start user import import.success=New users successfully created. import.user.existing.alt=This user already exists and will therefore not be created anew. import.user.new.alt=This user does not exist yet and will therefore be created. +mail.new.identity.subject=Learning platform's user account +mail.new.identity.text=Hello {1} {2},\n\nWe just create a user account on the learning platform {4}. To access the learning content, please follow the link {4} and enter your user name {0} or your mail address {3} and your password {5}. \n\nBest regards\nYour elearning Team step0.description=View examples and insert data step0.short.descr=Import user step1.description=Preview of user data