diff --git a/src/main/java/org/olat/admin/UserAdminMainController.java b/src/main/java/org/olat/admin/UserAdminMainController.java index f946bed3f085af584ea26cdde7b495be301f6c27..4add87f55427729a6c21f2ae7201fec42719ee55 100644 --- a/src/main/java/org/olat/admin/UserAdminMainController.java +++ b/src/main/java/org/olat/admin/UserAdminMainController.java @@ -401,6 +401,14 @@ public class UserAdminMainController extends MainLayoutBasicController implement listenTo(contentCtr); return contentCtr.getInitialComponent(); } + else if (uobject.equals("userswithoutgroup")) { + activatePaneInDetailView = "edit.withoutgroup"; + List<Identity> usersWithoutGroup = BaseSecurityManager.getInstance().findIdentitiesWithoutBusinessGroup(null); + contentCtr = new UsermanagerUserSearchController(ureq, bwControl, usersWithoutGroup, null, true, true); + addToHistory(ureq, bwControl); + listenTo(contentCtr); + return contentCtr.getInitialComponent(); + } else if (uobject.equals("logondeniedgroup")) { activatePaneInDetailView = "edit.uroles"; //fxdiff BAKS-7 Resume function @@ -684,6 +692,12 @@ public class UserAdminMainController extends MainLayoutBasicController implement gtn3.setAltText(translator.translate("menu.menuqueries.alt")); admin.addChild(gtn3); + gtnChild = new GenericTreeNode(); + gtnChild.setTitle(translator.translate("menu.userswithoutgroup")); + gtnChild.setUserObject("userswithoutgroup"); + gtnChild.setAltText(translator.translate("menu.userswithoutgroup.alt")); + gtn3.addChild(gtnChild); + gtnChild = new GenericTreeNode(); gtnChild.setTitle(translator.translate("menu.created.lastweek")); gtnChild.setUserObject("created.lastweek"); diff --git a/src/main/java/org/olat/admin/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/admin/_i18n/LocalStrings_de.properties index c93606ffa65f851ab1933c0ed1be56dba318c1c3..9ffa66c73f69102ec1473483425b17a59e511126 100644 --- a/src/main/java/org/olat/admin/_i18n/LocalStrings_de.properties +++ b/src/main/java/org/olat/admin/_i18n/LocalStrings_de.properties @@ -124,6 +124,8 @@ menu.usertools=Benutzerwerkzeug menu.usertools.alt=Benutzerwerkzeug menu.usersimport=Benutzer importieren menu.usersimport.alt=Benutzer via Excel-Liste in OpenOLAT importieren +menu.userswithoutgroup=Benutzer ohne Gruppe +menu.userswithoutgroup.alt=Benutzer ohne Gruppe menu.versions=Versionierung menu.versions.alt=Versionierung Einstellungen queries.intro=Unter dem Men\u00FC <i>Vordefinierte Suchabfragen</i> finden Sie oft benutzte Suchabfragen. Spezifischere Suchabfragen k\u00F6nnen mit der Benutzersuche definiert werden. diff --git a/src/main/java/org/olat/admin/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/admin/_i18n/LocalStrings_en.properties index 0cc848d6cabfa66ed2a9c76394fe01fe5b8c8a34..2c826d418020cec2586c40a3cc07c6a6f6c9397c 100644 --- a/src/main/java/org/olat/admin/_i18n/LocalStrings_en.properties +++ b/src/main/java/org/olat/admin/_i18n/LocalStrings_en.properties @@ -127,6 +127,8 @@ menu.userproperties.alt=Manage User Properties menu.usersimport=Import users menu.usersimport.alt=Import users by means of Excel lists menu.usertools=User tools +menu.userswithoutgroup=Users without groups +menu.userswithoutgroup.alt=Users without groups menu.versions=Versioning menu.versions.alt=Versioning settings queries.intro=In the menu <i>Predefined searches</i> you will find often used search queries. You can specify your queries by means of the user search. diff --git a/src/main/java/org/olat/basesecurity/BaseSecurity.java b/src/main/java/org/olat/basesecurity/BaseSecurity.java index 77a2b73eb61730682a234ee71623cf88e1065b47..f6b8b957e5be74ad41a14e60bb86090b8a5d3890 100644 --- a/src/main/java/org/olat/basesecurity/BaseSecurity.java +++ b/src/main/java/org/olat/basesecurity/BaseSecurity.java @@ -200,6 +200,13 @@ public interface BaseSecurity { * @return The identities */ public List<IdentityShort> findShortIdentitiesByKey(Collection<Long> identityKeys); + + /** + * Find identities which are not in a business group + * @param status + * @return + */ + public List<Identity> findIdentitiesWithoutBusinessGroup(Integer status); /** * find an identity by the key instead of the username. Prefer this method as diff --git a/src/main/java/org/olat/basesecurity/BaseSecurityManager.java b/src/main/java/org/olat/basesecurity/BaseSecurityManager.java index d747aa1f9b137191332c4fbe86e2a2e073a9a379..fcb68564ee1352cd0b859cbd97be7507be9fe655 100644 --- a/src/main/java/org/olat/basesecurity/BaseSecurityManager.java +++ b/src/main/java/org/olat/basesecurity/BaseSecurityManager.java @@ -65,6 +65,7 @@ import org.olat.core.util.Util; import org.olat.core.util.coordinate.CoordinatorManager; import org.olat.core.util.coordinate.SyncerCallback; import org.olat.core.util.resource.OresHelper; +import org.olat.group.BusinessGroupImpl; import org.olat.login.LoginModule; import org.olat.portfolio.manager.InvitationDAO; import org.olat.resource.OLATResource; @@ -1007,6 +1008,33 @@ public class BaseSecurityManager extends BasicManager implements BaseSecurity { } while(count < names.size()); return shortIdentities; } + + public List<Identity> findIdentitiesWithoutBusinessGroup(Integer status) { + StringBuilder sb = new StringBuilder(); + sb.append("select ident from ").append(IdentityImpl.class.getName()).append(" as ident ") + .append(" where not exists (") + .append(" select bgroup from ").append(BusinessGroupImpl.class.getName()).append(" bgroup, bgroupmember as me") + .append(" where me.group=bgroup.baseGroup and me.identity=ident") + .append(" )"); + if (status != null) { + if (status.equals(Identity.STATUS_VISIBLE_LIMIT)) { + // search for all status smaller than visible limit + sb.append(" and ident.status < :status "); + } else { + // search for certain status + sb.append(" and ident.status = :status "); + } + } else { + sb.append(" and ident.status < ").append(Identity.STATUS_DELETED); + } + + TypedQuery<Identity> query = dbInstance.getCurrentEntityManager() + .createQuery(sb.toString(), Identity.class); + if (status != null) { + query.setParameter("status", status); + } + return query.getResultList(); + } /** *