=== modified file 'dhis-2/dhis-services/dhis-service-reporting/src/main/java/org/hisp/dhis/scheduling/DefaultSchedulingManager.java' --- dhis-2/dhis-services/dhis-service-reporting/src/main/java/org/hisp/dhis/scheduling/DefaultSchedulingManager.java 2012-02-02 20:01:36 +0000 +++ dhis-2/dhis-services/dhis-service-reporting/src/main/java/org/hisp/dhis/scheduling/DefaultSchedulingManager.java 2013-03-04 20:41:25 +0000 @@ -33,6 +33,7 @@ import java.util.HashMap; import java.util.Map; +import org.hisp.dhis.common.ListMap; import org.hisp.dhis.setting.SystemSettingManager; import org.hisp.dhis.system.scheduling.Scheduler; @@ -72,17 +73,16 @@ // ------------------------------------------------------------------------- public void scheduleTasks() - { - Map keyCronMap = getScheduledTasks(); + { + ListMap cronKeyMap = getCronKeyMap(); - for ( String key : keyCronMap.keySet() ) + for ( String cron : cronKeyMap.keySet() ) { - String cron = keyCronMap.get( key ); - Runnable task = tasks.get( key ); + ScheduledTasks scheduledTasks = getScheduledTasksForCron( cron, cronKeyMap ); - if ( cron != null && task != null ) + if ( !scheduledTasks.isEmpty() ) { - scheduler.scheduleTask( key, task, cron ); + scheduler.scheduleTask( cron, scheduledTasks, cron ); } } } @@ -103,34 +103,82 @@ public void executeTasks() { - Map keyCronMap = getScheduledTasks(); + ListMap cronKeyMap = getCronKeyMap(); - for ( String key : keyCronMap.keySet() ) + for ( String cron : cronKeyMap.keySet() ) { - Runnable task = tasks.get( key ); + ScheduledTasks scheduledTasks = getScheduledTasksForCron( cron, cronKeyMap ); - if ( task != null ) + if ( !scheduledTasks.isEmpty() ) { - scheduler.executeTask( task ); + scheduler.executeTask( scheduledTasks ); } } } + + public ListMap getCronKeyMap() + { + Map keyCronMap = getKeyCronMap(); + + ListMap cronKeyMap = new ListMap(); + + for ( String key : keyCronMap.keySet() ) + { + String cron = keyCronMap.get( key ); + + cronKeyMap.putValue( cron, key ); + } + + return cronKeyMap; + } + + public boolean isScheduled( String key ) + { + Map keyCronMap = getKeyCronMap(); + + return keyCronMap.get( key ) != null; + } + public String getTaskStatus() + { + ListMap cronKeyMap = getCronKeyMap(); + + if ( cronKeyMap.size() == 0 ) + { + return STATUS_NOT_STARTED; + } + + String firstTask = cronKeyMap.keySet().iterator().next(); + + return scheduler.getTaskStatus( firstTask ); + } + + // ------------------------------------------------------------------------- + // Supportive methods + // ------------------------------------------------------------------------- + + /** + * Returns a ScheduledTasks object for the given cron expression. The + * ScheduledTasks object contains a list of tasks. + */ + private ScheduledTasks getScheduledTasksForCron( String cron, ListMap cronKeyMap ) + { + ScheduledTasks scheduledTasks = new ScheduledTasks(); + + for ( String key : cronKeyMap.get( cron ) ) + { + scheduledTasks.addTask( tasks.get( key ) ); + } + + return scheduledTasks; + } + + /** + * Returns a mapping between task keys and cron expressions. + */ @SuppressWarnings("unchecked") - public Map getScheduledTasks() + private Map getKeyCronMap() { return (Map) systemSettingManager.getSystemSetting( KEY_SCHEDULED_TASKS, new HashMap() ); } - - public String getTaskStatus() - { - Map keyCronMap = getScheduledTasks(); - - if ( keyCronMap.size() == 0 ) - { - return STATUS_NOT_STARTED; - } - - return scheduler.getTaskStatus( keyCronMap.keySet().iterator().next() ); - } } === modified file 'dhis-2/dhis-services/dhis-service-reporting/src/main/java/org/hisp/dhis/scheduling/ScheduledTasks.java' --- dhis-2/dhis-services/dhis-service-reporting/src/main/java/org/hisp/dhis/scheduling/ScheduledTasks.java 2013-03-04 14:44:15 +0000 +++ dhis-2/dhis-services/dhis-service-reporting/src/main/java/org/hisp/dhis/scheduling/ScheduledTasks.java 2013-03-04 20:41:25 +0000 @@ -40,7 +40,15 @@ public void addTask( Runnable task ) { - this.tasks.add( task ); + if ( task != null ) + { + this.tasks.add( task ); + } + } + + public boolean isEmpty() + { + return tasks == null || tasks.size() == 0; } @Override === modified file 'dhis-2/dhis-services/dhis-service-reporting/src/main/java/org/hisp/dhis/scheduling/SchedulingManager.java' --- dhis-2/dhis-services/dhis-service-reporting/src/main/java/org/hisp/dhis/scheduling/SchedulingManager.java 2013-03-04 14:44:15 +0000 +++ dhis-2/dhis-services/dhis-service-reporting/src/main/java/org/hisp/dhis/scheduling/SchedulingManager.java 2013-03-04 20:41:25 +0000 @@ -29,6 +29,8 @@ import java.util.Map; +import org.hisp.dhis.common.ListMap; + /** * @author Lars Helge Overland */ @@ -36,20 +38,46 @@ { final String TASK_RESOURCE_TABLE = "resourceTableTask"; final String TASK_DATAMART_LAST_12_MONTHS = "dataMartLast12MonthsTask"; - final String TASK_DATAMART_LAST_6_MONTS = "dataMartLast6MonthsTask"; + final String TASK_DATAMART_LAST_6_MONTHS = "dataMartLast6MonthsTask"; final String TASK_DATAMART_FROM_6_TO_12_MONTS = "dataMartFrom6To12MonthsTask"; final String TASK_ANALYTICS_ALL = "analyticsAllTask"; final String TASK_ANALYTICS_LAST_3_YEARS = "analyticsLast3YearsTask"; + /** + * Schedule all tasks. + */ void scheduleTasks(); + /** + * Schedule the given tasks. + * + * @param keyCronMap map of tasks to be scheduled. The map key is the key of + * the task, i.e. the task bean identifier. The map value is the cron + * expression to use when scheduling the task. + */ void scheduleTasks( Map keyCronMap ); + /** + * Stop all tasks. + */ void stopTasks(); + /** + * Execute all tasks immediately. + */ void executeTasks(); - Map getScheduledTasks(); - + /** + * Get a mapping of cron expressions and list of task keys for all scheduled + * tasks. + */ + ListMap getCronKeyMap(); + + boolean isScheduled( String key ); + + /** + * Gets the task status. Can be STATUS_RUNNING, STATUS_DONE, STATUS_STOPPED, + * STATUS_NOT_STARTED. + */ String getTaskStatus(); } === added file 'dhis-2/dhis-services/dhis-service-reporting/src/test/java/org/hisp/dhis/scheduling/SchedulingManagerTest.java' --- dhis-2/dhis-services/dhis-service-reporting/src/test/java/org/hisp/dhis/scheduling/SchedulingManagerTest.java 1970-01-01 00:00:00 +0000 +++ dhis-2/dhis-services/dhis-service-reporting/src/test/java/org/hisp/dhis/scheduling/SchedulingManagerTest.java 2013-03-04 20:41:25 +0000 @@ -0,0 +1,108 @@ +package org.hisp.dhis.scheduling; + +/* + * Copyright (c) 2004-2012, University of Oslo + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * * Neither the name of the HISP project nor the names of its contributors may + * be used to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +import static org.hisp.dhis.scheduling.SchedulingManager.TASK_ANALYTICS_ALL; +import static org.hisp.dhis.scheduling.SchedulingManager.TASK_DATAMART_LAST_6_MONTHS; +import static org.hisp.dhis.scheduling.SchedulingManager.TASK_RESOURCE_TABLE; +import static org.hisp.dhis.system.scheduling.Scheduler.CRON_DAILY_0AM; +import static org.hisp.dhis.system.scheduling.Scheduler.CRON_DAILY_0AM_EXCEPT_SUNDAY; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +import java.util.HashMap; +import java.util.Map; + +import org.hisp.dhis.DhisSpringTest; +import org.hisp.dhis.common.ListMap; +import org.hisp.dhis.system.scheduling.Scheduler; +import org.junit.Test; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @author Lars Helge Overland + */ +public class SchedulingManagerTest + extends DhisSpringTest +{ + @Autowired + private SchedulingManager schedulingManager; + + @Test + public void testScheduleTasks() + { + Map keyCronMap = new HashMap(); + keyCronMap.put( TASK_RESOURCE_TABLE, CRON_DAILY_0AM ); + keyCronMap.put( TASK_ANALYTICS_ALL, CRON_DAILY_0AM ); + keyCronMap.put( TASK_DATAMART_LAST_6_MONTHS, CRON_DAILY_0AM_EXCEPT_SUNDAY ); + + schedulingManager.scheduleTasks( keyCronMap ); + + ListMap cronKeyMap = schedulingManager.getCronKeyMap(); + + assertEquals( 2, cronKeyMap.size() ); + assertTrue( cronKeyMap.containsKey( CRON_DAILY_0AM ) ); + assertTrue( cronKeyMap.containsKey( CRON_DAILY_0AM_EXCEPT_SUNDAY ) ); + assertEquals( 2, cronKeyMap.get( CRON_DAILY_0AM ).size() ); + assertEquals( 1, cronKeyMap.get( CRON_DAILY_0AM_EXCEPT_SUNDAY ).size() ); + + assertEquals( Scheduler.STATUS_RUNNING, schedulingManager.getTaskStatus() ); + } + + @Test + public void testStopTasks() + { + Map keyCronMap = new HashMap(); + keyCronMap.put( TASK_RESOURCE_TABLE, CRON_DAILY_0AM ); + keyCronMap.put( TASK_ANALYTICS_ALL, CRON_DAILY_0AM ); + + assertEquals( Scheduler.STATUS_NOT_STARTED, schedulingManager.getTaskStatus() ); + + schedulingManager.scheduleTasks( keyCronMap ); + + assertEquals( Scheduler.STATUS_RUNNING, schedulingManager.getTaskStatus() ); + + schedulingManager.stopTasks(); + + assertEquals( Scheduler.STATUS_NOT_STARTED, schedulingManager.getTaskStatus() ); + } + + @Test + public void testIsScheduled() + { + Map keyCronMap = new HashMap(); + keyCronMap.put( TASK_RESOURCE_TABLE, CRON_DAILY_0AM ); + keyCronMap.put( TASK_ANALYTICS_ALL, CRON_DAILY_0AM ); + + schedulingManager.scheduleTasks( keyCronMap ); + + assertTrue( schedulingManager.isScheduled( TASK_RESOURCE_TABLE ) ); + assertFalse( schedulingManager.isScheduled( TASK_DATAMART_LAST_6_MONTHS ) ); + } +} === modified file 'dhis-2/dhis-support/dhis-support-system/src/main/java/org/hisp/dhis/system/scheduling/Scheduler.java' --- dhis-2/dhis-support/dhis-support-system/src/main/java/org/hisp/dhis/system/scheduling/Scheduler.java 2012-03-06 09:27:38 +0000 +++ dhis-2/dhis-support/dhis-support-system/src/main/java/org/hisp/dhis/system/scheduling/Scheduler.java 2013-03-04 20:41:25 +0000 @@ -33,7 +33,6 @@ public interface Scheduler { final String CRON_DAILY_0AM = "0 0 0 * * ?"; - final String CRON_DAILY_1AM = "0 0 1 * * ?"; final String CRON_DAILY_0AM_EXCEPT_SUNDAY = "0 0 0 ? * 1-6"; final String CRON_WEEKLY_SUNDAY_0AM = "0 0 0 ? * 0"; final String CRON_TEST = "0 * * * * ?"; @@ -43,13 +42,46 @@ final String STATUS_STOPPED = "stopped"; final String STATUS_NOT_STARTED = "not_started"; + /** + * Execute the given task immediately. + * + * @task the task to execute. + */ void executeTask( Runnable task ); + /** + * Schedule the given task for future execution. The task can be referenced + * later through the given task key. A task cannot be scheduled if another + * task with the same key is already scheduled. The task must be unique for + * the task but can have an arbitrary value. + * + * @param key the task key, cannot be null. + * @param task the task to schedule. + * @param cronExpr the cron expression to use for the task scheduling. + * @return true if the task was scheduled for execution as a result of this + * operation, false if not. + */ boolean scheduleTask( String key, Runnable task, String cronExpr ); + /** + * Deactivates scheduling of the task with the given key. + * + * @param key the task key. + * @return true if the task was deactivated as a result of this operation, + * false if not. + */ boolean stopTask( String key ); + /** + * Deactivates scheduling for all tasks. + */ void stopAllTasks(); + /** + * Gets the status for the task with the given key. + * + * @param key the task key. + * @return the task status. + */ String getTaskStatus( String key ); } === modified file 'dhis-2/dhis-web/dhis-web-commons-resources/src/main/webapp/dhis-web-commons/css/widgets.css' --- dhis-2/dhis-web/dhis-web-commons-resources/src/main/webapp/dhis-web-commons/css/widgets.css 2012-12-04 13:16:24 +0000 +++ dhis-2/dhis-web/dhis-web-commons-resources/src/main/webapp/dhis-web-commons/css/widgets.css 2013-03-04 20:41:25 +0000 @@ -486,8 +486,15 @@ /* Settings */ /*----------------------------------------------------------------------------*/ +.settingHeader +{ + padding: 6px 2px; + font-size: 12pt; + color: #373737; +} + .settingLabel -{ +{ padding: 2px; font-size: 10pt; } === modified file 'dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-dataadmin/src/main/java/org/hisp/dhis/dataadmin/action/scheduling/ScheduleTasksAction.java' --- dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-dataadmin/src/main/java/org/hisp/dhis/dataadmin/action/scheduling/ScheduleTasksAction.java 2012-02-02 20:01:36 +0000 +++ dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-dataadmin/src/main/java/org/hisp/dhis/dataadmin/action/scheduling/ScheduleTasksAction.java 2013-03-04 20:41:25 +0000 @@ -27,21 +27,24 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +import static org.hisp.dhis.setting.SystemSettingManager.DEFAULT_ORGUNITGROUPSET_AGG_LEVEL; import static org.hisp.dhis.setting.SystemSettingManager.DEFAULT_SCHEDULED_PERIOD_TYPES; import static org.hisp.dhis.setting.SystemSettingManager.KEY_ORGUNITGROUPSET_AGG_LEVEL; -import static org.hisp.dhis.setting.SystemSettingManager.DEFAULT_ORGUNITGROUPSET_AGG_LEVEL; import static org.hisp.dhis.setting.SystemSettingManager.KEY_SCHEDULED_PERIOD_TYPES; +import static org.hisp.dhis.scheduling.SchedulingManager.*; +import static org.hisp.dhis.system.scheduling.Scheduler.*; + import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; -import org.hisp.dhis.setting.SystemSettingManager; import org.hisp.dhis.organisationunit.OrganisationUnitLevel; import org.hisp.dhis.organisationunit.OrganisationUnitService; import org.hisp.dhis.scheduling.SchedulingManager; +import org.hisp.dhis.setting.SystemSettingManager; import org.hisp.dhis.system.scheduling.Scheduler; import com.opensymphony.xwork2.Action; @@ -54,7 +57,9 @@ { private static final String STRATEGY_LAST_12_DAILY = "last12Daily"; private static final String STRATEGY_LAST_6_DAILY_6_TO_12_WEEKLY = "last6Daily6To12Weekly"; - + private static final String STRATEGY_ALL_DAILY = "allDaily"; + private static final String STRATEGY_LAST_3_YEARS_DAILY = "last3YearsDaily"; + // ------------------------------------------------------------------------- // Dependencies // ------------------------------------------------------------------------- @@ -98,6 +103,30 @@ this.schedule = schedule; } + private String resourceTableStrategy; + + public String getResourceTableStrategy() + { + return resourceTableStrategy; + } + + public void setResourceTableStrategy( String resourceTableStrategy ) + { + this.resourceTableStrategy = resourceTableStrategy; + } + + private String analyticsStrategy; + + public String getAnalyticsStrategy() + { + return analyticsStrategy; + } + + public void setAnalyticsStrategy( String analyticsStrategy ) + { + this.analyticsStrategy = analyticsStrategy; + } + private Set scheduledPeriodTypes = new HashSet(); public Set getScheduledPeriodTypes() @@ -182,15 +211,41 @@ else { Map keyCronMap = new HashMap(); + + // ------------------------------------------------------------- + // Resource tables + // ------------------------------------------------------------- + + if ( STRATEGY_ALL_DAILY.equals( resourceTableStrategy ) ) + { + keyCronMap.put( TASK_RESOURCE_TABLE, CRON_DAILY_0AM ); + } + + // ------------------------------------------------------------- + // Analytics + // ------------------------------------------------------------- + + if ( STRATEGY_ALL_DAILY.equals( analyticsStrategy ) ) + { + keyCronMap.put( TASK_ANALYTICS_ALL, CRON_DAILY_0AM ); + } + else if ( STRATEGY_LAST_3_YEARS_DAILY.equals( analyticsStrategy ) ) + { + keyCronMap.put( TASK_ANALYTICS_LAST_3_YEARS, CRON_DAILY_0AM ); + } + + // ------------------------------------------------------------- + // Data mart + // ------------------------------------------------------------- if ( STRATEGY_LAST_12_DAILY.equals( dataMartStrategy ) ) { - keyCronMap.put( SchedulingManager.TASK_DATAMART_LAST_12_MONTHS, Scheduler.CRON_DAILY_0AM ); + keyCronMap.put( TASK_DATAMART_LAST_12_MONTHS, CRON_DAILY_0AM ); } else if ( STRATEGY_LAST_6_DAILY_6_TO_12_WEEKLY.equals( dataMartStrategy ) ) { - keyCronMap.put( SchedulingManager.TASK_DATAMART_LAST_6_MONTS, Scheduler.CRON_DAILY_0AM_EXCEPT_SUNDAY ); - keyCronMap.put( SchedulingManager.TASK_DATAMART_FROM_6_TO_12_MONTS, Scheduler.CRON_WEEKLY_SUNDAY_0AM ); + keyCronMap.put( TASK_DATAMART_LAST_6_MONTHS, CRON_DAILY_0AM_EXCEPT_SUNDAY ); + keyCronMap.put( TASK_DATAMART_FROM_6_TO_12_MONTS, CRON_WEEKLY_SUNDAY_0AM ); } schedulingManager.scheduleTasks( keyCronMap ); @@ -198,16 +253,49 @@ } else { - scheduledPeriodTypes = (Set) systemSettingManager.getSystemSetting( KEY_SCHEDULED_PERIOD_TYPES, DEFAULT_SCHEDULED_PERIOD_TYPES ); - orgUnitGroupSetAggLevel = (Integer) systemSettingManager.getSystemSetting( KEY_ORGUNITGROUPSET_AGG_LEVEL, DEFAULT_ORGUNITGROUPSET_AGG_LEVEL ); - dataMartStrategy = schedulingManager.getScheduledTasks().containsKey( SchedulingManager.TASK_DATAMART_LAST_12_MONTHS ) ? - STRATEGY_LAST_12_DAILY : STRATEGY_LAST_6_DAILY_6_TO_12_WEEKLY; + // ----------------------------------------------------------------- + // Resource tables + // ----------------------------------------------------------------- + + if ( schedulingManager.isScheduled( TASK_RESOURCE_TABLE ) ) + { + resourceTableStrategy = STRATEGY_ALL_DAILY; + } + + // ----------------------------------------------------------------- + // Analytics + // ----------------------------------------------------------------- + + if ( schedulingManager.isScheduled( TASK_ANALYTICS_ALL ) ) + { + analyticsStrategy = STRATEGY_ALL_DAILY; + } + else if ( schedulingManager.isScheduled( TASK_ANALYTICS_LAST_3_YEARS ) ) + { + analyticsStrategy = STRATEGY_LAST_3_YEARS_DAILY; + } + + // ----------------------------------------------------------------- + // Data mart + // ----------------------------------------------------------------- + + if ( schedulingManager.isScheduled( TASK_DATAMART_LAST_12_MONTHS ) ) + { + dataMartStrategy = STRATEGY_LAST_12_DAILY; + } + else if ( schedulingManager.isScheduled( TASK_DATAMART_LAST_6_MONTHS ) ) + { + dataMartStrategy = STRATEGY_LAST_6_DAILY_6_TO_12_WEEKLY; + } } - + + scheduledPeriodTypes = (Set) systemSettingManager.getSystemSetting( KEY_SCHEDULED_PERIOD_TYPES, DEFAULT_SCHEDULED_PERIOD_TYPES ); + orgUnitGroupSetAggLevel = (Integer) systemSettingManager.getSystemSetting( KEY_ORGUNITGROUPSET_AGG_LEVEL, DEFAULT_ORGUNITGROUPSET_AGG_LEVEL ); + status = schedulingManager.getTaskStatus(); - running = Scheduler.STATUS_RUNNING.equals( status ); + running = STATUS_RUNNING.equals( status ); levels = organisationUnitService.getOrganisationUnitLevels(); - + return SUCCESS; } } === 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 2012-11-25 20:18:52 +0000 +++ dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-dataadmin/src/main/resources/org/hisp/dhis/dataadmin/i18n_module.properties 2013-03-04 20:41:25 +0000 @@ -268,10 +268,18 @@ aggregation_period_types=Aggregation period types running=active done=done -datamart_task_strategy=Data mart task strategy +resource_tables=Resource tables +data_mart=Data mart +analytics_tables=Analytics tables +analytics_tables_task_strategy=Analytics tables task strategy +last_3_years_daily=Last 3 years daily +all_daily=All daily +resource_table_task_strategy=Resource tables task strategy +data_mart_task_strategy=Data mart task strategy never=Never last_12_months_daily=Last 12 months daily last_6_months_daily_6_to_12_months_weekly=Last 6 months daily + 6 to 12 months weekly +daily=Daily organisation_unit_group_set_aggregation_level=Organisation unit group set aggregation level aggregated_org_unit_data_values=Aggregated org unit data values aggregated_org_unit_indicator_values=Aggregated org unit indicator values === modified file 'dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-dataadmin/src/main/webapp/dhis-web-maintenance-dataadmin/viewScheduledTasks.vm' --- dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-dataadmin/src/main/webapp/dhis-web-maintenance-dataadmin/viewScheduledTasks.vm 2013-01-28 06:30:22 +0000 +++ dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-dataadmin/src/main/webapp/dhis-web-maintenance-dataadmin/viewScheduledTasks.vm 2013-03-04 20:41:25 +0000 @@ -8,68 +8,81 @@
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
$i18n.getString( "aggregation_period_types" )
-   -   -   -

-   -   - -
$i18n.getString( "organisation_unit_group_set_aggregation_level" )
- -
$i18n.getString( "datamart_task_strategy" )
- -
- - -
+ + +
$i18n.getString( "resource_tables" )
+ +
$i18n.getString( "resource_table_task_strategy" )
+ +
+ +
+ + + +
$i18n.getString( "analytics_tables" )
+ +
$i18n.getString( "analytics_tables_task_strategy" )
+ +
+ +
+ + + +
$i18n.getString( "data_mart" )
+ +
$i18n.getString( "aggregation_period_types" )
+ +
+  +  +  +
+  +  + +
+ +
$i18n.getString( "organisation_unit_group_set_aggregation_level" )
+ +
+ +
+ +
$i18n.getString( "data_mart_task_strategy" )
+ +
+ +
+ +
+ + +
+
$i18n.getString( "scheduling_is" ) $!i18n.getString( $!status )