diff --git a/src/main/java/org/olat/modules/fo/export/SendMailStepForm.java b/src/main/java/org/olat/modules/fo/export/SendMailStepForm.java index 57f73b5bb099ffd6dc20bdfda01b73a50939d190..ad4277693350bd34916c1280c896b92b2fc47ceb 100644 --- a/src/main/java/org/olat/modules/fo/export/SendMailStepForm.java +++ b/src/main/java/org/olat/modules/fo/export/SendMailStepForm.java @@ -20,9 +20,11 @@ package org.olat.modules.fo.export; import java.util.ArrayList; +import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.List; +import java.util.Map; import java.util.Set; import org.apache.velocity.VelocityContext; @@ -77,6 +79,7 @@ public class SendMailStepForm extends StepFormBasicController { private Message startMessage, parentMessage; private List<Identity> threadMembers; + private Map<Identity, String> pseudonymes; private String targetForum, targetCourseTitle, startMessageTitle; @@ -136,10 +139,21 @@ public class SendMailStepForm extends StepFormBasicController { @Override protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) { String members = displayThreadMembers(); - FormLayoutContainer recipientsContainer = FormLayoutContainer.createDefaultFormLayout("recipients", getTranslator()); - formLayout.add(recipientsContainer); - recipientsContainer.setRootForm(mainForm); - uifactory.addStaticTextElement("sendmail.recipients", members, recipientsContainer); + // summary + String summary = translate("thread.moving.info", new String[]{startMessageTitle, targetForum, targetCourseTitle}); + Set<Long> messageKeys = new HashSet<>(); + forumManager.countMessageChildrenRecursively(startMessage, messageKeys); + int childrenCount = messageKeys.size(); + if (childrenCount > 0) { + summary += childrenCount > 1 ? translate("many.children.move", String.valueOf(childrenCount)) : translate("one.child.move") ; + } + FormLayoutContainer infoContainer = FormLayoutContainer.createDefaultFormLayout("summary", getTranslator()); + formLayout.add(infoContainer); + infoContainer.setRootForm(mainForm); + uifactory.addStaticTextElement("thread.moved.summary", summary, infoContainer); + // members + uifactory.addStaticTextElement("sendmail.recipients", members, infoContainer); + // mail template formLayout.add(templateForm.getInitialFormItem()); } @@ -177,27 +191,34 @@ public class SendMailStepForm extends StepFormBasicController { } else { addToRunContext(SENDMAIL, Boolean.FALSE); } - showInfo("thread.moved.info", new String[]{startMessageTitle, targetForum, targetCourseTitle}); + showInfo("thread.moved.success", new String[]{startMessageTitle, targetForum, targetCourseTitle}); fireEvent(ureq, StepsEvent.ACTIVATE_NEXT); } private List<Identity> collectCreators () { + pseudonymes = new HashMap<>(); Set<Identity> threadMemberSet = new HashSet<>(); // inform start message (thread top) - Identity creator = startMessage.getCreator(); - if (creator != null) { - threadMemberSet.add(creator); - } - Identity modifier = startMessage.getModifier(); - if (modifier != null) { - threadMemberSet.add(modifier); + if (!startMessage.isGuest()) { + Identity creator = startMessage.getCreator(); + if (creator != null) { + threadMemberSet.add(creator); + String pseudonym = startMessage.getPseudonym(); + if(pseudonym != null) { + pseudonymes.put(creator, pseudonym); + } + } + Identity modifier = startMessage.getModifier(); + if (modifier != null) { + threadMemberSet.add(modifier); + } } // send copy of email to sender if (templateForm != null && templateForm.isCCSenderSelected()) { threadMemberSet.add(getIdentity()); } // inform children - forumManager.collectThreadMembersRecursively(startMessage, threadMemberSet); + forumManager.collectThreadMembersRecursively(startMessage, threadMemberSet, pseudonymes); return new ArrayList<Identity>(threadMemberSet); } @@ -208,8 +229,12 @@ public class SendMailStepForm extends StepFormBasicController { Iterator<Identity> listIterator = threadMembers.iterator(); while(listIterator.hasNext()) { Identity identity = listIterator.next(); - String displayName = userManager.getUserDisplayName(identity); - sb.append(displayName); + if (pseudonymes.containsKey(identity)) { + sb.append(pseudonymes.get(identity)); + } else { + String displayName = userManager.getUserDisplayName(identity); + sb.append(displayName); + } if (listIterator.hasNext()) { sb.append("; "); } diff --git a/src/main/java/org/olat/modules/fo/export/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/modules/fo/export/_i18n/LocalStrings_de.properties index 76b628f8e4e5d6e0c6b35247542bfd1313c25375..23762952375720e3f3a46e700f8bfc0b5e10ae80 100644 --- a/src/main/java/org/olat/modules/fo/export/_i18n/LocalStrings_de.properties +++ b/src/main/java/org/olat/modules/fo/export/_i18n/LocalStrings_de.properties @@ -7,8 +7,12 @@ forum.select=select forum.forum=forum forum.thread=Diskussionsfaden forum.comment=Beitrag -thread.moved.info=Diskussionsfaden "{0}" wurde ins Forum "{1}" von Kurs "{2}" verschoben -sendmail.recipients=Empf\u00E4nger +many.children.move=\n{0} Antworten werden mitverschoben. +one.child.move=\nEine Antwort wird mitverschoben. +thread.moving.info=Diskussionsfaden "{0}" wird ins Forum "{1}" von Kurs "{2}" verschoben. +thread.moved.success=Diskussionsfaden "{0}" wurde erfolgreich ins Forum "{1}" von Kurs "{2}" verschoben +thread.moved.summary=Zusammenfassung +sendmail.recipients=Betroffene Benutzer link.new.thread=Als neuen Diskussionsfaden anlegen radio.foreign.course={0} in ein Forum eines anderen Kurses verschieben radio.same.course={0} in ein Forum im gleichen Kurs verschieben diff --git a/src/main/java/org/olat/modules/fo/export/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/modules/fo/export/_i18n/LocalStrings_en.properties index 445c4ca087afd7d65a4f008dda341984e4014f63..91cb592767f920b6c8b9e81aafe28d2b51bf7f9a 100644 --- a/src/main/java/org/olat/modules/fo/export/_i18n/LocalStrings_en.properties +++ b/src/main/java/org/olat/modules/fo/export/_i18n/LocalStrings_en.properties @@ -7,8 +7,12 @@ forum.select=Select forum.forum=Forum forum.thread=Thread forum.comment=Comment -thread.moved.info=Thread "{0}" was moved to Forum "{1}" in course "{2}" -sendmail.recipients=Recipients +many.children.move=\n{0} answers are moved along. +one.child.move=\nOne answer is moved along. +thread.moving.info=Thread "{0}" is moved to Forum "{1}" in course "{2}". +thread.moved.success=Thread "{0}" was moved to Forum "{1}" in course "{2}" successfully. +thread.moved.summary=Summary +sendmail.recipients=Affected users link.new.thread=Add as new Thread radio.foreign.course=Move {0} in forum of another course radio.same.course=Move {0} in forum same course diff --git a/src/main/java/org/olat/modules/fo/manager/ForumManager.java b/src/main/java/org/olat/modules/fo/manager/ForumManager.java index 8abed75cdc63c0b1e97d3b0d1e55c956c92fa937..43c26b7535e513ed3a18999685eca4998a808810 100644 --- a/src/main/java/org/olat/modules/fo/manager/ForumManager.java +++ b/src/main/java/org/olat/modules/fo/manager/ForumManager.java @@ -27,6 +27,7 @@ package org.olat.modules.fo.manager; import java.io.File; import java.util.ArrayList; +import java.util.Comparator; import java.util.Date; import java.util.HashMap; import java.util.HashSet; @@ -918,6 +919,16 @@ public class ForumManager { .getResultList(); return count == null || count.isEmpty() || count.get(0) == null ? 0 : count.get(0).intValue(); } + + public void countMessageChildrenRecursively(Message message, Set<Long> messageKeys) { + List<Message> children = getMessageChildren(message); + for (Message child : children) { + messageKeys.add(child.getKey()); + if (hasChildren(child)){ + countMessageChildrenRecursively(child, messageKeys); + } + } + } /** * deletes entry of one message @@ -1073,19 +1084,43 @@ public class ForumManager { * @param oldParent * @param setOfIdentity */ - public void collectThreadMembersRecursively(Message oldParent, Set<Identity> setOfIdentity) { + public void collectThreadMembersRecursively(Message oldParent, Set<Identity> setOfIdentity, Map<Identity, String> pseudonymes) { List<Message> children = getMessageChildren(oldParent); - for (Message child : children) { - Identity creator = child.getCreator(); - if (creator != null) { - setOfIdentity.add(creator); + children.sort(new Comparator<Message>() { + @Override + public int compare(Message o1, Message o2) { + if (o1 == null) return 1; + if (o2 == null) return -1; + // move posts with pseudonyms toward low indices in list + if (o1.getPseudonym() == null && o2.getPseudonym() != null) { + return 1; + } else if (o1.getPseudonym() != null && o2.getPseudonym() == null) { + return -1; + } else { + return o1.getCreationDate().compareTo(o2.getCreationDate()); + } } - Identity modifier = child.getModifier(); - if (modifier != null) { - setOfIdentity.add(modifier); + }); + for (Message child : children) { + if (!child.isGuest()) { + Identity creator = child.getCreator(); + if (creator != null) { + setOfIdentity.add(creator); + String pseudonym = child.getPseudonym(); + if(pseudonym != null) { + pseudonymes.put(creator, pseudonym); + } else if (pseudonymes.containsKey(creator)) { + // remove entry if thread also contains same identity without pseudonym + pseudonymes.remove(creator); + } + } + Identity modifier = child.getModifier(); + if (creator != null && modifier != null) { + setOfIdentity.add(modifier); + } } if (hasChildren(child)) { - collectThreadMembersRecursively(child, setOfIdentity); + collectThreadMembersRecursively(child, setOfIdentity, pseudonymes); } } }