=== modified file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/chart/ChartService.java' --- dhis-2/dhis-api/src/main/java/org/hisp/dhis/chart/ChartService.java 2015-01-07 18:22:38 +0000 +++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/chart/ChartService.java 2015-01-13 15:01:23 +0000 @@ -118,6 +118,8 @@ int countDataElementCharts( DataElement dataElement ); + int countPeriodCharts( Period period ); + int countOrganisationUnitCharts( OrganisationUnit organisationUnit ); int countCategoryOptionGroups( CategoryOptionGroup categoryOptionGroup ); === modified file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/common/AnalyticalObjectStore.java' --- dhis-2/dhis-api/src/main/java/org/hisp/dhis/common/AnalyticalObjectStore.java 2015-01-07 18:22:38 +0000 +++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/common/AnalyticalObjectStore.java 2015-01-13 15:01:23 +0000 @@ -33,6 +33,7 @@ import org.hisp.dhis.dataset.DataSet; import org.hisp.dhis.indicator.Indicator; import org.hisp.dhis.organisationunit.OrganisationUnit; +import org.hisp.dhis.period.Period; /** * @author Morten Olav Hansen @@ -46,6 +47,8 @@ int countDataElementAnalyticalObject( DataElement dataElement ); + int countPeriodAnalyticalObject( Period period ); + int countOrganisationUnitAnalyticalObject( OrganisationUnit organisationUnit ); int countCategoryOptionGroupAnalyticalObject( CategoryOptionGroup categoryOptionGroup ); === modified file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/maintenance/MaintenanceService.java' --- dhis-2/dhis-api/src/main/java/org/hisp/dhis/maintenance/MaintenanceService.java 2014-04-16 15:03:22 +0000 +++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/maintenance/MaintenanceService.java 2015-01-13 15:01:23 +0000 @@ -48,4 +48,9 @@ * Deletes periods which do not have data values associated with them. */ void prunePeriods(); + + /** + * Deletes user accounts representing expired account invitations. + */ + void removeExpiredInvitations(); } === modified file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/mapping/MappingService.java' --- dhis-2/dhis-api/src/main/java/org/hisp/dhis/mapping/MappingService.java 2014-04-28 11:24:08 +0000 +++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/mapping/MappingService.java 2015-01-13 15:01:23 +0000 @@ -32,6 +32,7 @@ import org.hisp.dhis.dataset.DataSet; import org.hisp.dhis.indicator.Indicator; import org.hisp.dhis.organisationunit.OrganisationUnit; +import org.hisp.dhis.period.Period; import java.util.Collection; import java.util.List; @@ -174,6 +175,8 @@ int countDataElementMapViews( DataElement dataElement ); + int countPeriodMapViews( Period period ); + int countOrganisationUnitMapViews( OrganisationUnit organisationUnit ); int countMapLegendSetMapViews( MapLegendSet mapLegendSet ); === modified file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/reporttable/ReportTableService.java' --- dhis-2/dhis-api/src/main/java/org/hisp/dhis/reporttable/ReportTableService.java 2015-01-07 18:22:38 +0000 +++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/reporttable/ReportTableService.java 2015-01-13 15:01:23 +0000 @@ -35,6 +35,7 @@ import org.hisp.dhis.i18n.I18nFormat; import org.hisp.dhis.indicator.Indicator; import org.hisp.dhis.organisationunit.OrganisationUnit; +import org.hisp.dhis.period.Period; import java.util.Collection; import java.util.Date; @@ -156,6 +157,8 @@ int countDataElementReportTables( DataElement dataElement ); + int countPeriodReportTables( Period period ); + int countOrganisationUnitReportTables( OrganisationUnit organisationUnit ); int countCategoryOptionGroups( CategoryOptionGroup categoryOptionGroup ); === modified file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/user/UserQueryParams.java' --- dhis-2/dhis-api/src/main/java/org/hisp/dhis/user/UserQueryParams.java 2015-01-13 10:16:41 +0000 +++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/user/UserQueryParams.java 2015-01-13 15:01:23 +0000 @@ -90,6 +90,7 @@ return MoreObjects.toStringHelper( this ). add( "query", query ). add( "phone number", phoneNumber ). + add( "user", user != null ? user.getUsername() : null ). add( "can manage", canManage ). add( "auth subset", authSubset ). add( "disjoint roles", disjointRoles ). @@ -98,6 +99,7 @@ add( "inactive months", inactiveMonths ). add( "self registered", selfRegistered ). add( "invitation status", invitationStatus ). + add( "organisation unit", organisationUnit != null ? organisationUnit.getUid() : null ). add( "first", first ). add( "max", max ).toString(); } === modified file 'dhis-2/dhis-services/dhis-service-administration/src/main/java/org/hisp/dhis/maintenance/DefaultMaintenanceService.java' --- dhis-2/dhis-services/dhis-service-administration/src/main/java/org/hisp/dhis/maintenance/DefaultMaintenanceService.java 2014-10-16 06:17:19 +0000 +++ dhis-2/dhis-services/dhis-service-administration/src/main/java/org/hisp/dhis/maintenance/DefaultMaintenanceService.java 2015-01-13 15:01:23 +0000 @@ -1,10 +1,18 @@ package org.hisp.dhis.maintenance; +import java.util.Collections; +import java.util.List; + import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.hisp.dhis.common.DeleteNotAllowedException; import org.hisp.dhis.period.Period; import org.hisp.dhis.period.PeriodService; +import org.hisp.dhis.system.util.PageRange; +import org.hisp.dhis.user.User; +import org.hisp.dhis.user.UserInvitationStatus; +import org.hisp.dhis.user.UserQueryParams; +import org.hisp.dhis.user.UserService; /* * Copyright (c) 2004-2014, University of Oslo @@ -36,13 +44,12 @@ /** * @author Lars Helge Overland - * @version $Id$ */ public class DefaultMaintenanceService implements MaintenanceService { private static final Log log = LogFactory.getLog( DefaultMaintenanceService.class ); - + // ------------------------------------------------------------------------- // Dependencies // ------------------------------------------------------------------------- @@ -61,6 +68,13 @@ this.periodService = periodService; } + private UserService userService; + + public void setUserService( UserService userService ) + { + this.userService = userService; + } + // ------------------------------------------------------------------------- // MaintenanceService implementation // ------------------------------------------------------------------------- @@ -90,4 +104,40 @@ } } } + + @Override + public void removeExpiredInvitations() + { + UserQueryParams params = new UserQueryParams(); + params.setInvitationStatus( UserInvitationStatus.EXPIRED ); + + int count = userService.getUserCount( params ); + + PageRange range = new PageRange( count ).setPageSize( 200 ); + List pages = range.getPages(); + Collections.reverse( pages ); // Iterate from end since users are deleted + + log.info( "Pages: " + pages ); + + for ( int[] page : pages ) + { + params.setFirst( page[0] ); + params.setMax( range.getPageSize() ); + List users = userService.getUsers( params ); + + log.info( "Users: " + users.size() ); + + for ( User user : users ) + { + try + { + userService.deleteUser( user ); + } + catch ( DeleteNotAllowedException ex ) + { + log.info( "Could not delete user " + user.getUsername() ); + } + } + } + } } === modified file 'dhis-2/dhis-services/dhis-service-administration/src/main/resources/META-INF/dhis/beans.xml' --- dhis-2/dhis-services/dhis-service-administration/src/main/resources/META-INF/dhis/beans.xml 2014-12-04 06:39:46 +0000 +++ dhis-2/dhis-services/dhis-service-administration/src/main/resources/META-INF/dhis/beans.xml 2015-01-13 15:01:23 +0000 @@ -47,6 +47,7 @@ + === modified file 'dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/common/hibernate/HibernateAnalyticalObjectStore.java' --- dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/common/hibernate/HibernateAnalyticalObjectStore.java 2015-01-07 18:22:38 +0000 +++ dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/common/hibernate/HibernateAnalyticalObjectStore.java 2015-01-13 15:01:23 +0000 @@ -36,6 +36,7 @@ import org.hisp.dhis.dataset.DataSet; import org.hisp.dhis.indicator.Indicator; import org.hisp.dhis.organisationunit.OrganisationUnit; +import org.hisp.dhis.period.Period; /** * @author Morten Olav Hansen @@ -71,6 +72,15 @@ } @Override + public int countPeriodAnalyticalObject( Period period ) + { + Query query = getQuery( "select count(distinct c) from " + clazz.getName() + " c where :period in elements(c.periods)" ); + query.setEntity( "period", period ); + + return ((Long) query.uniqueResult()).intValue(); + } + + @Override public int countOrganisationUnitAnalyticalObject( OrganisationUnit organisationUnit ) { Query query = getQuery( "select count(distinct c) from " + clazz.getName() + " c where :organisationUnit in elements(c.organisationUnits)" ); === modified file 'dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/mapping/DefaultMappingService.java' --- dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/mapping/DefaultMappingService.java 2014-10-16 06:17:19 +0000 +++ dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/mapping/DefaultMappingService.java 2015-01-13 15:01:23 +0000 @@ -516,6 +516,12 @@ } @Override + public int countPeriodMapViews( Period period ) + { + return mapViewStore.countPeriodAnalyticalObject( period ); + } + + @Override public int countOrganisationUnitMapViews( OrganisationUnit organisationUnit ) { return mapViewStore.countOrganisationUnitAnalyticalObject( organisationUnit ); === modified file 'dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/mapping/MapViewDeletionHandler.java' --- dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/mapping/MapViewDeletionHandler.java 2014-04-28 11:24:08 +0000 +++ dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/mapping/MapViewDeletionHandler.java 2015-01-13 15:01:23 +0000 @@ -32,6 +32,7 @@ import org.hisp.dhis.dataset.DataSet; import org.hisp.dhis.indicator.Indicator; import org.hisp.dhis.organisationunit.OrganisationUnit; +import org.hisp.dhis.period.Period; import org.hisp.dhis.system.deletion.DeletionHandler; /** @@ -81,6 +82,12 @@ } @Override + public String allowDeletePeriod( Period period ) + { + return mappingService.countPeriodMapViews( period ) == 0 ? null : ERROR; + } + + @Override public String allowDeleteDataElement( DataElement dataElement ) { return mappingService.countDataElementMapViews( dataElement ) == 0 ? null : ERROR; === modified file 'dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/user/hibernate/HibernateUserStore.java' --- dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/user/hibernate/HibernateUserStore.java 2015-01-01 15:54:26 +0000 +++ dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/user/hibernate/HibernateUserStore.java 2015-01-13 15:01:23 +0000 @@ -133,7 +133,11 @@ if ( UserInvitationStatus.EXPIRED.equals( params.getInvitationStatus() ) ) { - hql += hlp.whereAnd() + " uc.invitation = true and uc.restoreExpiry < current_timestamp() "; + hql += hlp.whereAnd() + " uc.invitation = true " + + "and uc.restoreToken is not null " + + "and uc.restoreCode is not null " + + "and uc.restoreExpiry is not null " + + "and uc.restoreExpiry < current_timestamp() "; } if ( params.getOrganisationUnit() != null ) === modified file 'dhis-2/dhis-services/dhis-service-reporting/src/main/java/org/hisp/dhis/chart/ChartDeletionHandler.java' --- dhis-2/dhis-services/dhis-service-reporting/src/main/java/org/hisp/dhis/chart/ChartDeletionHandler.java 2015-01-07 18:22:38 +0000 +++ dhis-2/dhis-services/dhis-service-reporting/src/main/java/org/hisp/dhis/chart/ChartDeletionHandler.java 2015-01-13 15:01:23 +0000 @@ -33,6 +33,7 @@ import org.hisp.dhis.dataset.DataSet; import org.hisp.dhis.indicator.Indicator; import org.hisp.dhis.organisationunit.OrganisationUnit; +import org.hisp.dhis.period.Period; import org.hisp.dhis.system.deletion.DeletionHandler; /** @@ -80,6 +81,12 @@ { return chartService.countDataElementCharts( dataElement ) == 0 ? null : ERROR; } + + @Override + public String allowDeletePeriod( Period period ) + { + return chartService.countPeriodCharts( period ) == 0 ? null : ERROR; + } @Override public String allowDeleteOrganisationUnit( OrganisationUnit organisationUnit ) === modified file 'dhis-2/dhis-services/dhis-service-reporting/src/main/java/org/hisp/dhis/chart/impl/DefaultChartService.java' --- dhis-2/dhis-services/dhis-service-reporting/src/main/java/org/hisp/dhis/chart/impl/DefaultChartService.java 2015-01-07 18:22:38 +0000 +++ dhis-2/dhis-services/dhis-service-reporting/src/main/java/org/hisp/dhis/chart/impl/DefaultChartService.java 2015-01-13 15:01:23 +0000 @@ -1024,6 +1024,12 @@ { return chartStore.countDataElementAnalyticalObject( dataElement ); } + + @Override + public int countPeriodCharts( Period period ) + { + return chartStore.countPeriodAnalyticalObject( period ); + } @Override public int countOrganisationUnitCharts( OrganisationUnit organisationUnit ) === modified file 'dhis-2/dhis-services/dhis-service-reporting/src/main/java/org/hisp/dhis/reporttable/ReportTableDeletionHandler.java' --- dhis-2/dhis-services/dhis-service-reporting/src/main/java/org/hisp/dhis/reporttable/ReportTableDeletionHandler.java 2015-01-07 18:22:38 +0000 +++ dhis-2/dhis-services/dhis-service-reporting/src/main/java/org/hisp/dhis/reporttable/ReportTableDeletionHandler.java 2015-01-13 15:01:23 +0000 @@ -33,6 +33,7 @@ import org.hisp.dhis.dataset.DataSet; import org.hisp.dhis.indicator.Indicator; import org.hisp.dhis.organisationunit.OrganisationUnit; +import org.hisp.dhis.period.Period; import org.hisp.dhis.system.deletion.DeletionHandler; /** @@ -81,6 +82,12 @@ } @Override + public String allowDeletePeriod( Period period ) + { + return reportTableService.countPeriodReportTables( period ) == 0 ? null : ERROR; + } + + @Override public String allowDeleteOrganisationUnit( OrganisationUnit organisationUnit ) { return reportTableService.countOrganisationUnitReportTables( organisationUnit ) == 0 ? null : ERROR; === modified file 'dhis-2/dhis-services/dhis-service-reporting/src/main/java/org/hisp/dhis/reporttable/impl/DefaultReportTableService.java' --- dhis-2/dhis-services/dhis-service-reporting/src/main/java/org/hisp/dhis/reporttable/impl/DefaultReportTableService.java 2015-01-07 18:22:38 +0000 +++ dhis-2/dhis-services/dhis-service-reporting/src/main/java/org/hisp/dhis/reporttable/impl/DefaultReportTableService.java 2015-01-13 15:01:23 +0000 @@ -44,6 +44,7 @@ import org.hisp.dhis.indicator.Indicator; import org.hisp.dhis.organisationunit.OrganisationUnit; import org.hisp.dhis.organisationunit.OrganisationUnitService; +import org.hisp.dhis.period.Period; import org.hisp.dhis.report.ReportService; import org.hisp.dhis.reporttable.ReportTable; import org.hisp.dhis.reporttable.ReportTableService; @@ -259,6 +260,12 @@ { return reportTableStore.countDataElementAnalyticalObject( dataElement ); } + + @Override + public int countPeriodReportTables( Period period ) + { + return reportTableStore.countPeriodAnalyticalObject( period ); + } @Override public int countOrganisationUnitReportTables( OrganisationUnit organisationUnit ) === modified file 'dhis-2/dhis-support/dhis-support-system/src/main/java/org/hisp/dhis/system/util/PageRange.java' --- dhis-2/dhis-support/dhis-support-system/src/main/java/org/hisp/dhis/system/util/PageRange.java 2015-01-13 14:27:02 +0000 +++ dhis-2/dhis-support/dhis-support-system/src/main/java/org/hisp/dhis/system/util/PageRange.java 2015-01-13 15:01:23 +0000 @@ -139,7 +139,14 @@ return toIndex; } - + /** + * Returns the page size. + */ + public int getPageSize() + { + return pageSize; + } + /** * Returns a list of all pages. Each item is an array where index 0 holds the * from index and index 1 holds the to index. Resets the page. === modified file 'dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-dataadmin/src/main/java/org/hisp/dhis/dataadmin/action/maintenance/PerformMaintenanceAction.java' --- dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-dataadmin/src/main/java/org/hisp/dhis/dataadmin/action/maintenance/PerformMaintenanceAction.java 2014-10-16 06:17:19 +0000 +++ dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-dataadmin/src/main/java/org/hisp/dhis/dataadmin/action/maintenance/PerformMaintenanceAction.java 2015-01-13 15:01:23 +0000 @@ -155,6 +155,13 @@ this.prunePeriods = prunePeriods; } + private boolean removeExpiredInvitations; + + public void setRemoveExpiredInvitations( boolean removeExpiredInvitations ) + { + this.removeExpiredInvitations = removeExpiredInvitations; + } + private boolean updateCategoryOptionCombos; public void setUpdateCategoryOptionCombos( boolean updateCategoryOptionCombos ) @@ -227,6 +234,13 @@ log.info( "'" + username + "': Pruned periods" ); } + if ( removeExpiredInvitations ) + { + maintenanceService.removeExpiredInvitations(); + + log.info( "'" + username + "': Removed expired invitations" ); + } + if ( updateCategoryOptionCombos ) { categoryService.updateAllOptionCombos(); === modified file 'dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-dataadmin/src/main/resources/org/hisp/dhis/dataadmin/i18n_module.properties' --- dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-dataadmin/src/main/resources/org/hisp/dhis/dataadmin/i18n_module.properties 2015-01-07 14:30:52 +0000 +++ dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-dataadmin/src/main/resources/org/hisp/dhis/dataadmin/i18n_module.properties 2015-01-13 15:01:23 +0000 @@ -365,4 +365,5 @@ next_year = Next year update_the_data_elements_and_option_combos_in_expression = Update the data elements and option combos in expression org_unit_group_does_not_exist=Org unit group does not exist -duplicate_periods=Duplicate periods \ No newline at end of file +duplicate_periods=Duplicate periods +remove_expired_invitations=Remove expired invitations \ No newline at end of file === modified file 'dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-dataadmin/src/main/webapp/dhis-web-maintenance-dataadmin/javascript/maintenance.js' --- dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-dataadmin/src/main/webapp/dhis-web-maintenance-dataadmin/javascript/maintenance.js 2014-08-29 08:45:54 +0000 +++ dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-dataadmin/src/main/webapp/dhis-web-maintenance-dataadmin/javascript/maintenance.js 2015-01-13 15:01:23 +0000 @@ -1,15 +1,17 @@ function performMaintenance() { - var clearAnalytics = document.getElementById( "clearAnalytics" ).checked; - var clearDataMart = document.getElementById( "clearDataMart" ).checked; - var dataMartIndex = document.getElementById( "dataMartIndex" ).checked; - var zeroValues = document.getElementById( "zeroValues" ).checked; - var dataSetCompleteness = document.getElementById( "dataSetCompleteness" ).checked; - var prunePeriods = document.getElementById( "prunePeriods" ).checked; - var updateCategoryOptionCombos = document.getElementById( "updateCategoryOptionCombos" ).checked; + var clearAnalytics = $( "#clearAnalytics" ).is( ":checked" ); + var clearDataMart = $( "#clearDataMart" ).is( ":checked" ); + var dataMartIndex = $( "#dataMartIndex" ).is( ":checked" ); + var zeroValues = $( "#zeroValues" ).is( ":checked" ); + var dataSetCompleteness = $( "#dataSetCompleteness" ).is( ":checked" ); + var prunePeriods = $( "#prunePeriods" ).is( ":checked" ); + var removeExpiredInvitations = $( "#removeExpiredInvitations" ).is( ":checked" ); + var updateCategoryOptionCombos = $( "#updateCategoryOptionCombos" ).is( ":checked" ); - if ( clearAnalytics || clearDataMart || dataMartIndex || zeroValues || dataSetCompleteness || prunePeriods || updateCategoryOptionCombos ) + if ( clearAnalytics || clearDataMart || dataMartIndex || zeroValues || + dataSetCompleteness || prunePeriods || removeExpiredInvitations || updateCategoryOptionCombos ) { setHeaderWaitMessage( i18n_performing_maintenance ); @@ -19,6 +21,7 @@ "&zeroValues=" + zeroValues + "&dataSetCompleteness=" + dataSetCompleteness + "&prunePeriods=" + prunePeriods + + "&removeExpiredInvitations=" + removeExpiredInvitations + "&updateCategoryOptionCombos=" + updateCategoryOptionCombos; $.ajax({ === modified file 'dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-dataadmin/src/main/webapp/dhis-web-maintenance-dataadmin/maintenanceForm.vm' --- dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-dataadmin/src/main/webapp/dhis-web-maintenance-dataadmin/maintenanceForm.vm 2014-08-29 08:45:54 +0000 +++ dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-dataadmin/src/main/webapp/dhis-web-maintenance-dataadmin/maintenanceForm.vm 2015-01-13 15:01:23 +0000 @@ -37,6 +37,11 @@

+ + +

+ +