diff --git a/src/main/java/org/olat/admin/user/UserSearchController.java b/src/main/java/org/olat/admin/user/UserSearchController.java index 726518f5f12666e2b73eee05fb34acf6c6d8f4db..20e0f1170c770a6a37ffa248fa2ebd78ab984853 100644 --- a/src/main/java/org/olat/admin/user/UserSearchController.java +++ b/src/main/java/org/olat/admin/user/UserSearchController.java @@ -27,10 +27,12 @@ import java.util.Map; import org.olat.basesecurity.BaseSecurity; import org.olat.basesecurity.BaseSecurityModule; +import org.olat.basesecurity.Organisation; +import org.olat.basesecurity.OrganisationService; +import org.olat.basesecurity.SearchIdentityParams; import org.olat.basesecurity.events.MultiIdentityChosenEvent; import org.olat.basesecurity.events.SingleIdentityChosenEvent; import org.olat.core.gui.UserRequest; -import org.olat.core.gui.Windows; import org.olat.core.gui.components.Component; import org.olat.core.gui.components.form.flexible.FormItem; import org.olat.core.gui.components.link.Link; @@ -55,6 +57,7 @@ import org.olat.core.gui.translator.Translator; import org.olat.core.id.Identity; import org.olat.core.id.Roles; import org.olat.core.util.StringHelper; +import org.olat.core.util.UserSession; import org.olat.core.util.Util; import org.olat.user.UserManager; import org.olat.user.propertyhandlers.UserPropertyHandler; @@ -99,6 +102,9 @@ public class UserSearchController extends BasicController { private static final String ACTION_SINGLESELECT_CHOOSE = "ssc"; private static final String ACTION_MULTISELECT_CHOOSE = "msc"; + public static final String ACTION_KEY_CHOOSE = "action.choose"; + public static final String ACTION_KEY_CHOOSE_FINISH = "action.choose.finish"; + private VelocityContainer myContent; private StackedPanel searchPanel; private UserSearchForm searchform; @@ -108,6 +114,7 @@ public class UserSearchController extends BasicController { private List<Identity> foundIdentities = new ArrayList<>(); private boolean useMultiSelect = false; private Object userObject; + public final List<Organisation> searchableOrganisations; private AutoCompleterController autocompleterC; private String actionKeyChoose; @@ -118,13 +125,10 @@ public class UserSearchController extends BasicController { protected BaseSecurity securityManager; @Autowired protected BaseSecurityModule securityModule; - - public static final String ACTION_KEY_CHOOSE = "action.choose"; - public static final String ACTION_KEY_CHOOSE_FINISH = "action.choose.finish"; - + @Autowired + protected OrganisationService organisationService; /** - * fxdiff: FXOLAT-250 we need standard-constructor for use in genericMainController * * @param ureq * @param wControl @@ -176,13 +180,14 @@ public class UserSearchController extends BasicController { searchPanel.addListener(this); myContent.put("usersearchPanel", searchPanel); - if (ureq.getUserSession()==null) { - logError("UserSearchController<init>: session is null!", null); - } else if (ureq.getUserSession().getRoles()==null) { - logError("UserSearchController<init>: roles is null!", null); + UserSession usess = ureq.getUserSession(); + if(usess.getRoles().isOLATAdmin()) { + searchableOrganisations = null;//null mean all + } else { + searchableOrganisations = organisationService.getSearchableOrganisations(getIdentity(), usess.getRoles()); } - Roles roles = ureq.getUserSession().getRoles(); + Roles roles = usess.getRoles(); isAdministrativeUser = securityModule.isUserAllowedAdminProps(roles); searchform = new UserSearchForm(ureq, wControl, isAdministrativeUser, cancelbutton, allowReturnKey); listenTo(searchform); @@ -192,10 +197,9 @@ public class UserSearchController extends BasicController { myContent.contextPut("showButton","false"); boolean autoCompleteAllowed = securityModule.isUserAllowedAutoComplete(roles); - boolean ajax = Windows.getWindows(ureq).getWindowManager().isAjaxEnabled(); - if (ajax && autoCompleteAllowed) { + if (autoCompleteAllowed) { // insert a autocompleter search - ListProvider provider = new UserSearchListProvider(); + ListProvider provider = new UserSearchListProvider(searchableOrganisations); autocompleterC = new AutoCompleterController(ureq, getWindowControl(), provider, null, isAdministrativeUser, 60, 3, null); listenTo(autocompleterC); myContent.put("autocompletionsearch", autocompleterC.getInitialComponent()); @@ -348,8 +352,9 @@ public class UserSearchController extends BasicController { protected List<Identity> searchUsers(String login, Map<String, String> userPropertiesSearch, boolean userPropertiesAsIntersectionSearch) { int maxResults = securityModule.getUserSearchMaxResultsValue() > 0 ? securityModule.getUserSearchMaxResultsValue() + 1 : -1; login = (login.equals("") ? null : login); - return securityManager.getVisibleIdentitiesByPowerSearch(login , - userPropertiesSearch, userPropertiesAsIntersectionSearch, // in normal search fields are intersected - null, null, null, null, 0, maxResults); + SearchIdentityParams params = new SearchIdentityParams(login, userPropertiesSearch, userPropertiesAsIntersectionSearch, null, + null, null, null, null, null, Identity.STATUS_VISIBLE_LIMIT); + params.setOrganisations(searchableOrganisations); + return securityManager.getIdentitiesByPowerSearch(params, 0, maxResults); } } \ No newline at end of file diff --git a/src/main/java/org/olat/admin/user/UserSearchFlexiController.java b/src/main/java/org/olat/admin/user/UserSearchFlexiController.java index a81d8453ba502679f68b09702653c79db10a693f..c00a8fae84b18e7af12ffbe2efa5bd7f109de1ee 100644 --- a/src/main/java/org/olat/admin/user/UserSearchFlexiController.java +++ b/src/main/java/org/olat/admin/user/UserSearchFlexiController.java @@ -29,13 +29,17 @@ import java.util.Set; import org.olat.basesecurity.BaseSecurity; import org.olat.basesecurity.BaseSecurityModule; +import org.olat.basesecurity.Organisation; +import org.olat.basesecurity.OrganisationService; +import org.olat.basesecurity.SearchIdentityParams; import org.olat.basesecurity.events.SingleIdentityChosenEvent; import org.olat.core.gui.UserRequest; -import org.olat.core.gui.Windows; import org.olat.core.gui.components.Component; import org.olat.core.gui.components.form.flexible.FormItem; import org.olat.core.gui.components.form.flexible.FormItemContainer; -import org.olat.core.gui.components.form.flexible.elements.*; +import org.olat.core.gui.components.form.flexible.elements.FlexiTableElement; +import org.olat.core.gui.components.form.flexible.elements.FormLink; +import org.olat.core.gui.components.form.flexible.elements.TextElement; import org.olat.core.gui.components.form.flexible.impl.Form; import org.olat.core.gui.components.form.flexible.impl.FormEvent; import org.olat.core.gui.components.form.flexible.impl.FormLayoutContainer; @@ -55,6 +59,7 @@ import org.olat.core.id.Identity; import org.olat.core.id.Roles; import org.olat.core.id.UserConstants; import org.olat.core.util.StringHelper; +import org.olat.core.util.UserSession; import org.olat.core.util.Util; import org.olat.user.UserManager; import org.olat.user.propertyhandlers.EmailProperty; @@ -65,25 +70,17 @@ import org.springframework.beans.factory.annotation.Autowired; /** * Initial Date: Jul 29, 2003 * - * @author Felix Jost, Florian Gnaegi - * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com * - * <pre> * Comment: * Subworkflow that allows the user to search for a user and choose the user from * the list of users that match the search criteria. Users can be searched by * <ul> - * <li /> - * Username - * <li /> - * First name - * <li /> - * Last name - * <li /> - * Email address + * <li>Username + * <li>First name + * <li>Last name + * <li>Email address * </ul> * - * </pre> * * Events:<br> * Fires a SingleIdentityChoosenEvent when an identity has been chosen @@ -93,6 +90,10 @@ import org.springframework.beans.factory.annotation.Autowired; * <p> * Optionally set the useMultiSelect boolean to true which allows to * select multiple identities from within the search results. + * + * + * @author Felix Jost, Florian Gnaegi + * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com */ public class UserSearchFlexiController extends FlexiAutoCompleterController { @@ -104,10 +105,10 @@ public class UserSearchFlexiController extends FlexiAutoCompleterController { private FlexiTableElement tableEl; private UserSearchFlexiTableModel userTableModel; private FormLayoutContainer autoCompleterContainer; - private FormLayoutContainer searchFormContainer; private final boolean isAdministrativeUser; private final List<UserPropertyHandler> userSearchFormPropertyHandlers; + private final List<Organisation> searchableOrganisations; @Autowired private UserManager userManager; @@ -115,6 +116,8 @@ public class UserSearchFlexiController extends FlexiAutoCompleterController { private BaseSecurity securityManager; @Autowired private BaseSecurityModule securityModule; + @Autowired + private OrganisationService organisationService; /** * @param ureq @@ -131,8 +134,15 @@ public class UserSearchFlexiController extends FlexiAutoCompleterController { Roles roles = ureq.getUserSession().getRoles(); isAdministrativeUser = securityModule.isUserAllowedAdminProps(roles); userSearchFormPropertyHandlers = userManager.getUserPropertyHandlersFor(UserSearchForm.class.getCanonicalName(), isAdministrativeUser); + + UserSession usess = ureq.getUserSession(); + if(usess.getRoles().isOLATAdmin()) { + searchableOrganisations = null;//null mean all + } else { + searchableOrganisations = organisationService.getSearchableOrganisations(getIdentity(), usess.getRoles()); + } - ListProvider provider = new UserSearchListProvider(); + ListProvider provider = new UserSearchListProvider(searchableOrganisations); setListProvider(provider); setAllowNewValues(false); @@ -147,8 +157,7 @@ public class UserSearchFlexiController extends FlexiAutoCompleterController { // insert a autocompleter search Roles roles = ureq.getUserSession().getRoles(); boolean autoCompleteAllowed = securityModule.isUserAllowedAutoComplete(roles); - boolean ajax = Windows.getWindows(ureq).getWindowManager().isAjaxEnabled(); - if (ajax && autoCompleteAllowed) { + if (autoCompleteAllowed) { //auto complete String velocityAutoCRoot = Util.getPackageVelocityRoot(FlexiAutoCompleterController.class); String autoCPage = velocityAutoCRoot + "/autocomplete.html"; @@ -163,7 +172,7 @@ public class UserSearchFlexiController extends FlexiAutoCompleterController { backLink = uifactory.addFormLink("btn.back", formLayout); backLink.setIconLeftCSS("o_icon o_icon_back"); - searchFormContainer = FormLayoutContainer.createDefaultFormLayout("usersearchPanel", getTranslator()); + FormLayoutContainer searchFormContainer = FormLayoutContainer.createDefaultFormLayout("usersearchPanel", getTranslator()); searchFormContainer.setRootForm(mainForm); searchFormContainer.setElementCssClass("o_sel_usersearch_searchform"); searchFormContainer.setFormTitle(translate("header.normal")); @@ -303,9 +312,6 @@ public class UserSearchFlexiController extends FlexiAutoCompleterController { if (StringHelper.containsNonWhitespace(uiValue)) { full.append(uiValue.trim()); filled = true; - } else { - //its an empty field - filled = filled || false; } lastFormElement = ui; @@ -325,7 +331,7 @@ public class UserSearchFlexiController extends FlexiAutoCompleterController { lastFormElement.setErrorKey("error.search.form.no.wildcard.dublicates", null); return false; } - if ( fullString.length() < 4) { + if (fullString.length() < 4) { lastFormElement.setErrorKey("error.search.form.to.short", null); return false; } @@ -436,9 +442,6 @@ public class UserSearchFlexiController extends FlexiAutoCompleterController { } } - /** - * @see org.olat.core.gui.control.DefaultController#doDispose(boolean) - */ @Override protected void doDispose() { // Child controllers auto-disposed by basic controller @@ -451,9 +454,10 @@ public class UserSearchFlexiController extends FlexiAutoCompleterController { * @return */ private List<Identity> searchUsers(String login, Map<String, String> userPropertiesSearch, boolean userPropertiesAsIntersectionSearch) { - return securityManager.getVisibleIdentitiesByPowerSearch( - (login.equals("") ? null : login), - userPropertiesSearch, userPropertiesAsIntersectionSearch, // in normal search fields are intersected - null, null, null, null); + SearchIdentityParams params = new SearchIdentityParams(login, + userPropertiesSearch, userPropertiesAsIntersectionSearch, null, + null, null, null, null, null, Identity.STATUS_VISIBLE_LIMIT); + params.setOrganisations(searchableOrganisations); + return securityManager.getIdentitiesByPowerSearch(params, 0, -1); } } \ No newline at end of file diff --git a/src/main/java/org/olat/admin/user/UserSearchListProvider.java b/src/main/java/org/olat/admin/user/UserSearchListProvider.java index da91a24e6a651d64cb1e80cefcc1f214d6cda1de..782742adc2fe3af254928a2b61ebeca51a556f34 100644 --- a/src/main/java/org/olat/admin/user/UserSearchListProvider.java +++ b/src/main/java/org/olat/admin/user/UserSearchListProvider.java @@ -26,6 +26,7 @@ import java.util.Map; import org.olat.basesecurity.BaseSecurity; import org.olat.basesecurity.IdentityShort; +import org.olat.basesecurity.Organisation; import org.olat.core.CoreSpringFactory; import org.olat.core.gui.control.generic.ajax.autocompletion.ListProvider; import org.olat.core.gui.control.generic.ajax.autocompletion.ListReceiver; @@ -42,8 +43,10 @@ public class UserSearchListProvider implements ListProvider { private final BaseSecurity securityManager; private final UserManager userManager; + public final List<Organisation> searchableOrganisations; - public UserSearchListProvider() { + public UserSearchListProvider(List<Organisation> searchableOrganisations) { + this.searchableOrganisations = searchableOrganisations; securityManager = CoreSpringFactory.getImpl(BaseSecurity.class); userManager = CoreSpringFactory.getImpl(UserManager.class); } @@ -60,7 +63,7 @@ public class UserSearchListProvider implements ListProvider { // Search in all fileds -> non intersection search int maxEntries = MAX_ENTRIES; - List<IdentityShort> res = securityManager.searchIdentityShort(searchValue, maxEntries); + List<IdentityShort> res = securityManager.searchIdentityShort(searchValue, searchableOrganisations, maxEntries); boolean hasMore = false; for (Iterator<IdentityShort> it_res = res.iterator(); (hasMore=it_res.hasNext()) && maxEntries > 0;) { diff --git a/src/main/java/org/olat/basesecurity/BaseSecurity.java b/src/main/java/org/olat/basesecurity/BaseSecurity.java index 9f8e013e2056340c8277fdad47a988c16fbecdac..c09c75bc60366ebbfd32dcf20231774224dd71b0 100644 --- a/src/main/java/org/olat/basesecurity/BaseSecurity.java +++ b/src/main/java/org/olat/basesecurity/BaseSecurity.java @@ -154,10 +154,17 @@ public interface BaseSecurity { /** * - * @param search + * @param search The search * @return */ public List<IdentityShort> searchIdentityShort(String search, int maxResults); + + /** + * + * @param search The search + * @return + */ + public List<IdentityShort> searchIdentityShort(String search, List<? extends OrganisationRef> searchableOrganisations, int maxResults); public IdentityShort loadIdentityShortByKey(Long identityKey); diff --git a/src/main/java/org/olat/basesecurity/BaseSecurityManager.java b/src/main/java/org/olat/basesecurity/BaseSecurityManager.java index d52314fb7ab65493ee4ab9fb1a254de2696c8e29..1ddd9a2bbb77a81bb2e60cef2ed6ab3078d1d298 100644 --- a/src/main/java/org/olat/basesecurity/BaseSecurityManager.java +++ b/src/main/java/org/olat/basesecurity/BaseSecurityManager.java @@ -601,9 +601,15 @@ public class BaseSecurityManager implements BaseSecurity { .getResultList(); return identities.size() == 1 ? identities.get(0) : null; } + @Override public List<IdentityShort> searchIdentityShort(String search, int maxResults) { + return searchIdentityShort(search, null, maxResults); + } + + @Override + public List<IdentityShort> searchIdentityShort(String search, List<? extends OrganisationRef> searcheableOrgnisations, int maxResults) { String[] searchArr = search.split(" "); String[] attributes = new String[]{ "name", "firstName", "lastName", "email" }; @@ -631,12 +637,23 @@ public class BaseSecurityManager implements BaseSecurity { } } sb.append(")"); + if(searcheableOrgnisations != null && !searcheableOrgnisations.isEmpty()) { + sb.append(" and exists (select orgtomember.key from bgroupmember as orgtomember ") + .append(" inner join organisation as org on (org.group.key=orgtomember.group.key)") + .append(" where orgtomember.identity.key=ident.key and org.key in (:organisationKey))"); + } TypedQuery<IdentityShort> searchQuery = dbInstance.getCurrentEntityManager() .createQuery(sb.toString(), IdentityShort.class); for(int i=searchArr.length; i-->0; ) { searchQuery.setParameter("search" + i, PersistenceHelper.makeFuzzyQueryString(searchArr[i])); } + + if(searcheableOrgnisations != null && !searcheableOrgnisations.isEmpty()) { + List<Long> organisationKeys = searcheableOrgnisations.stream() + .map(OrganisationRef::getKey).collect(Collectors.toList()); + searchQuery.setParameter("organisationKey", organisationKeys); + } return searchQuery .setFirstResult(0) diff --git a/src/main/java/org/olat/basesecurity/OrganisationService.java b/src/main/java/org/olat/basesecurity/OrganisationService.java index 8fa6e2c0a2501dcd296c63dbba2f78481cd32b81..eede6e5d53897be9d8b40894803564e4664295ba 100644 --- a/src/main/java/org/olat/basesecurity/OrganisationService.java +++ b/src/main/java/org/olat/basesecurity/OrganisationService.java @@ -23,6 +23,7 @@ import java.util.List; import org.olat.basesecurity.model.OrganisationMember; import org.olat.core.id.Identity; +import org.olat.core.id.Roles; /** * @@ -62,6 +63,14 @@ public interface OrganisationService { */ public List<Organisation> getOrganisations(IdentityRef member, OrganisationRoles... role); + /** + * + * @param member + * @param roles + * @return + */ + public List<Organisation> getSearchableOrganisations(IdentityRef member, Roles roles); + public Organisation getDefaultOrganisation(); public void addMember(Organisation organisation, Identity member, OrganisationRoles role); diff --git a/src/main/java/org/olat/basesecurity/SearchIdentityParams.java b/src/main/java/org/olat/basesecurity/SearchIdentityParams.java index 057ef90cdae2030da8d9a91f62c83e0c44f1ec11..d5348be1eccbbdd5f9eaf4dbf9f8ca6d499d8591 100644 --- a/src/main/java/org/olat/basesecurity/SearchIdentityParams.java +++ b/src/main/java/org/olat/basesecurity/SearchIdentityParams.java @@ -19,7 +19,9 @@ */ package org.olat.basesecurity; +import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; import java.util.Date; import java.util.List; import java.util.Map; @@ -50,8 +52,8 @@ public class SearchIdentityParams { private Collection<Long> identityKeys; private Boolean managed; - private OrganisationRef organisation; private List<Organisation> organisationParents; + private List<OrganisationRef> organisations; public SearchIdentityParams() { // @@ -101,7 +103,7 @@ public class SearchIdentityParams { public static SearchIdentityParams organisation(Organisation organisation, Integer status) { SearchIdentityParams params = new SearchIdentityParams(); - params.setOrganisation(organisation); + params.setOrganisations(Collections.singletonList(organisation)); params.setStatus(status); return params; } @@ -129,13 +131,21 @@ public class SearchIdentityParams { public void setOrganisationParents(List<Organisation> organisationParents) { this.organisationParents = organisationParents; } + + public boolean hasOrganisations() { + return organisations != null && !organisations.isEmpty(); + } - public OrganisationRef getOrganisation() { - return organisation; + public List<OrganisationRef> getOrganisations() { + return organisations; } - public void setOrganisation(OrganisationRef organisation) { - this.organisation = organisation; + public void setOrganisations(List<? extends OrganisationRef> organisations) { + if(organisations == null) { + this.organisations = null; + } else { + this.organisations = new ArrayList<>(organisations); + } } public String getLogin() { diff --git a/src/main/java/org/olat/basesecurity/manager/IdentityPowerSearchQueriesImpl.java b/src/main/java/org/olat/basesecurity/manager/IdentityPowerSearchQueriesImpl.java index 22f4ba8dfc54ddbda92c008131c696c0e927db73..3f4f24344b43c6bd90df028b203b40aa5a502e17 100644 --- a/src/main/java/org/olat/basesecurity/manager/IdentityPowerSearchQueriesImpl.java +++ b/src/main/java/org/olat/basesecurity/manager/IdentityPowerSearchQueriesImpl.java @@ -19,12 +19,13 @@ */ package org.olat.basesecurity.manager; -import java.util.Date; import java.util.ArrayList; +import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Locale; import java.util.Map; +import java.util.stream.Collectors; import javax.persistence.TemporalType; import javax.persistence.TypedQuery; @@ -32,6 +33,7 @@ import javax.persistence.TypedQuery; import org.olat.basesecurity.AuthenticationImpl; import org.olat.basesecurity.IdentityImpl; import org.olat.basesecurity.IdentityPowerSearchQueries; +import org.olat.basesecurity.OrganisationRef; import org.olat.basesecurity.OrganisationRoles; import org.olat.basesecurity.SearchIdentityParams; import org.olat.basesecurity.model.IdentityPropertiesRow; @@ -165,7 +167,7 @@ public class IdentityPowerSearchQueriesImpl implements IdentityPowerSearchQuerie || params.hasAuthProviders() || params.getStatus() != null || params.getManaged() != null || params.hasRoles() || params.hasExcludedRoles() || params.isAuthorAndCoAuthor() || params.getRepositoryEntryRole() != null || params.getBusinessGroupRole() != null - || params.getOrganisation() != null || params.hasOrganisationParents(); + || params.hasOrganisations() || params.hasOrganisationParents(); } private boolean createQueryPart(SearchIdentityParams params, StringBuilder sb, boolean needsAnd) { @@ -201,11 +203,11 @@ public class IdentityPowerSearchQueriesImpl implements IdentityPowerSearchQuerie sb.append("))"); } - if(params.getOrganisation() != null) { + if(params.hasOrganisations()) { needsAnd = checkAnd(sb, needsAnd); sb.append(" exists (select orgtomember.key from bgroupmember as orgtomember ") .append(" inner join organisation as org on (org.group.key=orgtomember.group.key)") - .append(" where orgtomember.identity.key=ident.key and org.key=:organisationKey)"); + .append(" where orgtomember.identity.key=ident.key and org.key in (:organisationKey))"); } if(params.getBusinessGroupRole() != null) { @@ -490,8 +492,10 @@ public class IdentityPowerSearchQueriesImpl implements IdentityPowerSearchQuerie } } - if(params.getOrganisation() != null) { - dbq.setParameter("organisationKey", params.getOrganisation().getKey()); + if(params.hasOrganisations()) { + List<Long> organisationKeys = params.getOrganisations() + .stream().map(OrganisationRef::getKey).collect(Collectors.toList()); + dbq.setParameter("organisationKey", organisationKeys); } // add date restrictions diff --git a/src/main/java/org/olat/basesecurity/manager/OrganisationDAO.java b/src/main/java/org/olat/basesecurity/manager/OrganisationDAO.java index 2d4285dc58073c4f3bcc2d0f887a6e1b20e17f26..87616ecbcb18a32d378cf13fc86aaf1382de03cc 100644 --- a/src/main/java/org/olat/basesecurity/manager/OrganisationDAO.java +++ b/src/main/java/org/olat/basesecurity/manager/OrganisationDAO.java @@ -217,11 +217,11 @@ public class OrganisationDAO { sb.append("select org from organisation org") .append(" inner join fetch org.group baseGroup") .append(" inner join baseGroup.members membership") - .append(" where membership.identity.key=:identityKey and membership.role=:role"); + .append(" where membership.identity.key=:identityKey and membership.role in (:roles)"); return dbInstance.getCurrentEntityManager() .createQuery(sb.toString(), Organisation.class) .setParameter("identityKey", identity.getKey()) - .setParameter("role", roleList) + .setParameter("roles", roleList) .getResultList(); } diff --git a/src/main/java/org/olat/basesecurity/manager/OrganisationServiceImpl.java b/src/main/java/org/olat/basesecurity/manager/OrganisationServiceImpl.java index 5b0e36b30f11bab47981315c7115844523493b94..a02928be2c06594b70e2d6a16922c3a974c32f18 100644 --- a/src/main/java/org/olat/basesecurity/manager/OrganisationServiceImpl.java +++ b/src/main/java/org/olat/basesecurity/manager/OrganisationServiceImpl.java @@ -33,6 +33,7 @@ import org.olat.basesecurity.model.OrganisationImpl; import org.olat.basesecurity.model.OrganisationMember; import org.olat.core.commons.persistence.DB; import org.olat.core.id.Identity; +import org.olat.core.id.Roles; import org.olat.core.logging.OLog; import org.olat.core.logging.Tracing; import org.springframework.beans.factory.InitializingBean; @@ -114,6 +115,19 @@ public class OrganisationServiceImpl implements OrganisationService, Initializin return organisationDao.getOrganisations(member, roleList); } + @Override + public List<Organisation> getSearchableOrganisations(IdentityRef member, Roles roles) { + List<String> roleList = new ArrayList<>();// if user manager, descent organization tree + for(OrganisationRoles r:OrganisationRoles.values()) { + if(r != OrganisationRoles.guest) { + roleList.add(r.name()); + } + } + List<Organisation> organisations = organisationDao.getOrganisations(member, roleList); + + return organisations; + } + @Override public List<OrganisationMember> getMembers(Organisation organisation) { return organisationDao.getMembers(organisation); diff --git a/src/main/java/org/olat/core/util/mail/ui/EMailCalloutCtrl.java b/src/main/java/org/olat/core/util/mail/ui/EMailCalloutCtrl.java index 81db611ccfde3169d8fc7d7cb978c16709c50ca0..262155c93992334aa060ca2e25aef3707f30921b 100644 --- a/src/main/java/org/olat/core/util/mail/ui/EMailCalloutCtrl.java +++ b/src/main/java/org/olat/core/util/mail/ui/EMailCalloutCtrl.java @@ -24,6 +24,8 @@ import java.util.List; import org.olat.admin.user.UserSearchListProvider; import org.olat.basesecurity.BaseSecurity; import org.olat.basesecurity.BaseSecurityModule; +import org.olat.basesecurity.Organisation; +import org.olat.basesecurity.OrganisationService; import org.olat.basesecurity.events.SingleIdentityChosenEvent; import org.olat.core.gui.UserRequest; import org.olat.core.gui.components.form.flexible.FormItem; @@ -63,6 +65,8 @@ public class EMailCalloutCtrl extends FormBasicController { private BaseSecurity securityManager; @Autowired private BaseSecurityModule securityModule; + @Autowired + private OrganisationService organisationService; public EMailCalloutCtrl(UserRequest ureq, WindowControl wControl, boolean allowExternalAddress) { super(ureq, wControl, LAYOUT_VERTICAL); @@ -78,7 +82,13 @@ public class EMailCalloutCtrl extends FormBasicController { boolean autoCompleteAllowed = securityModule.isUserAllowedAutoComplete(roles); boolean isAdministrativeUser = securityModule.isUserAllowedAdminProps(roles); if (autoCompleteAllowed) { - ListProvider provider = new UserSearchListProvider(); + List<Organisation> searcheableOrganisations; + if(roles.isOLATAdmin()) { + searcheableOrganisations = null; + } else { + searcheableOrganisations = organisationService.getSearchableOrganisations(getIdentity(), roles); + } + ListProvider provider = new UserSearchListProvider(searcheableOrganisations); autocompleterC = new FlexiAutoCompleterController(ureq, getWindowControl(), provider, null, isAdministrativeUser, allowExternalAddress, 60, 3, null, mainForm); autocompleterC.setFormElement(false); listenTo(autocompleterC); diff --git a/src/main/java/org/olat/course/member/wizard/ImportMember_1b_ChooseMemberStep.java b/src/main/java/org/olat/course/member/wizard/ImportMember_1b_ChooseMemberStep.java index 34c987cf6349fcd55b7a16be1a1a5ebfcc94daf8..725501200bba375d56eb4a7059c662d8f3f39efc 100644 --- a/src/main/java/org/olat/course/member/wizard/ImportMember_1b_ChooseMemberStep.java +++ b/src/main/java/org/olat/course/member/wizard/ImportMember_1b_ChooseMemberStep.java @@ -48,7 +48,6 @@ public class ImportMember_1b_ChooseMemberStep extends BasicStep { @Override public StepFormController getStepController(UserRequest ureq, WindowControl wControl, StepsRunContext runContext, Form form) { - ImportMemberBySearchController controller = new ImportMemberBySearchController(ureq, wControl, form, runContext); - return controller; + return new ImportMemberBySearchController(ureq, wControl, form, runContext); } } \ No newline at end of file