Skip to content
Snippets Groups Projects
Commit e181750e authored by srosse's avatar srosse
Browse files

OO-4150: implements permission curriculum search and unit tests

parent 2a2a2710
No related branches found
No related tags found
No related merge requests found
......@@ -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
......
......@@ -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;
}
}
}
......@@ -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);
......
......@@ -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);
......
......@@ -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");
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment