diff --git a/.hgtags b/.hgtags index 0e6a04d12145e0044cc91fa80586bed965ef3d87..843559bbf1702bcd805ce39dd9f3d2b71feb0007 100644 --- a/.hgtags +++ b/.hgtags @@ -72,3 +72,4 @@ cee7299c2b62edf89f6164ab81f3b785a234f95b OpenOLAT 9.3.2 3e4c2cc8495ac15f4af7397382655cfee1420336 OpenOLAT 9.3.5 9a5d02062c328f6ab31aae75d02e7170c81fb459 OpenOLAT 9.4.0 2ee79964af9b646839064c65e12b4e6850d06c2d OpenOLAT 9.4.1 +2205a77012cfb955415464ef779cb1012225bf79 OpenOLAT 9.4.2 diff --git a/src/main/java/org/olat/admin/user/bulkChange/UserBulkChangeManager.java b/src/main/java/org/olat/admin/user/bulkChange/UserBulkChangeManager.java index 87186658f26072a3c618802f5e9fe4cf073cfa6e..1f17324854accf841b8c081a32fa06ee981381fe 100644 --- a/src/main/java/org/olat/admin/user/bulkChange/UserBulkChangeManager.java +++ b/src/main/java/org/olat/admin/user/bulkChange/UserBulkChangeManager.java @@ -291,7 +291,7 @@ public class UserBulkChangeManager extends BasicManager { UserManager.getInstance().getUserDisplayName(identity.getUser()),// 2: Name (first and last name) of user who changed the password WebappHelper.getMailConfig("mailSupport"), //3: configured support email address identity.getUser().getProperty(UserConstants.LASTNAME, null), //4 last name - Settings.getSecureServerContextPathURI(), //5 url system + getServerURI(), //5 url system gender //6 Mr. Mrs. }; @@ -301,6 +301,14 @@ public class UserBulkChangeManager extends BasicManager { translator.translate("mailtemplate.login.denied.body", args)); CoreSpringFactory.getImpl(MailManager.class).sendExternMessage(bundle, null); } + + private String getServerURI() { + String uri = Settings.getSecureServerContextPathURI(); + if(StringHelper.containsNonWhitespace(uri)) { + return uri; + } + return Settings.getInsecureServerContextPathURI(); + } public String evaluateValueWithUserContext(String valToEval, Context vcContext) { StringWriter evaluatedUserValue = new StringWriter(); diff --git a/src/main/java/org/olat/portfolio/manager/InvitationDAO.java b/src/main/java/org/olat/portfolio/manager/InvitationDAO.java index f7ed917872345abcf5318a7ed359613b1ef4daf1..e802be56af7ba69f48b539bd4cd7e5bf49365d13 100644 --- a/src/main/java/org/olat/portfolio/manager/InvitationDAO.java +++ b/src/main/java/org/olat/portfolio/manager/InvitationDAO.java @@ -158,6 +158,19 @@ public class InvitationDAO { return invitations.isEmpty() ? null : invitations.get(0); } + + /** + * the number of invitations + * @return + */ + public long countInvitations() { + String sb = "select count(invitation) from binvitation as invitation"; + Number invitations = dbInstance.getCurrentEntityManager() + .createQuery(sb, Number.class) + .getSingleResult(); + return invitations == null ? 0l : invitations.longValue(); + } + /** * Check if the identity has an invitation, valid or not * @param identity diff --git a/src/main/java/org/olat/restapi/system/OpenOLATStatisticsWebService.java b/src/main/java/org/olat/restapi/system/OpenOLATStatisticsWebService.java index c03ad825bbfaf8b6b9eeef97d9b06b714c3bd5d5..15c893850c6999b2565e20e510f925728bbe3d57 100644 --- a/src/main/java/org/olat/restapi/system/OpenOLATStatisticsWebService.java +++ b/src/main/java/org/olat/restapi/system/OpenOLATStatisticsWebService.java @@ -19,6 +19,7 @@ */ package org.olat.restapi.system; +import java.util.Calendar; import java.util.List; import java.util.Set; @@ -33,12 +34,14 @@ import org.olat.admin.sysinfo.model.SessionsStats; import org.olat.basesecurity.BaseSecurity; import org.olat.basesecurity.Constants; import org.olat.core.CoreSpringFactory; +import org.olat.core.id.Identity; import org.olat.core.util.SessionInfo; import org.olat.core.util.UserSession; import org.olat.core.util.WorkThreadInformations; import org.olat.core.util.session.UserSessionManager; import org.olat.course.CourseModule; import org.olat.group.BusinessGroupService; +import org.olat.portfolio.manager.InvitationDAO; import org.olat.repository.RepositoryEntry; import org.olat.repository.RepositoryManager; import org.olat.restapi.system.vo.OpenOLATStatisticsVO; @@ -165,13 +168,51 @@ public class OpenOLATStatisticsWebService implements Sampler { private UserStatisticsVO getUserStatisticsVO() { UserStatisticsVO stats = new UserStatisticsVO(); - BaseSecurity securityManager = CoreSpringFactory.getImpl(BaseSecurity.class); - long countUsers = securityManager.countIdentitiesByPowerSearch(null, null, false, null, null, null, null, null, null, null, null); - stats.setTotalUserCount(countUsers); + + // activeUserCount="88" // registered and activated identities, same as in GUI long countActiveUsers = securityManager.countIdentitiesByPowerSearch(null, null, false, null, null, null, null, null, null, null, Constants.USERSTATUS_ACTIVE); stats.setActiveUserCount(countActiveUsers); + // active last week + Calendar lastDay = Calendar.getInstance(); + lastDay.add(Calendar.DATE, -1); + long activeUserCountDay = securityManager.countUniqueUserLoginsSince(lastDay.getTime()); + stats.setActiveUserCountLastDay(activeUserCountDay); + + // active last week + Calendar lastWeek = Calendar.getInstance(); + lastWeek.add(Calendar.DATE, -7); + long activeUserCountWeek = securityManager.countUniqueUserLoginsSince(lastWeek.getTime()); + stats.setActiveUserCountLastWeek(activeUserCountWeek); + + // active last month + Calendar lastMonth = Calendar.getInstance(); + lastMonth.add(Calendar.MONTH, -1); + long activeUserCountMonth = securityManager.countUniqueUserLoginsSince(lastMonth.getTime()); + stats.setActiveUserCountLastMonth(activeUserCountMonth); + + // active last 6 month + Calendar last6Month = Calendar.getInstance(); + last6Month.add(Calendar.MONTH, -6); + long activeUserCount6Month = securityManager.countUniqueUserLoginsSince(last6Month.getTime()); + stats.setActiveUserCountLast6Month(activeUserCount6Month); + + // externalUserCount="12" // EP invite identities, later maybe also used in courses for MOOCS, external experts etc) + long invitationsCount = CoreSpringFactory.getImpl(InvitationDAO.class).countInvitations(); + stats.setExternalUserCount(invitationsCount); + + // blockedUserCount="0" // identities in login blocked state + long blockedUserCount = securityManager.countIdentitiesByPowerSearch(null, null, true, null, null, null, null, null, null, null, Identity.STATUS_LOGIN_DENIED); + stats.setBlockedUserCount(blockedUserCount); + // deletedUserCount="943" // deleted identities + long deletedUserCount = securityManager.countIdentitiesByPowerSearch(null, null, true, null, null, null, null, null, null, null, Identity.STATUS_DELETED); + stats.setDeletedUserCount(deletedUserCount); + + // totalUserCount="1043" // Sum of all above + long countUsers = securityManager.countIdentitiesByPowerSearch(null, null, false, null, null, null, null, null, null, null, null); + stats.setTotalUserCount(countUsers); + BusinessGroupService bgs = CoreSpringFactory.getImpl(BusinessGroupService.class); long countGroups = bgs.countBusinessGroups(null, null); stats.setTotalGroupCount(countGroups); diff --git a/src/main/java/org/olat/restapi/system/vo/UserStatisticsVO.java b/src/main/java/org/olat/restapi/system/vo/UserStatisticsVO.java index 146cd683971d7257454e7b8fb00802a647b6eaab..e8eae18f28c9fe1bdce949c26d8e986669c678c2 100644 --- a/src/main/java/org/olat/restapi/system/vo/UserStatisticsVO.java +++ b/src/main/java/org/olat/restapi/system/vo/UserStatisticsVO.java @@ -34,12 +34,25 @@ public class UserStatisticsVO { @XmlAttribute(name="totalUserCount", required=true) private long totalUserCount; - @XmlAttribute(name="activeUserCount", required=true) + @XmlAttribute(name="activeUserCount", required=false) private long activeUserCount; + @XmlAttribute(name="activeUserCountLastDay", required=false) + private long activeUserCountLastDay; + @XmlAttribute(name="activeUserCountLastWeek", required=false) + private long activeUserCountLastWeek; + @XmlAttribute(name="activeUserCountLastMonth", required=false) + private long activeUserCountLastMonth; + @XmlAttribute(name="activeUserCountLast6Month", required=false) + private long activeUserCountLast6Month; + @XmlAttribute(name="externalUserCount", required=false) + private long externalUserCount; + @XmlAttribute(name="blockedUserCount", required=false) + private long blockedUserCount; + @XmlAttribute(name="deletedUserCount", required=false) + private long deletedUserCount; @XmlAttribute(name="totalGroupCount", required=true) private long totalGroupCount; - - + public long getTotalUserCount() { return totalUserCount; } @@ -55,7 +68,63 @@ public class UserStatisticsVO { public void setActiveUserCount(long activeUserCount) { this.activeUserCount = activeUserCount; } - + + public long getActiveUserCountLastDay() { + return activeUserCountLastDay; + } + + public void setActiveUserCountLastDay(long activeUserCountLastDay) { + this.activeUserCountLastDay = activeUserCountLastDay; + } + + public long getActiveUserCountLastWeek() { + return activeUserCountLastWeek; + } + + public void setActiveUserCountLastWeek(long activeUserCountLastWeek) { + this.activeUserCountLastWeek = activeUserCountLastWeek; + } + + public long getActiveUserCountLastMonth() { + return activeUserCountLastMonth; + } + + public void setActiveUserCountLastMonth(long activeUserCountLastMonth) { + this.activeUserCountLastMonth = activeUserCountLastMonth; + } + + public long getActiveUserCountLast6Month() { + return activeUserCountLast6Month; + } + + public void setActiveUserCountLast6Month(long activeUserCountLast6Month) { + this.activeUserCountLast6Month = activeUserCountLast6Month; + } + + public long getExternalUserCount() { + return externalUserCount; + } + + public void setExternalUserCount(long externalUserCount) { + this.externalUserCount = externalUserCount; + } + + public long getBlockedUserCount() { + return blockedUserCount; + } + + public void setBlockedUserCount(long blockedUserCount) { + this.blockedUserCount = blockedUserCount; + } + + public long getDeletedUserCount() { + return deletedUserCount; + } + + public void setDeletedUserCount(long deletedUserCount) { + this.deletedUserCount = deletedUserCount; + } + public long getTotalGroupCount() { return totalGroupCount; } diff --git a/src/test/java/org/olat/portfolio/manager/InvitationDAOTest.java b/src/test/java/org/olat/portfolio/manager/InvitationDAOTest.java index 4c7aad393fd5989c058f43dccfce983d6ee608b4..c53a6a404d8811b269a5d6f66a3adb3d76fc8492 100644 --- a/src/test/java/org/olat/portfolio/manager/InvitationDAOTest.java +++ b/src/test/java/org/olat/portfolio/manager/InvitationDAOTest.java @@ -107,6 +107,16 @@ public class InvitationDAOTest extends OlatTestCase { Assert.assertEquals("kanu.unchou@frentix.com", reloadedInvitation.getMail()); } + @Test + public void countInvitations() { + Invitation invitation = invitationDao.createAndPersistInvitation(); + dbInstance.commit(); + Assert.assertNotNull(invitation); + + long numOfInvitations = invitationDao.countInvitations(); + Assert.assertTrue(numOfInvitations > 0l); + } + /** * Check the HQL code of the the method, and that it doesn't delete to much invitations */ diff --git a/src/test/java/org/olat/restapi/SystemTest.java b/src/test/java/org/olat/restapi/SystemTest.java index 71a2e3b67969d0ffeb79e31cf0db784d9ab96022..3bba36611f939677642573ba6a277aa3706a2d93 100644 --- a/src/test/java/org/olat/restapi/SystemTest.java +++ b/src/test/java/org/olat/restapi/SystemTest.java @@ -153,11 +153,36 @@ public class SystemTest extends OlatJerseyTestCase { URI systemUri = conn.getContextURI().path("system").path("monitoring").path("openolat").path("users").build(); UserStatisticsVO userStats = conn.get(systemUri, UserStatisticsVO.class); - assertNotNull(userStats); - assertTrue(userStats.getTotalUserCount() > 0); - assertTrue(userStats.getTotalGroupCount() >= 0); - assertTrue(userStats.getActiveUserCount() >= 0); + + long totalUserCount = userStats.getTotalUserCount(); + assertTrue(totalUserCount > 0); + long activeUserCount = userStats.getActiveUserCount(); + assertTrue(activeUserCount >= 0); + + long activeUserCountLastDay = userStats.getActiveUserCountLastDay(); + assertTrue(activeUserCountLastDay >= 0); + + long activeUserCountLastWeek = userStats.getActiveUserCountLastWeek(); + assertTrue(activeUserCountLastWeek >= 0); + + long activeUserCountLastMonth = userStats.getActiveUserCountLastMonth(); + assertTrue(activeUserCountLastMonth >= 0); + + long activeUserCountLast6Month = userStats.getActiveUserCountLast6Month(); + assertTrue(activeUserCountLast6Month >= 0); + + long blockedUserCount = userStats.getBlockedUserCount(); + assertTrue(blockedUserCount >= 0); + + long deletedUserCount = userStats.getDeletedUserCount(); + assertTrue(deletedUserCount >= 0); + + long externalUserCount = userStats.getExternalUserCount(); + assertTrue(externalUserCount >= 0); + + long totalGroupCount = userStats.getTotalGroupCount(); + assertTrue(totalGroupCount >= 0); conn.shutdown(); }