← Back to team overview

dhis2-devs team mailing list archive

[Branch ~dhis2-devs-core/dhis2/trunk] Rev 17956: Implemented maintenance function for removing expired user account invitations. Improved period d...

 

------------------------------------------------------------
revno: 17956
committer: Lars Helge Overland <larshelge@xxxxxxxxx>
branch nick: dhis2
timestamp: Tue 2015-01-13 16:01:23 +0100
message:
  Implemented maintenance function for removing expired user account invitations. Improved period deletion handling.
modified:
  dhis-2/dhis-api/src/main/java/org/hisp/dhis/chart/ChartService.java
  dhis-2/dhis-api/src/main/java/org/hisp/dhis/common/AnalyticalObjectStore.java
  dhis-2/dhis-api/src/main/java/org/hisp/dhis/maintenance/MaintenanceService.java
  dhis-2/dhis-api/src/main/java/org/hisp/dhis/mapping/MappingService.java
  dhis-2/dhis-api/src/main/java/org/hisp/dhis/reporttable/ReportTableService.java
  dhis-2/dhis-api/src/main/java/org/hisp/dhis/user/UserQueryParams.java
  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/resources/META-INF/dhis/beans.xml
  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/mapping/DefaultMappingService.java
  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/user/hibernate/HibernateUserStore.java
  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/impl/DefaultChartService.java
  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/impl/DefaultReportTableService.java
  dhis-2/dhis-support/dhis-support-system/src/main/java/org/hisp/dhis/system/util/PageRange.java
  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/resources/org/hisp/dhis/dataadmin/i18n_module.properties
  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/maintenanceForm.vm


--
lp:dhis2
https://code.launchpad.net/~dhis2-devs-core/dhis2/trunk

Your team DHIS 2 developers is subscribed to branch lp:dhis2.
To unsubscribe from this branch go to https://code.launchpad.net/~dhis2-devs-core/dhis2/trunk/+edit-subscription
=== 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 <mortenoh@xxxxxxxxx>
@@ -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<int[]> 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<User> 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 @@
   <bean id="org.hisp.dhis.maintenance.MaintenanceService" class="org.hisp.dhis.maintenance.DefaultMaintenanceService">
     <property name="maintenanceStore" ref="org.hisp.dhis.maintenance.MaintenanceStore" />
     <property name="periodService" ref="org.hisp.dhis.period.PeriodService" />
+    <property name="userService" ref="org.hisp.dhis.user.UserService" />
   </bean>
   
   <!-- Statistics -->

=== 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 <mortenoh@xxxxxxxxx>
@@ -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 @@
 </p>
 
 <p>
+	<input type="checkbox" id="removeExpiredInvitations"/>
+	<label for="removeExpiredInvitations">$i18n.getString( "remove_expired_invitations" )</label>
+</p>
+
+<p>
     <input type="checkbox" id="updateCategoryOptionCombos"/>
     <label for="updateCategoryOptionCombos">$i18n.getString( "update_category_option_combos" )</label>
 </p>