From 3ccb27b1b5da133dcd4128992d9b0dedf3910775 Mon Sep 17 00:00:00 2001
From: srosse <stephane.rosse@frentix.com>
Date: Thu, 18 Jul 2019 20:50:31 +0200
Subject: [PATCH] OO-4156: admin. of courses can receive notifications of tasks
 elements

---
 .../GTAMarkedNotificationsHandler.java        | 20 +----
 .../nodes/gta/manager/GTANotifications.java   | 77 +++++++++++--------
 .../gta/manager/GTANotificationsHandler.java  | 20 +----
 3 files changed, 49 insertions(+), 68 deletions(-)

diff --git a/src/main/java/org/olat/course/nodes/gta/manager/GTAMarkedNotificationsHandler.java b/src/main/java/org/olat/course/nodes/gta/manager/GTAMarkedNotificationsHandler.java
index eae5a079222..55566db1469 100644
--- a/src/main/java/org/olat/course/nodes/gta/manager/GTAMarkedNotificationsHandler.java
+++ b/src/main/java/org/olat/course/nodes/gta/manager/GTAMarkedNotificationsHandler.java
@@ -23,6 +23,7 @@ import java.util.Date;
 import java.util.List;
 import java.util.Locale;
 
+import org.apache.logging.log4j.Logger;
 import org.olat.core.commons.services.notifications.NotificationsHandler;
 import org.olat.core.commons.services.notifications.NotificationsManager;
 import org.olat.core.commons.services.notifications.Publisher;
@@ -31,16 +32,10 @@ import org.olat.core.commons.services.notifications.SubscriptionInfo;
 import org.olat.core.commons.services.notifications.model.SubscriptionListItem;
 import org.olat.core.commons.services.notifications.model.TitleItem;
 import org.olat.core.gui.translator.Translator;
-import org.apache.logging.log4j.Logger;
 import org.olat.core.logging.Tracing;
 import org.olat.core.util.Util;
-import org.olat.course.nodes.gta.GTAManager;
 import org.olat.course.nodes.gta.ui.GTARunController;
-import org.olat.group.BusinessGroupService;
-import org.olat.modules.assessment.manager.AssessmentEntryDAO;
 import org.olat.repository.RepositoryManager;
-import org.olat.repository.RepositoryService;
-import org.olat.user.UserManager;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
@@ -56,19 +51,9 @@ public class GTAMarkedNotificationsHandler implements NotificationsHandler  {
 	private static final Logger log = Tracing.createLoggerFor(GTAMarkedNotificationsHandler.class);
 	protected static final String CSS_CLASS_ICON = "o_gta_icon";
 	
-	@Autowired
-	private GTAManager gtaManager;
-	@Autowired
-	private UserManager userManager;
 	@Autowired
 	private RepositoryManager repositoryManager;
 	@Autowired
-	private RepositoryService repositoryService;
-	@Autowired
-	private BusinessGroupService businessGroupService;
-	@Autowired
-	private AssessmentEntryDAO courseNodeAssessmentDao;
-	@Autowired
 	private NotificationsManager notificationsManager;
 
 	@Override
@@ -80,8 +65,7 @@ public class GTAMarkedNotificationsHandler implements NotificationsHandler  {
 		// there could be news for me, investigate deeper
 		try {
 			if (notificationsManager.isPublisherValid(p) && compareDate.before(latestNews)) {
-				GTANotifications notifications = new GTANotifications(subscriber, true, locale, compareDate,
-						repositoryService, gtaManager, businessGroupService, userManager, courseNodeAssessmentDao);
+				GTANotifications notifications = new GTANotifications(subscriber, true, locale, compareDate);
 				List<SubscriptionListItem> items = notifications.getItems();
 				if(items.isEmpty()) {
 					si = notificationsManager.getNoSubscriptionInfo();
diff --git a/src/main/java/org/olat/course/nodes/gta/manager/GTANotifications.java b/src/main/java/org/olat/course/nodes/gta/manager/GTANotifications.java
index 242c3b901e0..30aff52104b 100644
--- a/src/main/java/org/olat/course/nodes/gta/manager/GTANotifications.java
+++ b/src/main/java/org/olat/course/nodes/gta/manager/GTANotifications.java
@@ -29,13 +29,16 @@ import java.util.List;
 import java.util.Locale;
 import java.util.Set;
 
+import org.olat.basesecurity.BaseSecurity;
 import org.olat.basesecurity.GroupRoles;
+import org.olat.core.CoreSpringFactory;
 import org.olat.core.commons.services.notifications.Publisher;
 import org.olat.core.commons.services.notifications.Subscriber;
 import org.olat.core.commons.services.notifications.model.SubscriptionListItem;
 import org.olat.core.commons.services.vfs.VFSMetadata;
 import org.olat.core.gui.translator.Translator;
 import org.olat.core.id.Identity;
+import org.olat.core.id.Roles;
 import org.olat.core.id.context.BusinessControlFactory;
 import org.olat.core.util.Formatter;
 import org.olat.core.util.StringHelper;
@@ -71,8 +74,11 @@ import org.olat.modules.assessment.Role;
 import org.olat.modules.assessment.manager.AssessmentEntryDAO;
 import org.olat.repository.RepositoryEntry;
 import org.olat.repository.RepositoryEntryRelationType;
+import org.olat.repository.RepositoryManager;
 import org.olat.repository.RepositoryService;
+import org.olat.repository.model.RepositoryEntrySecurity;
 import org.olat.user.UserManager;
+import org.springframework.beans.factory.annotation.Autowired;
 
 /**
  * 
@@ -97,21 +103,23 @@ class GTANotifications {
 	private final Translator translator;
 	private final Formatter formatter;
 	
-	private final GTAManager gtaManager;
-	private final UserManager userManager;
-	private final RepositoryService repositoryService;
-	private final BusinessGroupService businessGroupService;
-	private final AssessmentEntryDAO courseNodeAssessmentDao;
-	
-	public GTANotifications(Subscriber subscriber, boolean markedOnly, Locale locale, Date compareDate,
-			RepositoryService repositoryService, GTAManager gtaManager,
-			BusinessGroupService businessGroupService, UserManager userManager,
-			AssessmentEntryDAO courseNodeAssessmentDao) {
-		this.gtaManager = gtaManager;
-		this.userManager = userManager;
-		this.repositoryService = repositoryService;
-		this.businessGroupService = businessGroupService;
-		this.courseNodeAssessmentDao = courseNodeAssessmentDao;
+	@Autowired
+	private GTAManager gtaManager;
+	@Autowired
+	private UserManager userManager;
+	@Autowired
+	private BaseSecurity securityManager;
+	@Autowired
+	private RepositoryManager repositoryManager;
+	@Autowired
+	private RepositoryService repositoryService;
+	@Autowired
+	private BusinessGroupService businessGroupService;
+	@Autowired
+	private AssessmentEntryDAO courseNodeAssessmentDao;
+	
+	public GTANotifications(Subscriber subscriber, boolean markedOnly, Locale locale, Date compareDate) {
+		CoreSpringFactory.autowireObject(this);
 		this.markedOnly = markedOnly;
 		this.subscriber = subscriber;
 		this.compareDate = compareDate;
@@ -179,10 +187,11 @@ class GTANotifications {
 	
 	private void createIndividualSubscriptionInfo(Identity subscriberIdentity, Set<Long> marks) {
 		RepositoryEntry entry = courseEnv.getCourseGroupManager().getCourseEntry();
-		List<String> roles = repositoryService.getRoles(subscriberIdentity, entry);
+		Roles roles = securityManager.getRoles(subscriberIdentity);
+		RepositoryEntrySecurity reSecurity = repositoryManager.isAllowed(subscriberIdentity, roles, entry);
 		
-		boolean owner = roles.contains(GroupRoles.owner.name());
-		boolean coach = roles.contains(GroupRoles.coach.name());
+		boolean owner = reSecurity.isOwner() || reSecurity.isEntryAdmin();
+		boolean coach = reSecurity.isCourseCoach() || reSecurity.isCurriculumCoach() || reSecurity.isGroupCoach();
 		if(owner || coach) {
 			Set<Identity> duplicateKiller = new HashSet<>();
 			List<Identity> assessableIdentities = new ArrayList<>();
@@ -229,7 +238,8 @@ class GTANotifications {
 			}
 		}
 		
-		if(roles.contains(GroupRoles.participant.name())) {
+		boolean participant = reSecurity.isCourseParticipant() || reSecurity.isCurriculumParticipant() || reSecurity.isGroupParticipant();
+		if(participant) {
 			createIndividualSubscriptionInfo(subscriberIdentity, false);
 			Task task = gtaManager.getTask(subscriberIdentity, taskList);
 			if(isSolutionVisible(subscriberIdentity, null, task)) {
@@ -256,18 +266,18 @@ class GTANotifications {
 				File[] submissions = submitDirectory.listFiles(SystemFileFilter.FILES_ONLY);
 				if(submissions.length == 0) {
 					String[] params = new String[] {
-							getTaskName(task),		// {0}
-							displayName,				// {1}
-							fullName					// {2}
+							getTaskName(task),		// 0
+							displayName,			// 1
+							fullName				// 2
 					};
 					appendSubscriptionItem("notifications.submission.individual", params, assessedIdentity, submissionDate, coach);
 				} else {
 					for(File submission:submissions) {
 						String[] params = new String[] {
-								getTaskName(task),		// {0}
-								displayName,				// {1}
-								submission.getName(),	// {2}
-								fullName					// {3}
+								getTaskName(task),		// 0
+								displayName,			// 1
+								submission.getName(),	// 2
+								fullName				// 3
 						};
 						appendSubscriptionItemForFile("notifications.submission.individual.doc", params, assessedIdentity,
 								"[submit:0]", submission, submissionDate, coach);
@@ -284,7 +294,10 @@ class GTANotifications {
 		RepositoryEntry entry = courseEnv.getCourseGroupManager().getCourseEntry();
 
 		Membership membership = gtaManager.getMembership(subscriberIdentity, entry, gtaNode);
-		boolean owner = repositoryService.hasRole(subscriberIdentity, entry, GroupRoles.owner.name());
+		Roles roles = securityManager.getRoles(subscriberIdentity);
+		RepositoryEntrySecurity reSecurity = repositoryManager.isAllowed(subscriberIdentity, roles, entry);
+		
+		boolean owner = reSecurity.isOwner() || reSecurity.isEntryAdmin();
 		if(owner) {
 			List<BusinessGroup> groups = gtaManager.getBusinessGroups(gtaNode);
 			for(BusinessGroup group:groups) {
@@ -342,11 +355,11 @@ class GTANotifications {
 					for(File submission:submisssions) {
 						String author = getAuthor(submission, submitContainer);
 						String[] params = new String[] {
-								getTaskName(task),		// {0}
-								displayName,				// {1}
-								submission.getName(),		// {2}
-								author,					// {3}
-								group.getName()					// {3}
+								getTaskName(task),		// 0
+								displayName,			// 1
+								submission.getName(),	// 2
+								author,					// 3
+								group.getName()			// 4
 						};
 						appendSubscriptionItemForFile("notifications.submission.group.doc", params, group,
 								"[submit:0]", submission, submissionDate, coach);
diff --git a/src/main/java/org/olat/course/nodes/gta/manager/GTANotificationsHandler.java b/src/main/java/org/olat/course/nodes/gta/manager/GTANotificationsHandler.java
index 0964bb83cf4..52df12fc9b3 100644
--- a/src/main/java/org/olat/course/nodes/gta/manager/GTANotificationsHandler.java
+++ b/src/main/java/org/olat/course/nodes/gta/manager/GTANotificationsHandler.java
@@ -23,6 +23,7 @@ import java.util.Date;
 import java.util.List;
 import java.util.Locale;
 
+import org.apache.logging.log4j.Logger;
 import org.olat.core.commons.services.notifications.NotificationsHandler;
 import org.olat.core.commons.services.notifications.NotificationsManager;
 import org.olat.core.commons.services.notifications.Publisher;
@@ -31,16 +32,10 @@ import org.olat.core.commons.services.notifications.SubscriptionInfo;
 import org.olat.core.commons.services.notifications.model.SubscriptionListItem;
 import org.olat.core.commons.services.notifications.model.TitleItem;
 import org.olat.core.gui.translator.Translator;
-import org.apache.logging.log4j.Logger;
 import org.olat.core.logging.Tracing;
 import org.olat.core.util.Util;
-import org.olat.course.nodes.gta.GTAManager;
 import org.olat.course.nodes.gta.ui.GTARunController;
-import org.olat.group.BusinessGroupService;
-import org.olat.modules.assessment.manager.AssessmentEntryDAO;
 import org.olat.repository.RepositoryManager;
-import org.olat.repository.RepositoryService;
-import org.olat.user.UserManager;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
@@ -56,19 +51,9 @@ public class GTANotificationsHandler implements NotificationsHandler  {
 	private static final Logger log = Tracing.createLoggerFor(GTANotificationsHandler.class);
 	protected static final String CSS_CLASS_ICON = "o_gta_icon";
 	
-	@Autowired
-	private GTAManager gtaManager;
-	@Autowired
-	private UserManager userManager;
 	@Autowired
 	private RepositoryManager repositoryManager;
 	@Autowired
-	private RepositoryService repositoryService;
-	@Autowired
-	private BusinessGroupService businessGroupService;
-	@Autowired
-	private AssessmentEntryDAO courseNodeAssessmentDao;
-	@Autowired
 	private NotificationsManager notificationsManager;
 
 	@Override
@@ -80,8 +65,7 @@ public class GTANotificationsHandler implements NotificationsHandler  {
 		// there could be news for me, investigate deeper
 		try {
 			if (notificationsManager.isPublisherValid(p) && compareDate.before(latestNews)) {
-				GTANotifications notifications = new GTANotifications(subscriber, false, locale, compareDate,
-						repositoryService, gtaManager, businessGroupService, userManager, courseNodeAssessmentDao);
+				GTANotifications notifications = new GTANotifications(subscriber, false, locale, compareDate);
 				List<SubscriptionListItem> items = notifications.getItems();
 				if(items.isEmpty()) {
 					si = notificationsManager.getNoSubscriptionInfo();
-- 
GitLab