diff --git a/src/main/java/org/olat/commons/info/manager/InfoMessageFrontendManager.java b/src/main/java/org/olat/commons/info/manager/InfoMessageFrontendManager.java index 99fda9dbdffb07bde466d118c20ef20d94d9a9d0..c59d8869e2260d331ea0b7db6bab9a122351adbf 100644 --- a/src/main/java/org/olat/commons/info/manager/InfoMessageFrontendManager.java +++ b/src/main/java/org/olat/commons/info/manager/InfoMessageFrontendManager.java @@ -62,7 +62,7 @@ public interface InfoMessageFrontendManager { public void deleteInfoMessage(InfoMessage infoMessage); - public void deleteInfoMessagesOfIdentity(BusinessGroup businessGroup, Identity identity); + public void updateInfoMessagesOfIdentity(BusinessGroup businessGroup, Identity identity); public void removeInfoMessagesAndSubscriptionContext(BusinessGroup group); diff --git a/src/main/java/org/olat/commons/info/manager/InfoMessageFrontendManagerImpl.java b/src/main/java/org/olat/commons/info/manager/InfoMessageFrontendManagerImpl.java index 57aab19ea577c9909099bfb87b04cced6a8d8ea2..c1413b8c37885b0a2846ad2613514d3ae13f8401 100644 --- a/src/main/java/org/olat/commons/info/manager/InfoMessageFrontendManagerImpl.java +++ b/src/main/java/org/olat/commons/info/manager/InfoMessageFrontendManagerImpl.java @@ -27,6 +27,7 @@ import java.util.Locale; import java.util.Set; import org.olat.commons.info.model.InfoMessage; +import org.olat.commons.info.model.InfoMessageImpl; import org.olat.commons.info.notification.InfoSubscriptionManager; import org.olat.core.commons.services.notifications.SubscriptionContext; import org.olat.core.id.Identity; @@ -163,11 +164,18 @@ public class InfoMessageFrontendManagerImpl implements InfoMessageFrontendManage } @Override - public void deleteInfoMessagesOfIdentity(BusinessGroup businessGroup, Identity identity) { + public void updateInfoMessagesOfIdentity(BusinessGroup businessGroup, Identity identity) { List<InfoMessage> infoMessages = infoMessageManager.loadInfoMessagesOfIdentity(businessGroup, identity); for (InfoMessage infoMessage : infoMessages) { - infoMessageManager.deleteInfoMessage(infoMessage); - infoSubscriptionManager.markPublisherNews(infoMessage.getOLATResourceable(), infoMessage.getResSubPath()); + Identity author = infoMessage.getAuthor(); + Identity modifier = infoMessage.getModifier(); + if (author != null && author.equals(identity)) { + ((InfoMessageImpl)infoMessage).setAuthor(null); + infoSubscriptionManager.markPublisherNews(infoMessage.getOLATResourceable(), infoMessage.getResSubPath()); + } + if (modifier != null && modifier.equals(identity)) { + infoMessage.setModifier(null); + } } } diff --git a/src/main/java/org/olat/commons/info/manager/InfoMessageManagerImpl.java b/src/main/java/org/olat/commons/info/manager/InfoMessageManagerImpl.java index eeccc4f8cfe8282b6cbcce2bdf557ad4b9c258ce..8e4668e3ceca0bc99f37263645670c3653d6d1b2 100644 --- a/src/main/java/org/olat/commons/info/manager/InfoMessageManagerImpl.java +++ b/src/main/java/org/olat/commons/info/manager/InfoMessageManagerImpl.java @@ -103,11 +103,12 @@ public class InfoMessageManagerImpl extends InfoMessageManager { public List<InfoMessage> loadInfoMessagesOfIdentity(BusinessGroupRef businessGroup, IdentityRef identity) { StringBuilder sb = new StringBuilder(); sb.append("select msg from ").append(InfoMessageImpl.class.getName()).append(" msg") - .append(" inner join fetch msg.author author") - .append(" inner join fetch author.user") + .append(" left join fetch msg.author author") + .append(" left join fetch author.user") .append(" left join fetch msg.modifier modifier") .append(" left join fetch modifier.user") - .append(" where author.key=:authorKey") + .append(" where (author.key=:authorKey") + .append(" or modifier.key=:authorKey)") .append(" and msg.resId=:groupKey"); return dbInstance.getCurrentEntityManager() .createQuery(sb.toString(), InfoMessage.class) @@ -120,8 +121,8 @@ public class InfoMessageManagerImpl extends InfoMessageManager { public InfoMessage loadInfoMessageByKey(Long key) { StringBuilder sb = new StringBuilder(); sb.append("select msg from ").append(InfoMessageImpl.class.getName()).append(" msg") - .append(" inner join fetch msg.author author") - .append(" inner join fetch author.user") + .append(" left join fetch msg.author author") + .append(" left join fetch author.user") .append(" left join fetch msg.modifier modifier") .append(" left join fetch modifier.user") .append(" where msg.key=:key"); @@ -175,8 +176,8 @@ public class InfoMessageManagerImpl extends InfoMessageManager { sb.append(" from ").append(InfoMessageImpl.class.getName()).append(" msg"); if (!count) { - sb.append(" inner join fetch msg.author author") - .append(" inner join fetch author.user") + sb.append(" left join fetch msg.author author") + .append(" left join fetch author.user") .append(" left join fetch msg.modifier modifier") .append(" left join fetch modifier.user"); } diff --git a/src/main/java/org/olat/commons/info/model/InfoMessageImpl.java b/src/main/java/org/olat/commons/info/model/InfoMessageImpl.java index 5e976126033db22359da5ce89bc42ca8b10ed609..8cf468566d443dd2c97806c874710b267dc2d7ff 100644 --- a/src/main/java/org/olat/commons/info/model/InfoMessageImpl.java +++ b/src/main/java/org/olat/commons/info/model/InfoMessageImpl.java @@ -87,8 +87,8 @@ public class InfoMessageImpl implements InfoMessage, CreateInfo, Persistable { @Column(name="businesspath", nullable=true, insertable=true, updatable=false) private String businessPath; - @ManyToOne(targetEntity=IdentityImpl.class, fetch=FetchType.LAZY, optional=false) - @JoinColumn(name="fk_author_id", nullable=false, insertable=true, updatable=false) + @ManyToOne(targetEntity=IdentityImpl.class, fetch=FetchType.LAZY, optional=true) + @JoinColumn(name="fk_author_id", nullable=true, insertable=true, updatable=true) private Identity author; @ManyToOne(targetEntity=IdentityImpl.class, fetch=FetchType.LAZY, optional=true) @JoinColumn(name="fk_modifier_id", nullable=true, insertable=true, updatable=true) diff --git a/src/main/java/org/olat/commons/info/ui/InfoDisplayController.java b/src/main/java/org/olat/commons/info/ui/InfoDisplayController.java index 16d73dc4c2c5f6efbadd509d12a7520438b21705..244835969f4b59c9c416263c5ac01ddb18f10127 100644 --- a/src/main/java/org/olat/commons/info/ui/InfoDisplayController.java +++ b/src/main/java/org/olat/commons/info/ui/InfoDisplayController.java @@ -270,7 +270,12 @@ public class InfoDisplayController extends FormBasicController { String authorName = userManager.getUserDisplayName(info.getAuthor()); String creationDate = formatter.formatDateAndTime(info.getCreationDate()); - String infos = translate("display.info", new String[]{StringHelper.escapeHtml(authorName), creationDate}); + String infos; + if (authorName.isEmpty()) { + infos = translate("display.info.noauthor", new String[]{creationDate}); + } else { + infos = translate("display.info", new String[]{StringHelper.escapeHtml(authorName), creationDate}); + } return new InfoMessageForDisplay(info.getKey(), info.getTitle(), message, infos, modifier); } diff --git a/src/main/java/org/olat/commons/info/ui/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/commons/info/ui/_i18n/LocalStrings_de.properties index 4a5661612768824a8cc20e005c3c05ea81d61247..e2bdfad10a7129d6c2b87a38aaa836c2aa28d55d 100644 --- a/src/main/java/org/olat/commons/info/ui/_i18n/LocalStrings_de.properties +++ b/src/main/java/org/olat/commons/info/ui/_i18n/LocalStrings_de.properties @@ -5,6 +5,7 @@ new_message=Neue Mitteilung erstellen create_message=Mitteilung erstellen input.toolong=Leider ist Ihr gerade eingegebener Text mit {1} Zeichen zu lang. Bitte beschr\u00E4nken Sie sich auf maximal {0} Zeichen. display.info=Publiziert von {0} am {1} +display.info.noauthor=Publiziert am {0} display.modifier=ge\u00E4ndert von {0} am {1} display.new_messages=Aktuelle Mitteilungen anzeigen display.old_messages=\u00C4ltere Mitteilungen anzeigen diff --git a/src/main/java/org/olat/commons/info/ui/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/commons/info/ui/_i18n/LocalStrings_en.properties index 9a78b7e5f7ff2064f0dee3350fbc2187f6fcad59..59c8bee1e71063c38ae7f6f74d0452dbe904c6aa 100644 --- a/src/main/java/org/olat/commons/info/ui/_i18n/LocalStrings_en.properties +++ b/src/main/java/org/olat/commons/info/ui/_i18n/LocalStrings_en.properties @@ -3,6 +3,7 @@ already.deleted=This message has been deleted in the meantime by another user. already.edited=This message is being edited by user {0}. Please try again later. create_message=Create message display.info=Published by {0} on {1} +display.info.noauthor=Published on {0} display.modifier=modified by {0} on {1} display.new_messages=Show new messages display.no_messages=There are no new messages diff --git a/src/main/java/org/olat/group/manager/BusinessGroupServiceImpl.java b/src/main/java/org/olat/group/manager/BusinessGroupServiceImpl.java index e177c724e0f287f4c355d5e625c5e2afd191e90a..db310cfa666fd4eda5c9cc5d97bd3ebdb785b788 100644 --- a/src/main/java/org/olat/group/manager/BusinessGroupServiceImpl.java +++ b/src/main/java/org/olat/group/manager/BusinessGroupServiceImpl.java @@ -1035,7 +1035,7 @@ public class BusinessGroupServiceImpl implements BusinessGroupService, UserDataD private void removeParticipant(Identity ureqIdentity, Identity identity, BusinessGroup group, MailPackage mailing, List<BusinessGroupModifiedEvent.Deferred> events) { - infoMessageManager.deleteInfoMessagesOfIdentity(group, identity); + infoMessageManager.updateInfoMessagesOfIdentity(group, identity); boolean removed = businessGroupRelationDAO.removeRole(identity, group, GroupRoles.participant.name()); if(removed) { // notify currently active users of this business group diff --git a/src/test/java/org/olat/commons/info/InfoMessageFrontendManagerTest.java b/src/test/java/org/olat/commons/info/InfoMessageFrontendManagerTest.java index 7c68049f898e804f21f00e8b639ce2595c286957..f1fb12220c02a4818be6b92a074e7967d892a063 100644 --- a/src/test/java/org/olat/commons/info/InfoMessageFrontendManagerTest.java +++ b/src/test/java/org/olat/commons/info/InfoMessageFrontendManagerTest.java @@ -190,7 +190,7 @@ public class InfoMessageFrontendManagerTest extends OlatTestCase { dbInstance.commitAndCloseSession(); - infoManager.deleteInfoMessagesOfIdentity(businessGroup, id1); + infoManager.updateInfoMessagesOfIdentity(businessGroup, id1); dbInstance.commitAndCloseSession(); // load messages after deletion