From 02653cd4fb71d52c456d179d516a23d5fc100991 Mon Sep 17 00:00:00 2001
From: uhensler <urs.hensler@frentix.com>
Date: Fri, 5 Jun 2020 17:45:53 +0200
Subject: [PATCH] OO-4630: Link to appointments course node in calendar event

---
 .../appointments/manager/CalendarSyncher.java | 43 ++++++++++++++++---
 1 file changed, 37 insertions(+), 6 deletions(-)

diff --git a/src/main/java/org/olat/course/nodes/appointments/manager/CalendarSyncher.java b/src/main/java/org/olat/course/nodes/appointments/manager/CalendarSyncher.java
index 5f887d4afe2..c9365dc6249 100644
--- a/src/main/java/org/olat/course/nodes/appointments/manager/CalendarSyncher.java
+++ b/src/main/java/org/olat/course/nodes/appointments/manager/CalendarSyncher.java
@@ -21,6 +21,7 @@ package org.olat.course.nodes.appointments.manager;
 
 import java.util.Collection;
 import java.util.Collections;
+import java.util.List;
 import java.util.Locale;
 import java.util.UUID;
 
@@ -28,8 +29,10 @@ import org.olat.commons.calendar.CalendarManagedFlag;
 import org.olat.commons.calendar.CalendarManager;
 import org.olat.commons.calendar.model.Kalendar;
 import org.olat.commons.calendar.model.KalendarEvent;
+import org.olat.commons.calendar.model.KalendarEventLink;
 import org.olat.core.gui.translator.Translator;
 import org.olat.core.id.Identity;
+import org.olat.core.id.context.BusinessControlFactory;
 import org.olat.core.util.StringHelper;
 import org.olat.core.util.Util;
 import org.olat.core.util.i18n.I18nManager;
@@ -39,6 +42,7 @@ import org.olat.course.nodes.appointments.Participation;
 import org.olat.course.nodes.appointments.ParticipationSearchParams;
 import org.olat.course.nodes.appointments.Topic;
 import org.olat.course.nodes.appointments.ui.AppointmentsRunController;
+import org.olat.repository.RepositoryManager;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
@@ -58,7 +62,9 @@ public class CalendarSyncher {
 	@Autowired
 	private ParticipationDAO participationDao;
 	@Autowired
-	private CalendarManager calendarMgr;
+	private CalendarManager calendarManager;
+	@Autowired
+	private RepositoryManager repositoryManager;
 	
 	/**
 	 * Sync the calendar events of all organizers and all participants.
@@ -85,7 +91,7 @@ public class CalendarSyncher {
 	}
 		
 	void syncCalendar(Collection<Appointment> appointments, Identity identity) {
-		Kalendar cal = calendarMgr.getCalendar(CalendarManager.TYPE_USER, identity.getName());
+		Kalendar cal = calendarManager.getCalendar(CalendarManager.TYPE_USER, identity.getName());
 		syncCalendar(appointments, identity, cal);
 	}
 	
@@ -99,14 +105,14 @@ public class CalendarSyncher {
 		for (KalendarEvent event : cal.getEvents()) {
 			if (eventExternalId.equals(event.getExternalId())) {
 				updateEvent(appointment, event, identity);
-				calendarMgr.updateEventFrom(cal, event);
+				calendarManager.updateEventFrom(cal, event);
 				return;
 			}
 		}
 		
 		// create new event if no existing
 		KalendarEvent newEvent = createEvent(appointment, identity);
-		calendarMgr.addEventTo(cal, newEvent);
+		calendarManager.addEventTo(cal, newEvent);
 	}
 	
 	/**
@@ -133,7 +139,7 @@ public class CalendarSyncher {
 	}
 	
 	void unsyncCalendar(Collection<Appointment> appointments, Identity identity) {
-		Kalendar cal = calendarMgr.getCalendar(CalendarManager.TYPE_USER, identity.getName());
+		Kalendar cal = calendarManager.getCalendar(CalendarManager.TYPE_USER, identity.getName());
 		unsyncCalendar(appointments, cal);
 	}
 	
@@ -145,7 +151,7 @@ public class CalendarSyncher {
 		String externalId = generateExternalId(appointment);
 		cal.getEvents().stream()
 				.filter(event -> externalId.equals(event.getExternalId()))
-				.forEach(event -> calendarMgr.removeEventFrom(cal, event));
+				.forEach(event -> calendarManager.removeEventFrom(cal, event));
 	}
 	
 	private KalendarEvent createEvent(Appointment appointement, Identity identity) {
@@ -155,6 +161,7 @@ public class CalendarSyncher {
 		event.setExternalId(generateExternalId(appointement));
 		event.setLocation(appointement.getLocation());
 		updateEventDescription(appointement, event);
+		addKalendarEventLinks(appointement.getTopic(), event);
 		event.setManagedFlags(CAL_MANAGED_FLAGS);
 		return event;
 	}
@@ -165,6 +172,7 @@ public class CalendarSyncher {
 		event.setEnd(appointement.getEnd());
 		event.setLocation(appointement.getLocation());
 		updateEventDescription(appointement, event);
+		addKalendarEventLinks(appointement.getTopic(), event);
 		event.setManagedFlags(CAL_MANAGED_FLAGS);
 	}
 	
@@ -194,6 +202,29 @@ public class CalendarSyncher {
 		event.setDescription(descr.toString());
 	}
 	
+	private void addKalendarEventLinks(Topic topic, KalendarEvent event) {
+		List<KalendarEventLink> kalendarEventLinks = event.getKalendarEventLinks();
+		String id = topic.getKey().toString();
+		String displayName = repositoryManager.lookupDisplayName(topic.getEntry().getKey());
+		String businessPath = getBusinessPath(topic);
+		KalendarEventLink link = new KalendarEventLink("appointments", id, displayName, businessPath, "o_CourseModule_icon");
+		kalendarEventLinks.clear();
+		kalendarEventLinks.add(link);
+	}
+	
+	private String getBusinessPath(Topic topic) {
+		String businessPath;
+		if (topic.getEntry() != null) {
+			businessPath = "[RepositoryEntry:" + topic.getEntry().getKey() + "]";
+			if (StringHelper.containsNonWhitespace(topic.getSubIdent())) {
+				businessPath += "[CourseNode:" + topic.getSubIdent() + "]";
+			}
+		} else {
+			businessPath = "[RepositoryEntry:0]";
+		}
+		return BusinessControlFactory.getInstance().getURLFromBusinessPathString(businessPath);
+	}
+	
 	private String generateExternalId(Appointment appointment) {
 		StringBuilder sb = new StringBuilder();
 		sb.append("appointment-").append(appointment.getKey());
-- 
GitLab