diff --git a/src/main/java/org/olat/admin/user/UsermanagerUserSearchForm.java b/src/main/java/org/olat/admin/user/UsermanagerUserSearchForm.java index 2cd283e4133e8bb0f45a0853079041a607a8fb45..ee96926ca6e0a1e6a40e6e1fc4e4d9e1b9613e2c 100644 --- a/src/main/java/org/olat/admin/user/UsermanagerUserSearchForm.java +++ b/src/main/java/org/olat/admin/user/UsermanagerUserSearchForm.java @@ -52,6 +52,7 @@ import org.olat.core.gui.control.Event; import org.olat.core.gui.control.WindowControl; import org.olat.core.id.Identity; import org.olat.core.id.Organisation; +import org.olat.core.id.Roles; import org.olat.core.id.context.StateMapped; import org.olat.core.util.StringHelper; import org.olat.login.LoginModule; @@ -185,6 +186,7 @@ public class UsermanagerUserSearchForm extends FormBasicController { */ public SearchIdentityParams getSearchIdentityParams() { // get user attributes from form + String idVal = getStringValue("id"); String loginVal = getStringValue("login"); // when searching for deleted users, add wildcard to match with backup prefix List<Integer> statusList = getStatus(); @@ -223,6 +225,7 @@ public class UsermanagerUserSearchForm extends FormBasicController { getUserLoginAfter(), getUserLoginBefore(), null); params.setOrganisations(getOrganisations()); params.setExactStatusList(statusList); + params.setIdAndExternalIds(idVal); return params; } @@ -343,6 +346,12 @@ public class UsermanagerUserSearchForm extends FormBasicController { @Override protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) { formLayout.setElementCssClass("o_sel_user_search_form"); + + Roles uroles = ureq.getUserSession().getRoles(); + TextElement id = uifactory.addTextElement("id", "search.form.id", 128, "", formLayout); + id.setVisible(isAdministrativeUser || uroles.isAdministrator() || uroles.isSystemAdmin()); + id.setElementCssClass("o_sel_user_search_id"); + items.put("id", id); TextElement login = uifactory.addTextElement("login", "search.form.login", 128, "", formLayout); login.setVisible(isAdministrativeUser); diff --git a/src/main/java/org/olat/admin/user/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/admin/user/_i18n/LocalStrings_de.properties index 9ab66c57edb028bf69a135759e8e73efa4914aa3..f415c16cd521daccadeefe9995c1b447505f483a 100644 --- a/src/main/java/org/olat/admin/user/_i18n/LocalStrings_de.properties +++ b/src/main/java/org/olat/admin/user/_i18n/LocalStrings_de.properties @@ -152,7 +152,7 @@ search.form.constraint.sysadmin=$\:role.sysadmin search.form.constraint.user=$\:role.user search.form.constraint.usermanager=$\:role.usermanager - +search.form.id=ID search.form.login=Benutzername search.form.title.authentications=Einschr\u00E4nkung auf Authentifizierung search.form.title.date=Einschr\u00E4nkung auf Erstellungsdatum diff --git a/src/main/java/org/olat/admin/user/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/admin/user/_i18n/LocalStrings_en.properties index ab17ef46acac6e05aa913afc03b7f8fe3c1ad771..95b5b663ea4dbead64407401a0959a0d4157313f 100644 --- a/src/main/java/org/olat/admin/user/_i18n/LocalStrings_en.properties +++ b/src/main/java/org/olat/admin/user/_i18n/LocalStrings_en.properties @@ -150,6 +150,7 @@ search.form.constraint.rolesmanager=$\:role.rolesmanager search.form.constraint.sysadmin=$\:role.sysadmin search.form.constraint.user=$\:role.user search.form.constraint.usermanager=User manager +search.form.id=ID search.form.login=User name search.form.title.authentications=Authentication restrictions search.form.title.date=Creation date restrictions diff --git a/src/main/java/org/olat/basesecurity/SearchIdentityParams.java b/src/main/java/org/olat/basesecurity/SearchIdentityParams.java index 87c805c35fc1be71dc5bc7df13511d1aff77adba..3cd188b46a87b5ff7a8fd1349dc221412095fb15 100644 --- a/src/main/java/org/olat/basesecurity/SearchIdentityParams.java +++ b/src/main/java/org/olat/basesecurity/SearchIdentityParams.java @@ -35,6 +35,7 @@ import org.olat.core.id.OrganisationRef; * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com */ public class SearchIdentityParams { + private String idAndExternalIds; private String login; private Map<String, String> userProperties; private boolean userPropertiesAsIntersectionSearch; @@ -301,6 +302,14 @@ public class SearchIdentityParams { this.status = status; } + public String getIdAndExternalIds() { + return idAndExternalIds; + } + + public void setIdAndExternalIds(String idAndExternalIds) { + this.idAndExternalIds = idAndExternalIds; + } + public List<Integer> getExactStatusList() { return exactStatusList; } diff --git a/src/main/java/org/olat/basesecurity/manager/IdentityPowerSearchQueriesImpl.java b/src/main/java/org/olat/basesecurity/manager/IdentityPowerSearchQueriesImpl.java index 1c495a3233566f3b112b2c2648e8ef9306283b39..7db640ad02ffc97cc96c13247d547cc87c381f57 100644 --- a/src/main/java/org/olat/basesecurity/manager/IdentityPowerSearchQueriesImpl.java +++ b/src/main/java/org/olat/basesecurity/manager/IdentityPowerSearchQueriesImpl.java @@ -41,6 +41,7 @@ import org.olat.core.commons.persistence.DB; import org.olat.core.commons.persistence.SortKey; import org.olat.core.id.Identity; import org.olat.core.id.OrganisationRef; +import org.olat.core.util.StringHelper; import org.olat.user.propertyhandlers.UserPropertyHandler; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -161,7 +162,8 @@ public class IdentityPowerSearchQueriesImpl implements IdentityPowerSearchQuerie || params.getStatus() != null || (params.getExactStatusList() != null && !params.getExactStatusList().isEmpty()) || params.hasRoles() || params.hasExcludedRoles() || params.isAuthorAndCoAuthor() || params.getRepositoryEntryRole() != null || params.getBusinessGroupRole() != null - || params.hasOrganisations() || params.hasOrganisationParents(); + || params.hasOrganisations() || params.hasOrganisationParents() + || StringHelper.containsNonWhitespace(params.getIdAndExternalIds()); } private boolean createQueryPart(SearchIdentityParams params, StringBuilder sb, boolean needsAnd) { @@ -243,6 +245,15 @@ public class IdentityPowerSearchQueriesImpl implements IdentityPowerSearchQuerie sb.append("ident.key in (:identityKeys)"); } + if(params.getIdAndExternalIds() != null) { + needsAnd = checkAnd(sb, needsAnd); + sb.append("("); + if(StringHelper.isLong(params.getIdAndExternalIds())) { + sb.append("ident.key=:idKey or user.key=:idKey or "); + } + sb.append("ident.externalId=:idAndRefs)"); + } + if(params.getManaged() != null) { needsAnd = checkAnd(sb, needsAnd); if(params.getManaged().booleanValue()) { @@ -531,6 +542,16 @@ public class IdentityPowerSearchQueriesImpl implements IdentityPowerSearchQuerie } else if (params.getStatus() != null) { dbq.setParameter("status", params.getStatus()); } + + if(params.getIdAndExternalIds() != null) { + } + + if(params.getIdAndExternalIds() != null) { + if(StringHelper.isLong(params.getIdAndExternalIds())) { + dbq.setParameter("idKey", Long.valueOf(params.getIdAndExternalIds())); + } + dbq.setParameter("idAndRefs", params.getIdAndExternalIds()); + } } private boolean checkAnd(StringBuilder sb, boolean needsAnd) {