diff --git a/src/main/java/org/olat/modules/lecture/manager/LectureBlockDAO.java b/src/main/java/org/olat/modules/lecture/manager/LectureBlockDAO.java index adbdae48485828abc8b2034e09c8aa7a9ed8aae9..aa4cfaf7d685c42076f409f8b29d8c37cf76e2e5 100644 --- a/src/main/java/org/olat/modules/lecture/manager/LectureBlockDAO.java +++ b/src/main/java/org/olat/modules/lecture/manager/LectureBlockDAO.java @@ -272,6 +272,7 @@ public class LectureBlockDAO { .append(" from curriculumelement curEl") .append(" inner join fetch curEl.group curElGroup") .append(" inner join fetch curEl.curriculum cur") + .append(" left join fetch cur.organisation organis") .append(" where exists (select v.key from repositoryentry as v") .append(" inner join v.groups as relGroup") .append(" inner join lectureentryconfig config on (config.entry.key=v.key)") @@ -285,7 +286,7 @@ public class LectureBlockDAO { ref = searchParams.getSearchString(); fuzzyRef = PersistenceHelper.makeFuzzyQueryString(ref); - sb.append(" and (cur.externalId=:ref or curEl.externalId=:ref or v.externalId=:ref or ") + sb.append(" and (cur.externalId=:ref or curEl.externalId=:ref or ") .likeFuzzy("cur.displayName", "fuzzyRef", dbInstance.getDbVendor()) .append(" or ") .likeFuzzy("cur.identifier", "fuzzyRef", dbInstance.getDbVendor()) @@ -300,6 +301,31 @@ public class LectureBlockDAO { sb.append(")"); } + if(searchParams.getManager() != null) { + sb.append(" and exists (select membership.key from bgroupmember as membership") + .append(" where membership.identity.key=:managerKey") + .append(" and membership.role").in(OrganisationRoles.administrator, LectureRoles.lecturemanager) + .append(" and (membership.group.key=curElGroup.key or membership.group.key=organis.group.key)") + .append(" )"); + } + + if(searchParams.getMasterCoach() != null) { + sb.append(" and exists (select masterCoachMembership.key from bgroupmember as masterCoachMembership") + .append(" where curElGroup.key=masterCoachMembership.group.key and masterCoachMembership.identity.key=:masterCoachKey") + .append(" and masterCoachMembership.role ").in(LectureRoles.mastercoach) + .append(" )"); + } + + if(searchParams.getTeacher() != null) { + sb.append(" and exists (select teacherMembership.key from lectureblock as block") + .append(" inner join block.teacherGroup tGroup") + .append(" inner join tGroup.members teacherMembership") + .append(" inner join repoentrytogroup as rel on (block.entry.key=rel.entry.key)") + .append(" where curElGroup.key=rel.group.key and teacherMembership.identity.key=:teacherKey") + .append(" and teacherMembership.role ").in(LectureRoles.teacher) + .append(" )"); + } + TypedQuery<Object[]> query = dbInstance.getCurrentEntityManager() .createQuery(sb.toString(), Object[].class); if(key != null) { @@ -311,6 +337,15 @@ public class LectureBlockDAO { if(fuzzyRef != null) { query.setParameter("fuzzyRef", fuzzyRef); } + if(searchParams.getManager() != null) { + query.setParameter("managerKey", searchParams.getManager().getKey()); + } + if(searchParams.getMasterCoach() != null) { + query.setParameter("masterCoachKey", searchParams.getMasterCoach().getKey()); + } + if(searchParams.getTeacher() != null) { + query.setParameter("teacherKey", searchParams.getTeacher().getKey()); + } List<Object[]> rawObjects = query.getResultList(); return rawObjects.stream().map(objects diff --git a/src/main/java/org/olat/modules/lecture/model/LectureCurriculumElementSearchParameters.java b/src/main/java/org/olat/modules/lecture/model/LectureCurriculumElementSearchParameters.java index 9d7fd196a9fc7decd63a9fdfc66cc5dd23c8d2b4..910b92a9deadf505b52dbbbe29cfe62c4da09670 100644 --- a/src/main/java/org/olat/modules/lecture/model/LectureCurriculumElementSearchParameters.java +++ b/src/main/java/org/olat/modules/lecture/model/LectureCurriculumElementSearchParameters.java @@ -19,6 +19,9 @@ */ package org.olat.modules.lecture.model; +import org.olat.basesecurity.IdentityRef; +import org.olat.modules.lecture.ui.LectureRoles; + /** * * Initial date: 9 août 2019<br> @@ -27,6 +30,10 @@ package org.olat.modules.lecture.model; */ public class LectureCurriculumElementSearchParameters { + private IdentityRef teacher; + private IdentityRef masterCoach; + private IdentityRef manager; + private String searchString; public String getSearchString() { @@ -37,6 +44,36 @@ public class LectureCurriculumElementSearchParameters { this.searchString = searchString; } + public IdentityRef getTeacher() { + return teacher; + } + + public void setTeacher(IdentityRef teacher) { + this.teacher = teacher; + } + + public IdentityRef getMasterCoach() { + return masterCoach; + } + public void setMasterCoach(IdentityRef masterCoach) { + this.masterCoach = masterCoach; + } + + public IdentityRef getManager() { + return manager; + } + + public void setManager(IdentityRef manager) { + this.manager = manager; + } + + public void setViewAs(IdentityRef identity, LectureRoles role) { + switch(role) { + case lecturemanager: setManager(identity); break; + case mastercoach: setMasterCoach(identity); break; + default: setTeacher(identity); break; + } + } } diff --git a/src/main/java/org/olat/modules/lecture/ui/coach/CurriculumElementsListController.java b/src/main/java/org/olat/modules/lecture/ui/coach/CurriculumElementsListController.java index 1b26f245fca0af4cc61f3761fd0dace2caa0e001..5f6128913de07371797d7a5318c28fe5047e482a 100644 --- a/src/main/java/org/olat/modules/lecture/ui/coach/CurriculumElementsListController.java +++ b/src/main/java/org/olat/modules/lecture/ui/coach/CurriculumElementsListController.java @@ -41,6 +41,7 @@ import org.olat.modules.lecture.LectureService; import org.olat.modules.lecture.model.LectureCurriculumElementInfos; import org.olat.modules.lecture.model.LectureCurriculumElementSearchParameters; import org.olat.modules.lecture.ui.LectureRepositoryAdminController; +import org.olat.modules.lecture.ui.LecturesSecurityCallback; import org.olat.modules.lecture.ui.coach.CurriculumElementsTableModel.LectureCurriculumCols; import org.olat.modules.lecture.ui.event.SelectLectureCurriculumElementEvent; import org.springframework.beans.factory.annotation.Autowired; @@ -52,6 +53,8 @@ import org.springframework.beans.factory.annotation.Autowired; * */ public class CurriculumElementsListController extends FormBasicController { + + private final LecturesSecurityCallback secCallback; private FlexiTableElement tableEl; private CurriculumElementsTableModel tableModel; @@ -59,10 +62,10 @@ public class CurriculumElementsListController extends FormBasicController { @Autowired private LectureService lectureService; - public CurriculumElementsListController(UserRequest ureq, WindowControl wControl) { + public CurriculumElementsListController(UserRequest ureq, WindowControl wControl, LecturesSecurityCallback secCallback) { super(ureq, wControl, "curriculums", Util.createPackageTranslator(CurriculumSearchManagerController.class, ureq.getLocale())); setTranslator(Util.createPackageTranslator(LectureRepositoryAdminController.class, getLocale(), getTranslator())); - + this.secCallback = secCallback; initForm(ureq); } @@ -112,6 +115,7 @@ public class CurriculumElementsListController extends FormBasicController { private void loadModel(String searchString) { LectureCurriculumElementSearchParameters searchParams = new LectureCurriculumElementSearchParameters(); searchParams.setSearchString(searchString); + searchParams.setViewAs(getIdentity(), secCallback.viewAs()); List<LectureCurriculumElementInfos> infos = lectureService.searchCurriculumElements(searchParams); tableModel.setObjects(infos); tableEl.reset(true, true, true); diff --git a/src/main/java/org/olat/modules/lecture/ui/coach/CurriculumsSearchController.java b/src/main/java/org/olat/modules/lecture/ui/coach/CurriculumsSearchController.java index e32eb84337a29d1bdaf94fd7c47c7b794f7a1940..08d424ccf81737a92550f6a3bf5aa33cebc7d2bc 100644 --- a/src/main/java/org/olat/modules/lecture/ui/coach/CurriculumsSearchController.java +++ b/src/main/java/org/olat/modules/lecture/ui/coach/CurriculumsSearchController.java @@ -71,7 +71,7 @@ public class CurriculumsSearchController extends BasicController { super(ureq, wControl, Util.createPackageTranslator(LectureRepositoryAdminController.class, ureq.getLocale())); this.secCallback = secCallback; - elementsSearchCtrl = new CurriculumElementsListController(ureq, getWindowControl()); + elementsSearchCtrl = new CurriculumElementsListController(ureq, getWindowControl(), secCallback); listenTo(elementsSearchCtrl); panel = new BreadcrumbedStackedPanel("c-search", getTranslator(), this); panel.pushController(translate("search.curriculums"), elementsSearchCtrl); diff --git a/src/test/java/org/olat/modules/lecture/manager/LectureBlockDAOTest.java b/src/test/java/org/olat/modules/lecture/manager/LectureBlockDAOTest.java index d1a28d8cb382b97be4a19f20528e3f2014d193b7..15e974bd7fe9ec27f786b878f0d885ab4587811c 100644 --- a/src/test/java/org/olat/modules/lecture/manager/LectureBlockDAOTest.java +++ b/src/test/java/org/olat/modules/lecture/manager/LectureBlockDAOTest.java @@ -24,20 +24,30 @@ import java.util.Collections; import java.util.Date; import java.util.List; import java.util.Set; +import java.util.UUID; import org.junit.Assert; import org.junit.Test; import org.olat.basesecurity.Group; import org.olat.basesecurity.GroupRoles; import org.olat.basesecurity.OrganisationRoles; +import org.olat.basesecurity.OrganisationService; import org.olat.commons.calendar.CalendarUtils; import org.olat.core.commons.persistence.DB; import org.olat.core.id.Identity; +import org.olat.core.id.Organisation; import org.olat.course.assessment.AssessmentMode; import org.olat.course.assessment.AssessmentModeManager; import org.olat.group.BusinessGroup; import org.olat.group.BusinessGroupService; import org.olat.group.manager.BusinessGroupRelationDAO; +import org.olat.modules.curriculum.Curriculum; +import org.olat.modules.curriculum.CurriculumCalendars; +import org.olat.modules.curriculum.CurriculumElement; +import org.olat.modules.curriculum.CurriculumElementStatus; +import org.olat.modules.curriculum.CurriculumLectures; +import org.olat.modules.curriculum.CurriculumRoles; +import org.olat.modules.curriculum.CurriculumService; import org.olat.modules.lecture.LectureBlock; import org.olat.modules.lecture.LectureBlockRef; import org.olat.modules.lecture.LectureBlockStatus; @@ -48,6 +58,8 @@ import org.olat.modules.lecture.RepositoryEntryLectureConfiguration; import org.olat.modules.lecture.model.LectureBlockImpl; import org.olat.modules.lecture.model.LectureBlockToGroupImpl; import org.olat.modules.lecture.model.LectureBlockWithTeachers; +import org.olat.modules.lecture.model.LectureCurriculumElementInfos; +import org.olat.modules.lecture.model.LectureCurriculumElementSearchParameters; import org.olat.modules.lecture.model.LectureReportRow; import org.olat.modules.lecture.model.LectureRepositoryEntryInfos; import org.olat.modules.lecture.model.LectureRepositoryEntrySearchParameters; @@ -78,6 +90,10 @@ public class LectureBlockDAOTest extends OlatTestCase { @Autowired private RepositoryService repositoryService; @Autowired + private CurriculumService curriculumService; + @Autowired + private OrganisationService organisationService; + @Autowired private AssessmentModeManager assessmentModeManager; @Autowired private RepositoryEntryRelationDAO repositoryEntryRelationDao; @@ -465,6 +481,128 @@ public class LectureBlockDAOTest extends OlatTestCase { Assert.assertEquals(entry, infos.get(0).getEntry()); } + @Test + public void searchCurriculumElements_byTeacher() { + Identity teacher = JunitTestHelper.createAndPersistIdentityAsRndUser("teacher-23"); + Identity participant = JunitTestHelper.createAndPersistIdentityAsRndUser("cur-participant-23a"); + RepositoryEntry entry = createResourceWithLecturesEnabled(); + LectureBlock lectureBlock = createMinimalLectureBlock(entry); + dbInstance.commit(); + lectureService.addTeacher(lectureBlock, teacher); + + String elementId = UUID.randomUUID().toString(); + Curriculum curriculum = curriculumService.createCurriculum("Lectures-cur-1", "Curriculum with lectures 2", "Curriculum", null); + CurriculumElement element = curriculumService.createCurriculumElement(elementId, "Element for relation", CurriculumElementStatus.active, + null, null, null, null, CurriculumCalendars.disabled, CurriculumLectures.enabled, curriculum); + curriculumService.addRepositoryEntry(element, entry, false); + curriculumService.addMember(element, participant, CurriculumRoles.participant); + lectureService.save(lectureBlock, Collections.singletonList(element.getGroup())); + dbInstance.commitAndCloseSession(); + + LectureCurriculumElementSearchParameters searchParams = new LectureCurriculumElementSearchParameters(); + searchParams.setSearchString(elementId); + searchParams.setViewAs(teacher, LectureRoles.teacher); + + List<LectureCurriculumElementInfos> infos = lectureBlockDao.searchCurriculumElements(searchParams); + Assert.assertNotNull(infos); + Assert.assertEquals(1, infos.size()); + Assert.assertEquals(curriculum, infos.get(0).getCurriculum()); + Assert.assertEquals(element, infos.get(0).getElement()); + Assert.assertEquals(1, infos.get(0).getNumOfParticipants()); + } + + @Test + public void searchCurriculumElements_byTeacher_negativeTest() { + Identity teacher = JunitTestHelper.createAndPersistIdentityAsRndUser("not-teacher-23"); + RepositoryEntry entry = createResourceWithLecturesEnabled(); + LectureBlock lectureBlock = createMinimalLectureBlock(entry); + dbInstance.commit(); + repositoryEntryRelationDao.addRole(teacher, entry, GroupRoles.owner.name()); + Assert.assertNotNull(lectureBlock); + + String elementId = UUID.randomUUID().toString(); + Curriculum curriculum = curriculumService.createCurriculum("Lectures-cur-2", "Curriculum with lectures 2", "Curriculum", null); + CurriculumElement element = curriculumService.createCurriculumElement(elementId, "Element for relation", CurriculumElementStatus.active, + null, null, null, null, CurriculumCalendars.disabled, CurriculumLectures.enabled, curriculum); + curriculumService.addRepositoryEntry(element, entry, false); + dbInstance.commitAndCloseSession(); + + LectureCurriculumElementSearchParameters searchParams = new LectureCurriculumElementSearchParameters(); + searchParams.setSearchString(elementId); + searchParams.setViewAs(teacher, LectureRoles.teacher); + + List<LectureCurriculumElementInfos> infos = lectureBlockDao.searchCurriculumElements(searchParams); + Assert.assertNotNull(infos); + Assert.assertTrue(infos.isEmpty()); + } + + @Test + public void searchCurriculumElements_byMasterCoach() { + Identity masterCoach = JunitTestHelper.createAndPersistIdentityAsRndUser("masterCoach-23"); + Identity participant1 = JunitTestHelper.createAndPersistIdentityAsRndUser("cur-participant-23a"); + Identity participant2 = JunitTestHelper.createAndPersistIdentityAsRndUser("cur-participant-23b"); + RepositoryEntry entry = createResourceWithLecturesEnabled(); + LectureBlock lectureBlock = createMinimalLectureBlock(entry); + dbInstance.commit(); + + String elementId = UUID.randomUUID().toString(); + Curriculum curriculum = curriculumService.createCurriculum("Lectures-cur-1", "Curriculum with lectures 2", "Curriculum", null); + CurriculumElement element = curriculumService.createCurriculumElement(elementId, "Element for relation", CurriculumElementStatus.active, + null, null, null, null, CurriculumCalendars.disabled, CurriculumLectures.enabled, curriculum); + curriculumService.addRepositoryEntry(element, entry, false); + dbInstance.commit(); + curriculumService.addMember(element, masterCoach, CurriculumRoles.mastercoach); + curriculumService.addMember(element, participant1, CurriculumRoles.participant); + curriculumService.addMember(element, participant2, CurriculumRoles.participant); + lectureService.save(lectureBlock, Collections.singletonList(element.getGroup())); + dbInstance.commitAndCloseSession(); + + LectureCurriculumElementSearchParameters searchParams = new LectureCurriculumElementSearchParameters(); + searchParams.setSearchString(elementId); + searchParams.setViewAs(masterCoach, LectureRoles.mastercoach); + + List<LectureCurriculumElementInfos> infos = lectureBlockDao.searchCurriculumElements(searchParams); + Assert.assertNotNull(infos); + Assert.assertEquals(1, infos.size()); + Assert.assertEquals(curriculum, infos.get(0).getCurriculum()); + Assert.assertEquals(element, infos.get(0).getElement()); + Assert.assertEquals(2, infos.get(0).getNumOfParticipants()); + } + + @Test + public void searchCurriculumElements_byManager() { + Identity lectureManager = JunitTestHelper.createAndPersistIdentityAsRndUser("lectureMgr-23"); + Identity participant1 = JunitTestHelper.createAndPersistIdentityAsRndUser("cur-participant-23a"); + Identity participant2 = JunitTestHelper.createAndPersistIdentityAsRndUser("cur-participant-23b"); + RepositoryEntry entry = createResourceWithLecturesEnabled(); + LectureBlock lectureBlock = createMinimalLectureBlock(entry); + dbInstance.commit(); + + String elementId = UUID.randomUUID().toString(); + Organisation curOrganisation = organisationService.createOrganisation("cur-lecture", "cur-lecture", null, null, null); + Curriculum curriculum = curriculumService.createCurriculum("Lectures-cur-1", "Curriculum with lectures 2", "Curriculum", curOrganisation); + CurriculumElement element = curriculumService.createCurriculumElement(elementId, "Element for relation", CurriculumElementStatus.active, + null, null, null, null, CurriculumCalendars.disabled, CurriculumLectures.enabled, curriculum); + curriculumService.addRepositoryEntry(element, entry, false); + dbInstance.commit(); + organisationService.addMember(curOrganisation, lectureManager, OrganisationRoles.lecturemanager); + curriculumService.addMember(element, participant1, CurriculumRoles.participant); + curriculumService.addMember(element, participant2, CurriculumRoles.participant); + lectureService.save(lectureBlock, Collections.singletonList(element.getGroup())); + dbInstance.commitAndCloseSession(); + + LectureCurriculumElementSearchParameters searchParams = new LectureCurriculumElementSearchParameters(); + searchParams.setSearchString(elementId); + searchParams.setViewAs(lectureManager, LectureRoles.lecturemanager); + + List<LectureCurriculumElementInfos> infos = lectureBlockDao.searchCurriculumElements(searchParams); + Assert.assertNotNull(infos); + Assert.assertEquals(1, infos.size()); + Assert.assertEquals(curriculum, infos.get(0).getCurriculum()); + Assert.assertEquals(element, infos.get(0).getElement()); + Assert.assertEquals(2, infos.get(0).getNumOfParticipants()); + } + @Test public void getLecturesBlockWithTeachers() { Identity teacher = JunitTestHelper.createAndPersistIdentityAsRndUser("teacher-23");