diff --git a/src/main/java/de/bps/olat/repository/controllers/RepositorySearchMultiSelectController.java b/src/main/java/de/bps/olat/repository/controllers/RepositorySearchMultiSelectController.java index bf887d029319fe1b1072587b2bb7a16a1f0239f1..2a151ce634154a57a81443b5f8d0f1c7abf38d2d 100644 --- a/src/main/java/de/bps/olat/repository/controllers/RepositorySearchMultiSelectController.java +++ b/src/main/java/de/bps/olat/repository/controllers/RepositorySearchMultiSelectController.java @@ -109,7 +109,7 @@ public class RepositorySearchMultiSelectController extends RepositorySearchContr vc.contextPut("withCancel", Boolean.valueOf(withCancel)); enableBackToSearchFormLink(false); // default, must be enabled explicitly - enableSearchforAllReferencalbeInSearchForm(false); // default + enableSearchforAllXXAbleInSearchForm(null); // default putInitialPanel(vc); } diff --git a/src/main/java/org/olat/group/ui/edit/BusinessGroupEditResourceController.java b/src/main/java/org/olat/group/ui/edit/BusinessGroupEditResourceController.java index 706343fc261f762a4887a57e067017d5c03d9fcb..ac8b8fe76e438f85a72c394847363a175e2d70f1 100644 --- a/src/main/java/org/olat/group/ui/edit/BusinessGroupEditResourceController.java +++ b/src/main/java/org/olat/group/ui/edit/BusinessGroupEditResourceController.java @@ -59,6 +59,7 @@ import org.olat.repository.RepositoryEntryManagedFlag; import org.olat.repository.RepositoryTableModel; import org.olat.repository.controllers.ReferencableEntriesSearchController; import org.olat.repository.controllers.RepositoryEntryFilter; +import org.olat.repository.controllers.RepositorySearchController.Can; /** * Description:<BR> @@ -137,7 +138,7 @@ public class BusinessGroupEditResourceController extends BasicController impleme RepositoryEntryFilter filter = new ManagedEntryfilter(); repoSearchCtr = new ReferencableEntriesSearchController(getWindowControl(), ureq, new String[]{ CourseModule.getCourseTypeName() }, filter, - translate("resources.add"), true, true, true, true, true); + translate("resources.add"), true, true, true, true, true, Can.referenceable); listenTo(repoSearchCtr); cmc = new CloseableModalController(getWindowControl(), translate("close"), repoSearchCtr.getInitialComponent(), true, translate("resources.add.title")); listenTo(cmc); diff --git a/src/main/java/org/olat/modules/qpool/ui/QuestionListController.java b/src/main/java/org/olat/modules/qpool/ui/QuestionListController.java index bfcc0b76ab89536aff42a164420660b2b8b993a1..41ca142f0fd2c9f9cfe6e5a1f5803a4f54fdfe1a 100644 --- a/src/main/java/org/olat/modules/qpool/ui/QuestionListController.java +++ b/src/main/java/org/olat/modules/qpool/ui/QuestionListController.java @@ -71,6 +71,7 @@ import org.olat.repository.controllers.EntryChangedEvent; import org.olat.repository.controllers.ReferencableEntriesSearchController; import org.olat.repository.controllers.RepositoryAddController; import org.olat.repository.controllers.RepositoryDetailsController; +import org.olat.repository.controllers.RepositorySearchController.Can; /** * @@ -530,7 +531,7 @@ public class QuestionListController extends AbstractItemListController implement removeAsListenerAndDispose(importTestCtrl); String[] allowed = new String[]{ TestFileResource.TYPE_NAME, SurveyFileResource.TYPE_NAME }; importTestCtrl = new ReferencableEntriesSearchController(getWindowControl(), ureq, allowed, - translate("import.repository"), false, false, false, false, true); + null, translate("import.repository"), false, false, false, false, true, Can.copyable); listenTo(importTestCtrl); cmc = new CloseableModalController(getWindowControl(), translate("close"), diff --git a/src/main/java/org/olat/repository/RepositoryManager.java b/src/main/java/org/olat/repository/RepositoryManager.java index 1b84b52097b1b7b5f49efc219b4489d944a10287..7bc715693f9dc6cb5aa054f41bd0d8c7e3431fb4 100644 --- a/src/main/java/org/olat/repository/RepositoryManager.java +++ b/src/main/java/org/olat/repository/RepositoryManager.java @@ -1175,11 +1175,36 @@ public class RepositoryManager extends BasicManager { // if user has no author right he can not reference to any resource at all return new ArrayList<RepositoryEntry>(); } - return queryResourcesLimitType(identity, resourceTypes, displayName, author, desc); + return queryResourcesLimitType(identity, resourceTypes, displayName, author, desc, true, false); + } + + /** + * Search for resources that can be copied by an author. This is the case: + * 1) the user is the owner of the resource + * 2) the user is author and the resource is at least visible to authors (BA) + * and the resource is set to canCopy + * @param identity The user initiating the query + * @param roles The current users role set + * @param resourceTypes Limit search result to this list of repo types. Can be NULL + * @param displayName Limit search to this repo title. Can be NULL + * @param author Limit search to this user (Name, firstname, loginname). Can be NULL + * @param desc Limit search to description. Can be NULL + * @return List of repository entries + */ + public List<RepositoryEntry> queryCopyableResourcesLimitType(Identity identity, Roles roles, List<String> resourceTypes, + String displayName, String author, String desc) { + if (identity == null) { + throw new AssertException("identity can not be null!"); + } + if (!roles.isAuthor()) { + // if user has no author right he can not reference to any resource at all + return new ArrayList<RepositoryEntry>(); + } + return queryResourcesLimitType(identity, resourceTypes, displayName, author, desc, false, true); } public List<RepositoryEntry> queryResourcesLimitType(Identity identity, List<String> resourceTypes, - String displayName, String author, String desc) { + String displayName, String author, String desc, boolean checkCanReference, boolean checkCanCopy) { // cleanup some data: use null values if emtpy if (resourceTypes != null && resourceTypes.size() == 0) resourceTypes = null; @@ -1214,7 +1239,15 @@ public class RepositoryManager extends BasicManager { int access; if(identity != null) { access = RepositoryEntry.ACC_OWNERS_AUTHORS; - query.append(" sgmsi.identity = :identity or (v.access>=:access and v.canReference = true) "); + + query.append(" sgmsi.identity = :identity or (v.access>=:access "); + if(checkCanReference) { + query.append(" and v.canReference = true "); + } + if(checkCanCopy) { + query.append(" and v.canCopy = true "); + } + query.append(")"); } else { access = RepositoryEntry.ACC_OWNERS; query.append(" v.access>=:access "); diff --git a/src/main/java/org/olat/repository/controllers/ReferencableEntriesSearchController.java b/src/main/java/org/olat/repository/controllers/ReferencableEntriesSearchController.java index d561a53f783cddf9b2439a912e1d1f6f9a34d715..ed7b88411fd165223c0667d8aaa88516315da198 100644 --- a/src/main/java/org/olat/repository/controllers/ReferencableEntriesSearchController.java +++ b/src/main/java/org/olat/repository/controllers/ReferencableEntriesSearchController.java @@ -58,6 +58,7 @@ import org.olat.portfolio.EPTemplateMapResource; import org.olat.repository.RepositoryEntry; import org.olat.repository.RepositoryManager; import org.olat.repository.RepositoryTableModel; +import org.olat.repository.controllers.RepositorySearchController.Can; import org.olat.repository.handlers.RepositoryHandler; import org.olat.repository.handlers.RepositoryHandlerFactory; @@ -100,26 +101,29 @@ public class ReferencableEntriesSearchController extends BasicController { private final boolean canImport; private final boolean canCreate; + private final Can canBe; public ReferencableEntriesSearchController(WindowControl wControl, UserRequest ureq, String limitType, String commandLabel) { - this(wControl, ureq, new String[]{limitType}, null, commandLabel, true, true, true, false, false); + this(wControl, ureq, new String[]{limitType}, null, commandLabel, true, true, true, false, false, Can.referenceable); setBasePackage(RepositoryManager.class); } public ReferencableEntriesSearchController(WindowControl wControl, UserRequest ureq, String[] limitTypes, String commandLabel) { - this(wControl, ureq, limitTypes, null, commandLabel, true, true, true, false, false); + this(wControl, ureq, limitTypes, null, commandLabel, true, true, true, false, false, Can.referenceable); } public ReferencableEntriesSearchController(WindowControl wControl, UserRequest ureq, String[] limitTypes, String commandLabel, boolean canImport, boolean canCreate, boolean canDirectLaunch, boolean multiSelect, boolean adminSearch) { - this(wControl, ureq, limitTypes, null, commandLabel, canImport, canCreate, canDirectLaunch, multiSelect, adminSearch); + this(wControl, ureq, limitTypes, null, commandLabel, canImport, canCreate, canDirectLaunch, multiSelect, adminSearch, Can.referenceable); } public ReferencableEntriesSearchController(WindowControl wControl, UserRequest ureq, String[] limitTypes, RepositoryEntryFilter filter, String commandLabel, - boolean canImport, boolean canCreate, boolean canDirectLaunch, boolean multiSelect, boolean adminSearch) { + boolean canImport, boolean canCreate, boolean canDirectLaunch, boolean multiSelect, boolean adminSearch, + Can canBe) { super(ureq, wControl); + this.canBe = canBe; this.canImport = canImport; this.canCreate = canCreate; this.limitTypes = limitTypes; @@ -162,7 +166,7 @@ public class ReferencableEntriesSearchController extends BasicController { } searchCtr.doSearchByOwnerLimitType(ureq.getIdentity(), limitTypes); - searchCtr.enableSearchforAllReferencalbeInSearchForm(true); + searchCtr.enableSearchforAllXXAbleInSearchForm(canBe); mainVC.put("searchCtr", searchCtr.getInitialComponent()); putInitialPanel(mainVC); @@ -335,7 +339,14 @@ public class ReferencableEntriesSearchController extends BasicController { if (clickedLink == myEntriesLink) { searchCtr.doSearchByOwnerLimitType(ureq.getIdentity(), limitTypes); } else if (clickedLink == allEntriesLink){ - searchCtr.doSearchForReferencableResourcesLimitType(ureq.getIdentity(), limitTypes, ureq.getUserSession().getRoles()); + switch(canBe) { + case referenceable: + searchCtr.doSearchForReferencableResourcesLimitType(ureq.getIdentity(), limitTypes, ureq.getUserSession().getRoles()); + break; + case copyable: + searchCtr.doSearchForCopyableResourcesLimitType(ureq.getIdentity(), limitTypes, ureq.getUserSession().getRoles()); + break; + } } else if (clickedLink == searchEntriesLink){ searchCtr.displaySearchForm(); } else if (clickedLink == adminEntriesLink) { @@ -440,5 +451,4 @@ public class ReferencableEntriesSearchController extends BasicController { protected void doDispose() { // } - } diff --git a/src/main/java/org/olat/repository/controllers/RepositorySearchController.java b/src/main/java/org/olat/repository/controllers/RepositorySearchController.java index b5e52a9f0f97dfb6fa9881de207b1cc94dfd40f0..655b1826008dc6e9a4d90e6bde0f1421a133cac1 100644 --- a/src/main/java/org/olat/repository/controllers/RepositorySearchController.java +++ b/src/main/java/org/olat/repository/controllers/RepositorySearchController.java @@ -91,7 +91,7 @@ public class RepositorySearchController extends BasicController implements Activ private Link backLink, cancelButton; private RepositoryEntry selectedEntry; private List<RepositoryEntry> selectedEntries; - private boolean enableSearchforAllReferencalbeInSearchForm = false; + private Can enableSearchforAllInSearchForm; private Link loginLink; private SearchType searchType; private RepositoryEntryFilter filter; @@ -181,7 +181,7 @@ public class RepositorySearchController extends BasicController implements Activ vc.contextPut("isAuthor", Boolean.valueOf(roles.isAuthor())); vc.contextPut("withCancel", new Boolean(withCancel)); enableBackToSearchFormLink(false); // default, must be enabled explicitly - enableSearchforAllReferencalbeInSearchForm(false); // default + enableSearchforAllXXAbleInSearchForm(null); // default putInitialPanel(vc); } @@ -208,12 +208,12 @@ public class RepositorySearchController extends BasicController implements Activ /** * @param enable true: searches done by the search form will find all resources - * that are referencable by the current user; false: searches done by the search + * that are referencable/copyable by the current user; false: searches done by the search * form will find all resources that have at least BAR setting in the BARG configuration * list */ - public void enableSearchforAllReferencalbeInSearchForm(boolean enable) { - enableSearchforAllReferencalbeInSearchForm = enable; + public void enableSearchforAllXXAbleInSearchForm(Can enable) { + enableSearchforAllInSearchForm = enable; } /** @@ -297,13 +297,16 @@ public class RepositorySearchController extends BasicController implements Activ List<RepositoryEntry> entries; if(searchForm.isAdminSearch()) { - entries = rm.queryResourcesLimitType(null, restrictedTypes, name, author, desc); - } else { + entries = rm.queryResourcesLimitType(null, restrictedTypes, name, author, desc, true, false); + } else if(enableSearchforAllInSearchForm == Can.referenceable){ entries = rm.queryReferencableResourcesLimitType(ident, roles, restrictedTypes, name, author, desc); + } else if(enableSearchforAllInSearchForm == Can.copyable){ + entries = rm.queryCopyableResourcesLimitType(ident, roles, restrictedTypes, name, author, desc); + } else { + entries = new ArrayList<RepositoryEntry>(); } filterRepositoryEntries(entries); repoTableModel.setObjects(entries); - //fxdiff VCRP-10: repository search with type filter if(updateFilters) { updateFilters(entries, null); } @@ -346,7 +349,32 @@ public class RepositorySearchController extends BasicController implements Activ List<RepositoryEntry> entries = rm.queryReferencableResourcesLimitType(owner, roles, restrictedTypes, null, null, null); filterRepositoryEntries(entries); repoTableModel.setObjects(entries); - //fxdiff VCRP-10: repository search with type filter + tableCtr.setFilters(null, null); + tableCtr.modelChanged(); + displaySearchResults(null); + } + + /** + * Do search for all resources that the user can copy either because he + * is the owner of the resource or because he has author rights and the resource + * is set to at least BA in the BARG settings and the resource has the flag + * 'canCopy' set to true. + * @param owner The current identity + * @param limitTypes List of Types to limit the search + * @param roles The users roles + */ + public void doSearchForCopyableResourcesLimitType(Identity owner, String[] limitTypes, Roles roles) { + RepositoryManager rm = RepositoryManager.getInstance(); + List<String> restrictedTypes = new ArrayList<String>(); + if(limitTypes == null) { + restrictedTypes = null; + } + else { + restrictedTypes.addAll(Arrays.asList(limitTypes)); + } + List<RepositoryEntry> entries = rm.queryCopyableResourcesLimitType(owner, roles, restrictedTypes, null, null, null); + filterRepositoryEntries(entries); + repoTableModel.setObjects(entries); tableCtr.setFilters(null, null); tableCtr.modelChanged(); displaySearchResults(null); @@ -579,7 +607,7 @@ public class RepositorySearchController extends BasicController implements Activ } else if(searchType == SearchType.myAsTeacher) { doSearchMyCoursesTeacher(urequest, typeFilter.getType(), false); } else if(searchType == SearchType.searchForm) { - if(enableSearchforAllReferencalbeInSearchForm) { + if(enableSearchforAllInSearchForm != null) { doSearchAllReferencables(urequest, typeFilter.getType(), false); } else { doSearch(urequest, typeFilter.getType(), false); @@ -593,7 +621,7 @@ public class RepositorySearchController extends BasicController implements Activ } else if(searchType == SearchType.myAsTeacher) { doSearchMyCoursesTeacher(urequest); } else if(searchType == SearchType.searchForm) { - if(enableSearchforAllReferencalbeInSearchForm) { + if(enableSearchforAllInSearchForm != null) { doSearchAllReferencables(urequest, null, false); } else { doSearch(urequest, null, false); @@ -619,7 +647,7 @@ public class RepositorySearchController extends BasicController implements Activ if (event == Event.DONE_EVENT) { if (searchForm.hasId()) { doSearchById(searchForm.getId()); - } else if (enableSearchforAllReferencalbeInSearchForm) { + } else if (enableSearchforAllInSearchForm != null) { doSearchAllReferencables(urequest, null, true); } else { doSearch(urequest, null, true); @@ -688,4 +716,9 @@ public class RepositorySearchController extends BasicController implements Activ myAsTeacher, searchForm, } + + public enum Can { + referenceable, + copyable + } } \ No newline at end of file