diff --git a/src/main/java/org/olat/repository/RepositoryManager.java b/src/main/java/org/olat/repository/RepositoryManager.java index 0725828f44787c2336bbcf62eb87763df1bfb39a..7e85a24d218aa5fef0d8aad8fb0134f8ea8df06b 100644 --- a/src/main/java/org/olat/repository/RepositoryManager.java +++ b/src/main/java/org/olat/repository/RepositoryManager.java @@ -85,13 +85,10 @@ import org.olat.group.model.BGResourceRelation; import org.olat.repository.delete.service.RepositoryDeletionManager; import org.olat.repository.handlers.RepositoryHandler; import org.olat.repository.handlers.RepositoryHandlerFactory; -import org.olat.repository.model.RepositoryEntryMember; import org.olat.repository.model.RepositoryEntryMembership; import org.olat.repository.model.RepositoryEntryPermissionChangeEvent; import org.olat.repository.model.RepositoryEntryShortImpl; import org.olat.repository.model.RepositoryEntryStrictMember; -import org.olat.repository.model.RepositoryEntryStrictParticipant; -import org.olat.repository.model.RepositoryEntryStrictTutor; import org.olat.resource.OLATResource; import org.olat.resource.OLATResourceImpl; import org.olat.resource.OLATResourceManager; @@ -1927,17 +1924,37 @@ public class RepositoryManager extends BasicManager { */ //fxdiff VCRP-1,2: access control of resources public List<RepositoryEntry> getLearningResourcesAsStudent(Identity identity, int firstResult, int maxResults, RepositoryEntryOrder... orderby) { - StringBuilder sb = new StringBuilder(400); - sb.append("select v from ").append(RepositoryEntry.class.getName()).append(" v ") + StringBuilder sb = new StringBuilder(1200); + sb.append("select v from ").append(RepositoryEntry.class.getName()).append(" as v ") + .append(" inner join fetch v.olatResource as res ") + .append(" left join fetch v.ownerGroup as ownerGroup ") + .append(" inner join fetch v.participantGroup as participantGroup ") + .append(" left join fetch v.tutorGroup as tutorGroup ") + .append("where (v.access>=3 or (v.access=").append(RepositoryEntry.ACC_OWNERS).append(" and v.membersOnly=true))") + .append(" and (") + .append(" exists (from ").append(SecurityGroupMembershipImpl.class.getName()).append(" as vmember ") + .append(" where vmember.identity.key=:identityKey and vmember.securityGroup=participantGroup)") + .append(" or exists (from ").append(SecurityGroupMembershipImpl.class.getName()).append(" as vmember, ") + .append(" ").append(BGResourceRelation.class.getName()).append(" as bresource, ") + .append(" ").append(BusinessGroupImpl.class.getName()).append(" as bgroup") + .append(" where bgroup.partipiciantGroup=vmember.securityGroup and res=bresource.resource and bgroup=bresource.group and vmember.identity=:identityKey") + .append(" )") + .append(" )"); + + /* query based on permission + StringBuilder sb3 = new StringBuilder(400); + sb3.append("select v from ").append(RepositoryEntry.class.getName()).append(" v ") .append(" inner join fetch v.olatResource as res") .append(" left join fetch v.ownerGroup as ownerGroup") .append(" inner join fetch v.participantGroup as participantGroup") .append(" left join fetch v.tutorGroup as tutorGroup") - .append(" where v.key in (select distinct(vmember.key) from ").append(RepositoryEntryStrictParticipant.class.getName()).append(" vmember") - .append(" where (vmember.repoParticipantKey=:identityKey or vmember.groupParticipantKey=:identityKey)") + .append(" where exists (from ").append(PolicyImpl.class.getName()).append(" as poi,") + .append(" ").append(SecurityGroupMembershipImpl.class.getName()).append(" as sgmsi") + .append(" where sgmsi.identity.key=:identityKey and sgmsi.securityGroup=poi.securityGroup") + .append(" and poi.permission='access' and poi.olatResource=res") .append(" ))"); - appendOrderBy(sb, "v", orderby); - + */ + TypedQuery<RepositoryEntry> query = dbInstance.getCurrentEntityManager() .createQuery(sb.toString(), RepositoryEntry.class) .setParameter("identityKey", identity.getKey()) @@ -1945,7 +1962,7 @@ public class RepositoryManager extends BasicManager { if(maxResults > 0) { query.setMaxResults(maxResults); } - List<RepositoryEntry> repoEntries = query.getResultList(); + List<RepositoryEntry> repoEntries = query.getResultList(); return repoEntries; } @@ -1957,21 +1974,25 @@ public class RepositoryManager extends BasicManager { * @param identity * @return list of RepositoryEntries */ - public int countLearningResourcesAsTeacher(Identity identity) { - StringBuilder sb = new StringBuilder(400); - sb.append("select count(v) from ").append(RepositoryEntry.class.getName()).append(" v ") - .append(" inner join v.olatResource as res "); - whereClauseLearningResourcesAsTeacher(sb); - + public boolean hasLearningResourcesAsTeacher(Identity identity) { + /* + StringBuilder sb = new StringBuilder(1200); + sb.append("select count(v.key) from ").append(RepositoryEntry.class.getName()).append(" v ") + .append(" inner join v.olatResource as res ") + .append(" left join v.ownerGroup as ownerGroup") + .append(" left join v.tutorGroup as tutorGroup"); + whereClauseLearningResourcesAsTeacher(sb); Number count = dbInstance.getCurrentEntityManager() .createQuery(sb.toString(), Number.class) .setParameter("identityKey", identity.getKey()) .getSingleResult(); - return count.intValue(); + */ + List<RepositoryEntry> repos = getLearningResourcesAsTeacher(identity, 0, 1); + return !repos.isEmpty(); } public List<RepositoryEntry> getLearningResourcesAsTeacher(Identity identity, int firstResult, int maxResults, RepositoryEntryOrder... orderby) { - StringBuilder sb = new StringBuilder(400); + StringBuilder sb = new StringBuilder(1200); sb.append("select distinct v from ").append(RepositoryEntry.class.getName()).append(" v ") .append(" inner join fetch v.olatResource as res ") .append(" left join fetch v.ownerGroup as ownerGroup") @@ -1996,7 +2017,9 @@ public class RepositoryManager extends BasicManager { * @param sb */ private final void whereClauseLearningResourcesAsTeacher(StringBuilder sb) { - sb.append(" where v.key in (select distinct(vmember.key) from ").append(RepositoryEntryStrictTutor.class.getName()).append(" vmember") + /* + StringBuilder s2 = new StringBuilder(); + s2.append(" where v.key in (select distinct(vmember.key) from ").append(RepositoryEntryStrictTutor.class.getName()).append(" vmember") .append(" where (vmember.repoOwnerKey=:identityKey or vmember.repoTutorKey=:identityKey or vmember.groupOwnerKey=:identityKey)") .append(" )") .append(" or ") @@ -2008,6 +2031,20 @@ public class RepositoryManager extends BasicManager { .append(" and poi.permission = 'bgr.editor' and poi.olatResource = ori") .append(" and groupRelation.resource=ori") .append(" )"); + */ + + sb.append(" where (v.access>=3 or (v.access=").append(RepositoryEntry.ACC_OWNERS).append(" and v.membersOnly=true))") + .append(" and (exists (from ").append(PolicyImpl.class.getName()).append(" as poi,") + .append(" ").append(SecurityGroupMembershipImpl.class.getName()).append(" as sgmsi") + .append(" where sgmsi.identity.key=:identityKey and sgmsi.securityGroup=poi.securityGroup") + .append(" and poi.permission='bgr.editor' and poi.olatResource=res") + .append(" ) or exists (from ").append(SecurityGroupMembershipImpl.class.getName()).append(" as vmember ") + .append(" where vmember.identity.key=:identityKey and (vmember.securityGroup=tutorGroup or vmember.securityGroup=ownerGroup)") + .append(" ) or exists (from ").append(SecurityGroupMembershipImpl.class.getName()).append(" as vmember, ") + .append(" ").append(BGResourceRelation.class.getName()).append(" as bresource, ") + .append(" ").append(BusinessGroupImpl.class.getName()).append(" as bgroup") + .append(" where bgroup.ownerGroup=vmember.securityGroup and res=bresource.resource and bgroup=bresource.group and vmember.identity=:identityKey") + .append(" ))"); } /** diff --git a/src/main/java/org/olat/repository/controllers/RepositoryMainController.java b/src/main/java/org/olat/repository/controllers/RepositoryMainController.java index 4c91c4c374dcfdba8de0d77dde4c4c95bb1968c9..e49e73af49f1ce165238b310a8625cccc982b46f 100644 --- a/src/main/java/org/olat/repository/controllers/RepositoryMainController.java +++ b/src/main/java/org/olat/repository/controllers/RepositoryMainController.java @@ -71,7 +71,6 @@ import org.olat.fileresource.types.ScormCPFileResource; import org.olat.fileresource.types.SharedFolderFileResource; import org.olat.fileresource.types.WikiResource; import org.olat.group.BusinessGroupService; -import org.olat.group.model.SearchBusinessGroupParams; import org.olat.ims.qti.fileresource.SurveyFileResource; import org.olat.ims.qti.fileresource.TestFileResource; import org.olat.portfolio.EPTemplateMapResource; @@ -292,7 +291,7 @@ public class RepositoryMainController extends MainLayoutBasicController implemen node.setCssClass("o_sel_repo_my_student"); rootNode.addChild(node); // for authors or users with group rights also show the teacher portlet - if(bIsAuthor || RepositoryManager.getInstance().countLearningResourcesAsTeacher(getIdentity()) > 0) { + if(bIsAuthor || RepositoryManager.getInstance().hasLearningResourcesAsTeacher(getIdentity())) { node = new GenericTreeNode(translate("search.mycourses.teacher"), "search.mycourses.teacher"); node.setCssClass("o_sel_repo_my_teacher"); rootNode.addChild(node);