From 1df45f86cb72dbbfb34fa8d2ca3a66d14a15328a Mon Sep 17 00:00:00 2001 From: Bob Jolliffe Date: Thu, 22 Jun 2017 18:15:51 +0100 Subject: [PATCH 01/17] upgrade jackson and poi in 2.25 --- dhis-2/pom.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/dhis-2/pom.xml b/dhis-2/pom.xml index 53a9586c..474b0098 100644 --- a/dhis-2/pom.xml +++ b/dhis-2/pom.xml @@ -602,12 +602,12 @@ org.apache.poi poi - 3.10.1 + 3.15 org.apache.poi poi-ooxml - 3.10.1 + 3.15 org.hisp @@ -1091,7 +1091,7 @@ 1.6.4 - 2.6.6 + 2.7.4 1.7.21 14.3 6.3.1 From 9b2e09969290826fd30b4d349a3f2bec9b666bc1 Mon Sep 17 00:00:00 2001 From: Bekkalizer Date: Tue, 27 Jun 2017 23:45:08 +0200 Subject: [PATCH 02/17] Fixed bug in variable replacement --- .../javascripts/dhis2/dhis2.angular.services.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dhis-2/dhis-web/dhis-web-commons-resources/src/main/webapp/dhis-web-commons/javascripts/dhis2/dhis2.angular.services.js b/dhis-2/dhis-web/dhis-web-commons-resources/src/main/webapp/dhis-web-commons/javascripts/dhis2/dhis2.angular.services.js index 2e8104cd..dca18147 100644 --- a/dhis-2/dhis-web/dhis-web-commons-resources/src/main/webapp/dhis-web-commons/javascripts/dhis2/dhis2.angular.services.js +++ b/dhis-2/dhis-web/dhis-web-commons-resources/src/main/webapp/dhis-web-commons/javascripts/dhis2/dhis2.angular.services.js @@ -1622,7 +1622,7 @@ var d2Services = angular.module('d2Services', ['ngResource']) //Check if the expression contains program rule variables at all(any curly braces): if(expression.indexOf('{') !== -1) { //Find every variable name in the expression; - var variablespresent = expression.match(/[A#CV]{\w -_.}/g); + var variablespresent = expression.match(/[A#CV]\{[\w -_.]+}/g); //Replace each matched variable: angular.forEach(variablespresent, function(variablepresent) { //First strip away any prefix and postfix signs from the variable name: From 5f645b2c540ba621da72bbc660f7035de6e26c16 Mon Sep 17 00:00:00 2001 From: Bekkalizer Date: Mon, 10 Jul 2017 20:28:56 +0200 Subject: [PATCH 03/17] Fixed problem evaluating program indicators for multiple partitions Manual backport: Fixed bug that prevented program indicators from being calculated when combining financial year with variables other than V{event_count} Some refactors and cleanup done in the process --- .../hisp/dhis/program/ProgramIndicator.java | 50 +++++++++++++++++++ .../event/data/JdbcEventAnalyticsManager.java | 7 ++- .../DefaultProgramIndicatorService.java | 38 ++++---------- 3 files changed, 65 insertions(+), 30 deletions(-) diff --git a/dhis-2/dhis-api/src/main/java/org/hisp/dhis/program/ProgramIndicator.java b/dhis-2/dhis-api/src/main/java/org/hisp/dhis/program/ProgramIndicator.java index 7c6dcce7..9deec9ef 100644 --- a/dhis-2/dhis-api/src/main/java/org/hisp/dhis/program/ProgramIndicator.java +++ b/dhis-2/dhis-api/src/main/java/org/hisp/dhis/program/ProgramIndicator.java @@ -33,7 +33,9 @@ import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper; import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty; import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement; +import com.google.common.collect.ImmutableMap; import com.google.common.collect.Sets; + import org.hisp.dhis.analytics.AggregationType; import org.hisp.dhis.common.BaseDataDimensionalItemObject; import org.hisp.dhis.common.BaseIdentifiableObject; @@ -44,6 +46,7 @@ import org.hisp.dhis.common.RegexUtils; import java.util.HashSet; +import java.util.Map; import java.util.Set; import java.util.regex.Pattern; @@ -101,6 +104,17 @@ public class ProgramIndicator public static final String INVALID_IDENTIFIERS_IN_EXPRESSION = "invalid_identifiers_in_expression"; public static final String FILTER_NOT_EVALUATING_TO_TRUE_OR_FALSE = "filter_not_evaluating_to_true_or_false"; + public static final String UNKNOWN_VARIABLE = "unknown_variable"; + + private static final Map VARIABLE_COLUMNNAME_MAP = ImmutableMap.builder(). + put( ProgramIndicator.VAR_EXECUTION_DATE, "executiondate" ). + put( ProgramIndicator.VAR_DUE_DATE, "duedate" ). + put( ProgramIndicator.VAR_ENROLLMENT_DATE, "enrollmentdate" ). + put( ProgramIndicator.VAR_INCIDENT_DATE, "incidentdate" ). + put( ProgramIndicator.VAR_EVENT_COUNT, "psi" ). + put( ProgramIndicator.VAR_ENROLLMENT_COUNT, "pi" ). + put( ProgramIndicator.VAR_TEI_COUNT, "tei" ).build(); + private Program program; private String expression; @@ -159,6 +173,42 @@ public static Set getDataElementAndAttributeIdentifiers( String input ) RegexUtils.getMatches( DATAELEMENT_PATTERN, input, 2 ), RegexUtils.getMatches( ATTRIBUTE_PATTERN, input, 1 ) ); } + + /** + * Returns a set of all analytics columns required for the variables used in the given expression + * + * @param expression the program indicator expression. + * @return a set of column names + */ + public static Set getVariableColumnNames( String expression ) + { + Set requiredColumns = new HashSet(); + + Set variables = + RegexUtils.getMatches( VARIABLE_PATTERN, expression, 1 ); + + for ( String variable : variables ) + { + String columnName = getVariableColumnName( variable ); + if ( null != columnName ) + { + requiredColumns.add( columnName ); + } + } + + return requiredColumns; + } + + /** + * Returns the analytics column name associated with the program indicator variable. + * + * @param var the program indicator variable name + * @return the analytics column name, or null if there is no specific column used for the variable + */ + public static String getVariableColumnName( String var ) + { + return VARIABLE_COLUMNNAME_MAP.containsKey( var ) ? VARIABLE_COLUMNNAME_MAP.get( var ) : null; + } public void addProgramIndicatorGroup( ProgramIndicatorGroup group ) { diff --git a/dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/event/data/JdbcEventAnalyticsManager.java b/dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/event/data/JdbcEventAnalyticsManager.java index 10b2b4eb..8e86eac2 100644 --- a/dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/event/data/JdbcEventAnalyticsManager.java +++ b/dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/event/data/JdbcEventAnalyticsManager.java @@ -470,7 +470,9 @@ else if ( params.hasProgramIndicatorDimension() ) { Set uids = ProgramIndicator.getDataElementAndAttributeIdentifiers( params.getProgramIndicator().getExpression() ); - return uids.stream().map( uid -> statementBuilder.columnQuote( uid ) ).collect( Collectors.toList() ); + Set variableColumnNames = ProgramIndicator.getVariableColumnNames( params.getProgramIndicator().getExpression() ); + + return Sets.union( uids, variableColumnNames ).stream().map( uid -> statementBuilder.columnQuote( uid ) ).collect( Collectors.toList() ); } else { @@ -582,7 +584,8 @@ private String getFromWhereClause( EventQueryParams params, List fixedCo */ private String getFromWhereMultiplePartitionsClause( EventQueryParams params, List fixedColumns ) { - List cols = ListUtils.distinctUnion( fixedColumns, getAggregateColumns( params ), getPartitionSelectColumns( params ) ); + List cols = ListUtils.distinctUnion( fixedColumns.stream().map( uid -> statementBuilder.columnQuote( uid ) ).collect( Collectors.toList() ), + getAggregateColumns( params ), getPartitionSelectColumns( params ) ); String selectCols = StringUtils.join( cols, "," ); diff --git a/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/program/DefaultProgramIndicatorService.java b/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/program/DefaultProgramIndicatorService.java index 84f061f9..83444d48 100644 --- a/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/program/DefaultProgramIndicatorService.java +++ b/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/program/DefaultProgramIndicatorService.java @@ -561,23 +561,9 @@ private String getVariableAsSql( String var, String expression ) { final String dbl = statementBuilder.getDoubleColumnType(); - if ( ProgramIndicator.VAR_EXECUTION_DATE.equals( var ) ) - { - return "executiondate"; - } - else if ( ProgramIndicator.VAR_DUE_DATE.equals( var ) ) - { - return "duedate"; - } - else if ( ProgramIndicator.VAR_ENROLLMENT_DATE.equals( var ) ) - { - return "enrollmentdate"; - } - else if ( ProgramIndicator.VAR_INCIDENT_DATE.equals( var ) ) - { - return "incidentdate"; - } - else if ( ProgramIndicator.VAR_CURRENT_DATE.equals( var ) ) + String variableColumnName = ProgramIndicator.getVariableColumnName( var ); + + if ( ProgramIndicator.VAR_CURRENT_DATE.equals( var ) ) { return "'" + DateUtils.getLongDateString() + "'"; } @@ -603,21 +589,17 @@ else if ( ProgramIndicator.VAR_ZERO_POS_VALUE_COUNT.equals( var ) ) return TextUtils.removeLast( sql, "+" ).trim() + ") as " + dbl + "),0)"; } - else if ( ProgramIndicator.VAR_EVENT_COUNT.equals( var ) ) - { - return "distinct psi"; - } - else if ( ProgramIndicator.VAR_ENROLLMENT_COUNT.equals( var ) ) + else if ( ProgramIndicator.VAR_EVENT_COUNT.equals( var ) + || ProgramIndicator.VAR_ENROLLMENT_COUNT.equals( var ) + || ProgramIndicator.VAR_TEI_COUNT.equals( var ) ) { - return "distinct pi"; - } - else if ( ProgramIndicator.VAR_TEI_COUNT.equals( var ) ) - { - return "distinct tei"; + return "distinct " + variableColumnName; } - return null; + return variableColumnName; } + + private String getNumericIgnoreNullSql( String column ) { From c28d7b6e34a8fec0733ea60cc8999723d9e2acaf Mon Sep 17 00:00:00 2001 From: Jim Grace Date: Tue, 11 Jul 2017 15:49:11 -0400 Subject: [PATCH 04/17] Fix user update, delete permission checking (#1016) (cherry picked from commit a5911b1353fd6a031f9cd90907031d67af35d7ba) --- .../controller/AbstractCrudController.java | 4 +- .../controller/user/UserController.java | 44 ++++++++++++++++++- .../dhis/user/action/DisableUserAction.java | 6 ++- .../dhis/user/action/RemoveUserAction.java | 10 +++-- .../dhis/user/action/SetupTreeAction.java | 9 +++- .../dhis/user/action/UpdateUserAction.java | 11 ++--- 6 files changed, 68 insertions(+), 16 deletions(-) diff --git a/dhis-2/dhis-web/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/AbstractCrudController.java b/dhis-2/dhis-web/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/AbstractCrudController.java index 2593ae27..3738a0d2 100644 --- a/dhis-2/dhis-web/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/AbstractCrudController.java +++ b/dhis-2/dhis-web/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/AbstractCrudController.java @@ -992,7 +992,7 @@ protected void postUpdateEntity( T entity ) { } - protected void preDeleteEntity( T entity ) + protected void preDeleteEntity( T entity ) throws Exception { } @@ -1000,7 +1000,7 @@ protected void postDeleteEntity() { } - protected void prePatchEntity( T entity, T newEntity ) + protected void prePatchEntity( T entity, T newEntity ) throws Exception { } diff --git a/dhis-2/dhis-web/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/user/UserController.java b/dhis-2/dhis-web/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/user/UserController.java index de0e43d1..36b70325 100644 --- a/dhis-2/dhis-web/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/user/UserController.java +++ b/dhis-2/dhis-web/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/user/UserController.java @@ -433,7 +433,8 @@ public void putXmlObject( @PathVariable( "uid" ) String pvUid, HttpServletReques User parsed = renderService.fromXml( request.getInputStream(), getEntityClass() ); parsed.setUid( pvUid ); - if ( !userService.canAddOrUpdateUser( IdentifiableObjectUtils.getUids( parsed.getGroups() ), currentUser ) ) + if ( !userService.canAddOrUpdateUser( IdentifiableObjectUtils.getUids( parsed.getGroups() ), currentUser ) + || !currentUser.getUserCredentials().canModifyUser( users.get( 0 ).getUserCredentials() ) ) { throw new WebMessageException( WebMessageUtils.conflict( "You must have permissions to create user, or ability to manage at least one user group for the user." ) ); } @@ -475,7 +476,8 @@ public void putJsonObject( @PathVariable( "uid" ) String pvUid, HttpServletReque User parsed = renderService.fromJson( request.getInputStream(), getEntityClass() ); parsed.setUid( pvUid ); - if ( !userService.canAddOrUpdateUser( IdentifiableObjectUtils.getUids( parsed.getGroups() ), currentUser ) ) + if ( !userService.canAddOrUpdateUser( IdentifiableObjectUtils.getUids( parsed.getGroups() ), currentUser ) + || !currentUser.getUserCredentials().canModifyUser( users.get( 0 ).getUserCredentials() ) ) { throw new WebMessageException( WebMessageUtils.conflict( "You must have permissions to create user, or ability to manage at least one user group for the user." ) ); } @@ -497,6 +499,44 @@ public void putJsonObject( @PathVariable( "uid" ) String pvUid, HttpServletReque renderService.toJson( response.getOutputStream(), importReport ); } + // ------------------------------------------------------------------------- + // PATCH + // ------------------------------------------------------------------------- + + @Override + protected void prePatchEntity( User entity, User newEntity ) throws Exception + { + User currentUser = currentUserService.getCurrentUser(); + + if ( !userService.canAddOrUpdateUser( IdentifiableObjectUtils.getUids( entity.getGroups() ), currentUser ) + || !userService.canAddOrUpdateUser( IdentifiableObjectUtils.getUids( newEntity.getGroups() ), currentUser ) + || !currentUser.getUserCredentials().canModifyUser( entity.getUserCredentials() ) ) + { + throw new WebMessageException( WebMessageUtils.conflict( "You must have permissions to create user, or ability to manage at least one user group for the user." ) ); + } + } + + // ------------------------------------------------------------------------- + // DELETE + // ------------------------------------------------------------------------- + + @Override + protected void preDeleteEntity( User entity ) throws Exception + { + User currentUser = currentUserService.getCurrentUser(); + + if ( !userService.canAddOrUpdateUser( IdentifiableObjectUtils.getUids( entity.getGroups() ), currentUser ) + || !currentUser.getUserCredentials().canModifyUser( entity.getUserCredentials() ) ) + { + throw new WebMessageException( WebMessageUtils.conflict( "You must have permissions to create user, or ability to manage at least one user group for the user." ) ); + } + + if ( userService.isLastSuperUser( entity.getUserCredentials() ) ) + { + throw new WebMessageException( WebMessageUtils.conflict( "Can not remove the last super user." ) ); + } + } + // ------------------------------------------------------------------------- // Supportive methods // ------------------------------------------------------------------------- diff --git a/dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-user/src/main/java/org/hisp/dhis/user/action/DisableUserAction.java b/dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-user/src/main/java/org/hisp/dhis/user/action/DisableUserAction.java index ebd6e329..ab5c5fb4 100644 --- a/dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-user/src/main/java/org/hisp/dhis/user/action/DisableUserAction.java +++ b/dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-user/src/main/java/org/hisp/dhis/user/action/DisableUserAction.java @@ -28,6 +28,7 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +import org.hisp.dhis.common.IdentifiableObjectUtils; import org.hisp.dhis.user.CurrentUserService; import org.hisp.dhis.user.User; import org.hisp.dhis.user.UserCredentials; @@ -78,8 +79,9 @@ public String execute() { return ERROR; } - - if ( !currentUser.getUserCredentials().canModifyUser( credentials ) ) + + if ( !userService.canAddOrUpdateUser( IdentifiableObjectUtils.getUids( credentials.getUser().getGroups() ) ) + || !currentUser.getUserCredentials().canModifyUser( credentials ) ) { return ERROR; } diff --git a/dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-user/src/main/java/org/hisp/dhis/user/action/RemoveUserAction.java b/dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-user/src/main/java/org/hisp/dhis/user/action/RemoveUserAction.java index c5cf2214..4e273953 100644 --- a/dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-user/src/main/java/org/hisp/dhis/user/action/RemoveUserAction.java +++ b/dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-user/src/main/java/org/hisp/dhis/user/action/RemoveUserAction.java @@ -28,6 +28,7 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +import org.hisp.dhis.common.IdentifiableObjectUtils; import org.hisp.dhis.i18n.I18n; import org.hisp.dhis.user.CurrentUserService; import org.hisp.dhis.user.User; @@ -103,16 +104,17 @@ public String execute() { return ERROR; } - - if ( !currentUser.getUserCredentials().canModifyUser( user.getUserCredentials() ) ) + + UserCredentials userCredentials = user.getUserCredentials(); + + if ( !userService.canAddOrUpdateUser( IdentifiableObjectUtils.getUids( user.getGroups() ) ) + || !currentUser.getUserCredentials().canModifyUser( userCredentials ) ) { return ERROR; } boolean isCurrentUser = currentUser.equals( user ); - UserCredentials userCredentials = user.getUserCredentials(); - if ( userService.isLastSuperUser( userCredentials ) ) { message = i18n.getString( "can_not_remove_last_super_user" ); diff --git a/dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-user/src/main/java/org/hisp/dhis/user/action/SetupTreeAction.java b/dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-user/src/main/java/org/hisp/dhis/user/action/SetupTreeAction.java index e32c5d04..99b108dc 100644 --- a/dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-user/src/main/java/org/hisp/dhis/user/action/SetupTreeAction.java +++ b/dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-user/src/main/java/org/hisp/dhis/user/action/SetupTreeAction.java @@ -40,6 +40,7 @@ import org.hisp.dhis.ouwt.manager.OrganisationUnitSelectionManager; import org.hisp.dhis.setting.SystemSettingManager; import org.hisp.dhis.system.util.AttributeUtils; +import org.hisp.dhis.user.CurrentUserService; import org.hisp.dhis.user.User; import org.hisp.dhis.user.UserAuthorityGroup; import org.hisp.dhis.user.UserCredentials; @@ -114,6 +115,9 @@ public void setLocaleManager( LocaleManager localeManager ) @Autowired private SystemSettingManager systemSettingManager; + @Autowired + private CurrentUserService currentUserService; + // ------------------------------------------------------------------------- // Input & Output // ------------------------------------------------------------------------- @@ -219,9 +223,12 @@ public String execute() { if ( id != null ) { + User currentUser = currentUserService.getCurrentUser(); + user = userService.getUser( id ); - if ( !userService.canAddOrUpdateUser( IdentifiableObjectUtils.getUids( user.getGroups() ) ) ) + if ( user == null || !userService.canAddOrUpdateUser( IdentifiableObjectUtils.getUids( user.getGroups() ) ) + || !currentUser.getUserCredentials().canModifyUser( user.getUserCredentials() ) ) { throw new AccessDeniedException( "You cannot edit this user" ); } diff --git a/dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-user/src/main/java/org/hisp/dhis/user/action/UpdateUserAction.java b/dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-user/src/main/java/org/hisp/dhis/user/action/UpdateUserAction.java index 2a0cf4b5..7ebaf74a 100644 --- a/dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-user/src/main/java/org/hisp/dhis/user/action/UpdateUserAction.java +++ b/dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-user/src/main/java/org/hisp/dhis/user/action/UpdateUserAction.java @@ -238,25 +238,26 @@ public void setOuwtSelected( String ouwtSelected ) public String execute() throws Exception { - if ( !userService.canAddOrUpdateUser( ugSelected ) ) + User currentUser = currentUserService.getCurrentUser(); + + User user = userService.getUser( id ); + + if ( user == null || !userService.canAddOrUpdateUser( ugSelected ) + || !currentUser.getUserCredentials().canModifyUser( user.getUserCredentials() ) ) { throw new AccessDeniedException( "You cannot edit this user" ); } - - User currentUser = currentUserService.getCurrentUser(); // --------------------------------------------------------------------- // User credentials and user // --------------------------------------------------------------------- - User user = userService.getUser( id ); user.setSurname( StringUtils.trimToNull( surname ) ); user.setFirstName( StringUtils.trimToNull( firstName ) ); user.setEmail( StringUtils.trimToNull( email ) ); user.setPhoneNumber( StringUtils.trimToNull( phoneNumber ) ); UserCredentials userCredentials = user.getUserCredentials(); - userCredentials.setExternalAuth( externalAuth ); userCredentials.setOpenId( StringUtils.trimToNull( openId ) ); userCredentials.setLdapId( StringUtils.trimToNull( ldapId ) ); From f6decfba128bace49d0885ebf8397b637f8b9980 Mon Sep 17 00:00:00 2001 From: Morten Olav Hansen Date: Mon, 24 Jul 2017 11:22:47 +0700 Subject: [PATCH 05/17] Don't set default category for DSE import (#1032) * test for null category when importing DSE * check for DSE in default category connection --- .../dhis/preheat/DefaultPreheatService.java | 2 +- .../objectbundle/ObjectBundleServiceTest.java | 28 +++++++++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/preheat/DefaultPreheatService.java b/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/preheat/DefaultPreheatService.java index 7dbf5401..a11beecf 100644 --- a/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/preheat/DefaultPreheatService.java +++ b/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/preheat/DefaultPreheatService.java @@ -748,7 +748,7 @@ public void connectReferences( Object object, Preheat preheat, PreheatIdentifier IdentifiableObject refObject = ReflectionUtils.invokeMethod( object, p.getGetterMethod() ); IdentifiableObject ref = getPersistedObject( preheat, identifier, refObject ); - if ( !DataSetElement.class.isInstance( p.getKlass() ) + if ( !DataSetElement.class.isInstance( object ) && (Preheat.isDefaultClass( p.getKlass() ) && (ref == null || refObject == null || "default".equals( refObject.getName() ))) ) { ref = defaults.get( p.getKlass() ); diff --git a/dhis-2/dhis-services/dhis-service-dxf2/src/test/java/org/hisp/dhis/dxf2/metadata/objectbundle/ObjectBundleServiceTest.java b/dhis-2/dhis-services/dhis-service-dxf2/src/test/java/org/hisp/dhis/dxf2/metadata/objectbundle/ObjectBundleServiceTest.java index a3f6783d..97ada9a9 100644 --- a/dhis-2/dhis-services/dhis-service-dxf2/src/test/java/org/hisp/dhis/dxf2/metadata/objectbundle/ObjectBundleServiceTest.java +++ b/dhis-2/dhis-services/dhis-service-dxf2/src/test/java/org/hisp/dhis/dxf2/metadata/objectbundle/ObjectBundleServiceTest.java @@ -975,6 +975,34 @@ public void testCreateDataSetWithCompulsoryDataElements() throws IOException assertEquals( 1, dataSet.getCompulsoryDataElementOperands().size() ); } + @Test + public void testCreateDataSetNoDSEDefaults() throws IOException + { + Map, List> metadata = renderService.fromMetadata( + new ClassPathResource( "dxf2/dataset_with_compulsory.json" ).getInputStream(), RenderFormat.JSON ); + + ObjectBundleParams params = new ObjectBundleParams(); + params.setObjectBundleMode( ObjectBundleMode.COMMIT ); + params.setImportStrategy( ImportStrategy.CREATE ); + params.setObjects( metadata ); + + ObjectBundle bundle = objectBundleService.create( params ); + + ObjectBundleValidationReport validate = objectBundleValidationService.validate( bundle ); + assertTrue( validate.getErrorReports().isEmpty() ); + + objectBundleService.commit( bundle ); + + List dataSets = manager.getAll( DataSet.class ); + assertEquals( 1, dataSets.size() ); + + DataSet dataSet = dataSets.get( 0 ); + assertEquals( dataSet.getDataSetElements().size(), 1 ); + DataSetElement dataSetElement = dataSet.getDataSetElements().iterator().next(); + + assertNull( dataSetElement.getCategoryCombo() ); + } + @Test public void testCreateMetadataWithIndicator() throws IOException { From 6c978343313e13fe050596a2b01cfd7634e07a55 Mon Sep 17 00:00:00 2001 From: Bekkalizer Date: Thu, 27 Jul 2017 10:54:49 +0200 Subject: [PATCH 06/17] Date format fix --- .../javascripts/dhis2/dhis2.angular.services.js | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/dhis-2/dhis-web/dhis-web-commons-resources/src/main/webapp/dhis-web-commons/javascripts/dhis2/dhis2.angular.services.js b/dhis-2/dhis-web/dhis-web-commons-resources/src/main/webapp/dhis-web-commons/javascripts/dhis2/dhis2.angular.services.js index dca18147..6ff7b832 100644 --- a/dhis-2/dhis-web/dhis-web-commons-resources/src/main/webapp/dhis-web-commons/javascripts/dhis2/dhis2.angular.services.js +++ b/dhis-2/dhis-web/dhis-web-commons-resources/src/main/webapp/dhis-web-commons/javascripts/dhis2/dhis2.angular.services.js @@ -1784,8 +1784,8 @@ var d2Services = angular.module('d2Services', ['ngResource']) else if(dhisFunction.name === "d2:daysBetween") { var firstdate = $filter('trimquotes')(parameters[0]); var seconddate = $filter('trimquotes')(parameters[1]); - firstdate = moment(firstdate); - seconddate = moment(seconddate); + firstdate = moment(firstdate, CalendarService.getSetting().momentFormat); + seconddate = moment(seconddate, CalendarService.getSetting().momentFormat); //Replace the end evaluation of the dhis function: expression = expression.replace(callToThisFunction, seconddate.diff(firstdate,'days')); expressionUpdated = true; @@ -1793,8 +1793,8 @@ var d2Services = angular.module('d2Services', ['ngResource']) else if(dhisFunction.name === "d2:weeksBetween") { var firstdate = $filter('trimquotes')(parameters[0]); var seconddate = $filter('trimquotes')(parameters[1]); - firstdate = moment(firstdate); - seconddate = moment(seconddate); + firstdate = moment(firstdate, CalendarService.getSetting().momentFormat); + seconddate = moment(seconddate, CalendarService.getSetting().momentFormat); //Replace the end evaluation of the dhis function: expression = expression.replace(callToThisFunction, seconddate.diff(firstdate,'weeks')); expressionUpdated = true; @@ -1802,8 +1802,8 @@ var d2Services = angular.module('d2Services', ['ngResource']) else if(dhisFunction.name === "d2:monthsBetween") { var firstdate = $filter('trimquotes')(parameters[0]); var seconddate = $filter('trimquotes')(parameters[1]); - firstdate = moment(firstdate); - seconddate = moment(seconddate); + firstdate = moment(firstdate, CalendarService.getSetting().momentFormat); + seconddate = moment(seconddate, CalendarService.getSetting().momentFormat); //Replace the end evaluation of the dhis function: expression = expression.replace(callToThisFunction, seconddate.diff(firstdate,'months')); expressionUpdated = true; @@ -1811,8 +1811,8 @@ var d2Services = angular.module('d2Services', ['ngResource']) else if(dhisFunction.name === "d2:yearsBetween") { var firstdate = $filter('trimquotes')(parameters[0]); var seconddate = $filter('trimquotes')(parameters[1]); - firstdate = moment(firstdate); - seconddate = moment(seconddate); + firstdate = moment(firstdate, CalendarService.getSetting().momentFormat); + seconddate = moment(seconddate, CalendarService.getSetting().momentFormat); //Replace the end evaluation of the dhis function: expression = expression.replace(callToThisFunction, seconddate.diff(firstdate,'years')); expressionUpdated = true; From 32c67a58b3e31afdf4a86640c43f27988cdece93 Mon Sep 17 00:00:00 2001 From: vietnguyen Date: Mon, 31 Jul 2017 14:13:50 +0700 Subject: [PATCH 07/17] Fix bug multi select when saving UserGroup. (#1055) --- .../main/webapp/dhis-web-maintenance-user/addUserGroupForm.vm | 4 ++-- .../webapp/dhis-web-maintenance-user/updateUserGroupForm.vm | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-user/src/main/webapp/dhis-web-maintenance-user/addUserGroupForm.vm b/dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-user/src/main/webapp/dhis-web-maintenance-user/addUserGroupForm.vm index dc377859..1b09805d 100644 --- a/dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-user/src/main/webapp/dhis-web-maintenance-user/addUserGroupForm.vm +++ b/dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-user/src/main/webapp/dhis-web-maintenance-user/addUserGroupForm.vm @@ -4,8 +4,8 @@ form.submit(); }, { 'beforeValidateHandler': function() { - $('#usersSelected').find('option').attr('selected', 'selected'); - $('#userGroupsSelected').find('option').attr('selected', 'selected'); + $('#usersSelected').find('option').prop('selected', true); + $('#userGroupsSelected').find('option').prop('selected', true); #tblDynamicAttributesJavascript() }, 'rules': getValidationRules('userGroup') diff --git a/dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-user/src/main/webapp/dhis-web-maintenance-user/updateUserGroupForm.vm b/dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-user/src/main/webapp/dhis-web-maintenance-user/updateUserGroupForm.vm index bc116459..d1de1371 100644 --- a/dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-user/src/main/webapp/dhis-web-maintenance-user/updateUserGroupForm.vm +++ b/dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-user/src/main/webapp/dhis-web-maintenance-user/updateUserGroupForm.vm @@ -4,8 +4,8 @@ form.submit(); }, { 'beforeValidateHandler': function() { - $('#usersSelected').find('option').attr('selected', 'selected'); - $('#userGroupsSelected').find('option').attr('selected', 'selected'); + $('#usersSelected').find('option').prop('selected', true); + $('#userGroupsSelected').find('option').prop('selected', true); #tblDynamicAttributesJavascript() }, 'rules': getValidationRules('userGroup') From 47dcc06d28432c3e806f417d86856f83b4d07c35 Mon Sep 17 00:00:00 2001 From: vietnguyen Date: Sat, 5 Aug 2017 18:17:21 +0700 Subject: [PATCH 08/17] Fix jquery 3 issues (#1060) --- .../dhis-web-commons/javascripts/dhis2/dhis2.selected.js | 4 ++-- .../javascripts/jQuery/jquery.dhisAjaxSelect.js | 2 +- .../javascripts/jQuery/jquery.dhisMessagesMenu.js | 4 ++-- .../javascripts/jQuery/jquery.dhisPaging.js | 2 +- .../src/main/webapp/dhis-web-commons/javascripts/lists.js | 2 +- .../dhis-web-commons-resources/src/main/webapp/macros.vm | 2 +- .../webapp/dhis-web-maintenance-program/addProgramForm.vm | 6 +++--- .../dhis-web-maintenance-program/addProgramStageForm.vm | 8 ++++---- .../javascript/addAttributeGroupForm.js | 2 +- .../javascript/addProgramIndicatorGroupForm.js | 2 +- .../dhis-web-maintenance-program/javascript/attribute.js | 8 ++++---- .../javascript/updateAttributeGroupForm.js | 2 +- .../javascript/updateProgramIndicatorGroupForm.js | 2 +- .../javascript/viewProgramEntryForm.js | 2 +- .../dhis-web-maintenance-program/updateProgramForm.vm | 6 +++--- .../updateProgramStageForm.vm | 8 ++++---- .../main/webapp/dhis-web-maintenance-user/addUserForm.vm | 6 +++--- .../webapp/dhis-web-maintenance-user/updateUserForm.vm | 6 +++--- .../webapp/WEB-INF/dhis-web-mobile-velocity/data-entry.vm | 2 +- .../src/main/webapp/dhis-web-sms/javascript/patient.js | 2 +- 20 files changed, 39 insertions(+), 39 deletions(-) diff --git a/dhis-2/dhis-web/dhis-web-commons-resources/src/main/webapp/dhis-web-commons/javascripts/dhis2/dhis2.selected.js b/dhis-2/dhis-web/dhis-web-commons-resources/src/main/webapp/dhis-web-commons/javascripts/dhis2/dhis2.selected.js index 34184fad..b134a56c 100644 --- a/dhis-2/dhis-web/dhis-web-commons-resources/src/main/webapp/dhis-web-commons/javascripts/dhis2/dhis2.selected.js +++ b/dhis-2/dhis-web/dhis-web-commons-resources/src/main/webapp/dhis-web-commons/javascripts/dhis2/dhis2.selected.js @@ -66,13 +66,13 @@ context.source.on('move-all', function() { context.defaultLoader(context).then(function() { - context.source.find('option').attr('selected', 'selected').trigger('dblclick'); + context.source.find('option').prop("selected", true).trigger('dblclick'); context.page = undefined; }); }); context.target.on('move-all', function() { - context.target.find('option').attr('selected', 'selected').trigger('dblclick'); + context.target.find('option').prop("selected", true).trigger('dblclick'); }); if( context.search instanceof $ ) { diff --git a/dhis-2/dhis-web/dhis-web-commons-resources/src/main/webapp/dhis-web-commons/javascripts/jQuery/jquery.dhisAjaxSelect.js b/dhis-2/dhis-web/dhis-web-commons-resources/src/main/webapp/dhis-web-commons/javascripts/jQuery/jquery.dhisAjaxSelect.js index 5f8cdf51..a360c733 100644 --- a/dhis-2/dhis-web/dhis-web-commons-resources/src/main/webapp/dhis-web-commons/javascripts/jQuery/jquery.dhisAjaxSelect.js +++ b/dhis-2/dhis-web/dhis-web-commons-resources/src/main/webapp/dhis-web-commons/javascripts/jQuery/jquery.dhisAjaxSelect.js @@ -44,7 +44,7 @@ function dhisAjaxSelect_moveAllSelected(sourceId) function dhisAjaxSelect_moveAll(sourceId) { var jqSource = $("#" + sourceId); - jqSource.find("option").attr("selected", "selected"); + jqSource.find("option").prop("selected", true) jqSource.dblclick(); } diff --git a/dhis-2/dhis-web/dhis-web-commons-resources/src/main/webapp/dhis-web-commons/javascripts/jQuery/jquery.dhisMessagesMenu.js b/dhis-2/dhis-web/dhis-web-commons-resources/src/main/webapp/dhis-web-commons/javascripts/jQuery/jquery.dhisMessagesMenu.js index 0bf4382f..922579ab 100644 --- a/dhis-2/dhis-web/dhis-web-commons-resources/src/main/webapp/dhis-web-commons/javascripts/jQuery/jquery.dhisMessagesMenu.js +++ b/dhis-2/dhis-web/dhis-web-commons-resources/src/main/webapp/dhis-web-commons/javascripts/jQuery/jquery.dhisMessagesMenu.js @@ -177,7 +177,7 @@ $checkbox.click(function (event) { if (this.checked) { - $slaveCheckboxes.attr("checked", "checked").trigger("change"); + $slaveCheckboxes.prop("checked", true).trigger("change"); } else { $slaveCheckboxes.removeAttr("checked").trigger("change"); } @@ -197,7 +197,7 @@ } else { $checkbox.prop("indeterminate", false); - $checkbox.attr("checked", "checked"); + $checkbox.prop("checked", true); } }); diff --git a/dhis-2/dhis-web/dhis-web-commons-resources/src/main/webapp/dhis-web-commons/javascripts/jQuery/jquery.dhisPaging.js b/dhis-2/dhis-web/dhis-web-commons-resources/src/main/webapp/dhis-web-commons/javascripts/jQuery/jquery.dhisPaging.js index 05f93697..93096507 100644 --- a/dhis-2/dhis-web/dhis-web-commons-resources/src/main/webapp/dhis-web-commons/javascripts/jQuery/jquery.dhisPaging.js +++ b/dhis-2/dhis-web/dhis-web-commons-resources/src/main/webapp/dhis-web-commons/javascripts/jQuery/jquery.dhisPaging.js @@ -51,7 +51,7 @@ function dhisPaging_moveAllSelected(sourceId) function dhisPaging_moveAll(sourceId) { var jqSource = jQuery("#" + sourceId); - jqSource.find("option").attr("selected", "selected"); + jqSource.find("option").prop("selected", true) jqSource.dblclick(); } diff --git a/dhis-2/dhis-web/dhis-web-commons-resources/src/main/webapp/dhis-web-commons/javascripts/lists.js b/dhis-2/dhis-web/dhis-web-commons-resources/src/main/webapp/dhis-web-commons/javascripts/lists.js index 35736962..a1837bea 100644 --- a/dhis-2/dhis-web/dhis-web-commons-resources/src/main/webapp/dhis-web-commons/javascripts/lists.js +++ b/dhis-2/dhis-web/dhis-web-commons-resources/src/main/webapp/dhis-web-commons/javascripts/lists.js @@ -2,7 +2,7 @@ function addValue( theSel, theText, theValue ) { var newOpt = new Option( theText, theValue ); var selLength = theSel.length; - jQuery(newOpt).attr('selected', 'selected'); + jQuery(newOpt).prop("selected", true) theSel.options[ selLength ] = newOpt; } diff --git a/dhis-2/dhis-web/dhis-web-commons-resources/src/main/webapp/macros.vm b/dhis-2/dhis-web/dhis-web-commons-resources/src/main/webapp/macros.vm index 013b9b79..721b80c7 100644 --- a/dhis-2/dhis-web/dhis-web-commons-resources/src/main/webapp/macros.vm +++ b/dhis-2/dhis-web/dhis-web-commons-resources/src/main/webapp/macros.vm @@ -338,7 +338,7 @@ jQuery.each(attributes, function(i, item) { jQuery("" ); var displayed = jQuery( item ).find( "input[name='displayed']:first"); - var checked = displayed.attr('checked') ? true : false; + var checked = displayed.prop('checked') ? true : false; personDisplayNames.append( "" ); if( checked ){ isDisplayed = true @@ -38,12 +38,12 @@ // mandatory var mandatory = jQuery( item ).find( "input[name='mandatory']:first"); - checked = mandatory.attr('checked') ? true : false; + checked = mandatory.prop('checked') ? true : false; mandatorySelector.append( "" ); // allowFutureDate var allowFutureDate = jQuery( item ).find( "input[name='allowFutureDate']:first"); - checked = allowFutureDate.attr('checked') ? true : false; + checked = allowFutureDate.prop('checked') ? true : false; allowFutureDateSelector.append( "" ); }); if( jQuery("#selectedList").find("tr").length > 0 && isDisplayed ){ diff --git a/dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-program/src/main/webapp/dhis-web-maintenance-program/addProgramStageForm.vm b/dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-program/src/main/webapp/dhis-web-maintenance-program/addProgramStageForm.vm index b4aabc1a..52ce30d7 100644 --- a/dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-program/src/main/webapp/dhis-web-maintenance-program/addProgramStageForm.vm +++ b/dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-program/src/main/webapp/dhis-web-maintenance-program/addProgramStageForm.vm @@ -26,19 +26,19 @@ selectedDataElementsValidator.append(""); var compulsory = jQuery(item).find("input[name='compulsory']:first"); - var checked = compulsory.attr('checked') ? true : false; + var checked = compulsory.prop('checked') ? true : false; compulsories.append(""); var allowProvided = jQuery(item).find("input[name='allowProvided']:first"); - checked = allowProvided.attr('checked') ? true : false; + checked = allowProvided.prop('checked') ? true : false; allowProvidedElsewhere.append(""); var displayInReport = jQuery(item).find("input[name='displayInReport']:first"); - checked = displayInReport.attr('checked') ? true : false; + checked = displayInReport.prop('checked') ? true : false; displayInReports.append(""); }); }, diff --git a/dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-program/src/main/webapp/dhis-web-maintenance-program/javascript/addAttributeGroupForm.js b/dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-program/src/main/webapp/dhis-web-maintenance-program/javascript/addAttributeGroupForm.js index af493411..a052a081 100644 --- a/dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-program/src/main/webapp/dhis-web-maintenance-program/javascript/addAttributeGroupForm.js +++ b/dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-program/src/main/webapp/dhis-web-maintenance-program/javascript/addAttributeGroupForm.js @@ -6,7 +6,7 @@ jQuery(document).ready(function() { form.submit(); }, { 'beforeValidateHandler': function() { - $("#teaSelected").find("option").attr("selected", "selected"); + $("#teaSelected").find("option").prop("selected", true) if( jQuery("#teaSelected option").length > 0 ) { setFieldValue('attributeList', 'true'); } diff --git a/dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-program/src/main/webapp/dhis-web-maintenance-program/javascript/addProgramIndicatorGroupForm.js b/dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-program/src/main/webapp/dhis-web-maintenance-program/javascript/addProgramIndicatorGroupForm.js index 78bc5fe0..0089e22e 100644 --- a/dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-program/src/main/webapp/dhis-web-maintenance-program/javascript/addProgramIndicatorGroupForm.js +++ b/dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-program/src/main/webapp/dhis-web-maintenance-program/javascript/addProgramIndicatorGroupForm.js @@ -6,7 +6,7 @@ jQuery(document).ready(function() { form.submit(); }, { 'beforeValidateHandler': function() { - $("#piSelected").find("option").attr("selected", "selected"); + $("#piSelected").find("option").prop("selected", true) if( jQuery("#piSelected option").length > 0 ) { setFieldValue('programIndicatorList', 'true'); } diff --git a/dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-program/src/main/webapp/dhis-web-maintenance-program/javascript/attribute.js b/dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-program/src/main/webapp/dhis-web-maintenance-program/javascript/attribute.js index d57d5b2a..58d5d495 100644 --- a/dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-program/src/main/webapp/dhis-web-maintenance-program/javascript/attribute.js +++ b/dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-program/src/main/webapp/dhis-web-maintenance-program/javascript/attribute.js @@ -119,7 +119,7 @@ function optionSetChanged() { } function uniqueOnChange() { - if( $('#unique').attr('checked') == "checked" ) { + if( $('#unique').prop('checked') == "checked" ) { jQuery('[name=uniqueTR]').show(); jQuery('#valueType [value=BOOLEAN]').hide(); jQuery('#valueType [value=TRUE_ONLY]').hide(); @@ -150,8 +150,8 @@ function uniqueOnChange() { } function generatedOnChange() { - if( $('#generated').attr('checked') == "checked" && - $('#unique').attr('checked') == "checked" ) { + if( $('#generated').prop('checked') == "checked" && + $('#unique').prop('checked') == "checked" ) { jQuery('[name=generatedPatternTR]').show(); } else { @@ -160,7 +160,7 @@ function generatedOnChange() { } function applyConfidentialEffect() { - if( $('#confidential').attr('checked') == "checked" ) { + if( $('#confidential').prop('checked') == "checked" ) { $('#searchScope').find('option[value="NOT_SEARCHABLE"]').prop('selected', true); $('#searchScope').prop('disabled', true); } diff --git a/dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-program/src/main/webapp/dhis-web-maintenance-program/javascript/updateAttributeGroupForm.js b/dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-program/src/main/webapp/dhis-web-maintenance-program/javascript/updateAttributeGroupForm.js index 2c098c15..73d21f9a 100644 --- a/dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-program/src/main/webapp/dhis-web-maintenance-program/javascript/updateAttributeGroupForm.js +++ b/dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-program/src/main/webapp/dhis-web-maintenance-program/javascript/updateAttributeGroupForm.js @@ -5,7 +5,7 @@ jQuery(document).ready(function() { form.submit(); }, { 'beforeValidateHandler': function() { - $("#teaSelected").find("option").attr("selected", "selected"); + $("#teaSelected").find("option").prop("selected", true) if( jQuery("#teaSelected option").length > 0 ) { setFieldValue('attributeList', 'true'); } diff --git a/dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-program/src/main/webapp/dhis-web-maintenance-program/javascript/updateProgramIndicatorGroupForm.js b/dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-program/src/main/webapp/dhis-web-maintenance-program/javascript/updateProgramIndicatorGroupForm.js index 19f9c05d..b94d3270 100644 --- a/dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-program/src/main/webapp/dhis-web-maintenance-program/javascript/updateProgramIndicatorGroupForm.js +++ b/dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-program/src/main/webapp/dhis-web-maintenance-program/javascript/updateProgramIndicatorGroupForm.js @@ -5,7 +5,7 @@ jQuery(document).ready(function() { form.submit(); }, { 'beforeValidateHandler': function() { - $("#piSelected").find("option").attr("selected", "selected"); + $("#piSelected").find("option").prop("selected", true) if( jQuery("#piSelected option").length > 0 ) { setFieldValue('programIndicatorList', 'true'); } diff --git a/dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-program/src/main/webapp/dhis-web-maintenance-program/javascript/viewProgramEntryForm.js b/dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-program/src/main/webapp/dhis-web-maintenance-program/javascript/viewProgramEntryForm.js index 0bb78e88..a9e7c9b2 100644 --- a/dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-program/src/main/webapp/dhis-web-maintenance-program/javascript/viewProgramEntryForm.js +++ b/dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-program/src/main/webapp/dhis-web-maintenance-program/javascript/viewProgramEntryForm.js @@ -368,7 +368,7 @@ function insertElement( type ) htmlCode += " suggested='" + suggestedValue + "' "; } - var isHidden = jQuery('#hiddenField').attr('checked'); + var isHidden = jQuery('#hiddenField').prop('checked'); if(isHidden) { htmlCode += " class='hidden' "; diff --git a/dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-program/src/main/webapp/dhis-web-maintenance-program/updateProgramForm.vm b/dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-program/src/main/webapp/dhis-web-maintenance-program/updateProgramForm.vm index 2323ed12..cd2e3c26 100644 --- a/dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-program/src/main/webapp/dhis-web-maintenance-program/updateProgramForm.vm +++ b/dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-program/src/main/webapp/dhis-web-maintenance-program/updateProgramForm.vm @@ -29,7 +29,7 @@ jQuery("#selectedList").find("tr").each( function( i, item ){ selectedPropertyIds.append( "" ); var displayed = jQuery( item ).find( "input[name='displayed']:first"); - var checked = displayed.attr('checked') ? true : false; + var checked = displayed.prop('checked') ? true : false; personDisplayNames.append( "" ); if( checked ){ isDisplayed = true @@ -37,12 +37,12 @@ // mandatory var mandatory = jQuery( item ).find( "input[name='mandatory']:first"); - checked = mandatory.attr('checked') ? true : false; + checked = mandatory.prop('checked') ? true : false; mandatorySelector.append( "" ); // allowFutureDate var allowFutureDate = jQuery( item ).find( "input[name='allowFutureDate']:first"); - checked = allowFutureDate.attr('checked') ? true : false; + checked = allowFutureDate.prop('checked') ? true : false; allowFutureDateSelector.append( "" ); }); if( jQuery("#selectedList").find("tr").length > 0 && isDisplayed ){ diff --git a/dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-program/src/main/webapp/dhis-web-maintenance-program/updateProgramStageForm.vm b/dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-program/src/main/webapp/dhis-web-maintenance-program/updateProgramStageForm.vm index 3dc7a276..3c6e5e80 100644 --- a/dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-program/src/main/webapp/dhis-web-maintenance-program/updateProgramStageForm.vm +++ b/dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-program/src/main/webapp/dhis-web-maintenance-program/updateProgramStageForm.vm @@ -40,19 +40,19 @@ selectedDataElementsValidator.append( "" ); var compulsory = jQuery( item ).find( "input[name='compulsory']:first"); - var checked = compulsory.attr('checked') ? true : false; + var checked = compulsory.prop('checked') ? true : false; compulsories.append( "" ); var allowProvided = jQuery( item ).find( "input[name='allowProvided']:first"); - checked = allowProvided.attr('checked') ? true : false; + checked = allowProvided.prop('checked') ? true : false; allowProvidedElsewhere.append( "" ); var displayInReport = jQuery( item ).find( "input[name='displayInReport']:first"); - checked = displayInReport.attr('checked') ? true : false; + checked = displayInReport.prop('checked') ? true : false; displayInReports.append( "" ); }); }, diff --git a/dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-user/src/main/webapp/dhis-web-maintenance-user/addUserForm.vm b/dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-user/src/main/webapp/dhis-web-maintenance-user/addUserForm.vm index 156485b6..f812bc94 100644 --- a/dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-user/src/main/webapp/dhis-web-maintenance-user/addUserForm.vm +++ b/dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-user/src/main/webapp/dhis-web-maintenance-user/addUserForm.vm @@ -4,9 +4,9 @@ jQuery(function() { validation2('addUserForm', function( form ) { - jQuery("#urSelected").children().attr("selected", "selected"); - jQuery("#ugSelected").children().attr("selected", "selected"); - jQuery("#dcSelected").children().attr("selected", "selected"); + jQuery("#urSelected").children().prop("selected", true) + jQuery("#ugSelected").children().prop("selected", true) + jQuery("#dcSelected").children().prop("selected", true) if( $('#orgUnitTree').find('.selected').size() == 0 ) { setHeaderDelayMessage(i18n_data_capture_org_unit_required); diff --git a/dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-user/src/main/webapp/dhis-web-maintenance-user/updateUserForm.vm b/dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-user/src/main/webapp/dhis-web-maintenance-user/updateUserForm.vm index 5a04ba4e..8daf9b51 100644 --- a/dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-user/src/main/webapp/dhis-web-maintenance-user/updateUserForm.vm +++ b/dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-user/src/main/webapp/dhis-web-maintenance-user/updateUserForm.vm @@ -8,9 +8,9 @@ rules["inviteEmail"].required = false; validation2('updateUserForm', function(form) { - jQuery("#urSelected").children().attr("selected", "selected"); - jQuery("#ugSelected").children().attr("selected", "selected"); - jQuery("#dcSelected").children().attr("selected", "selected"); + jQuery("#urSelected").children().prop("selected", true) + jQuery("#ugSelected").children().prop("selected", true) + jQuery("#dcSelected").children().prop("selected", true) if( $('#orgUnitTree').find('.selected').size() == 0 ) { setHeaderDelayMessage('$encoder.jsEncode( $i18n.getString( "data_capture_organisation_unit_required_for_user" ) )'); diff --git a/dhis-2/dhis-web/dhis-web-mobile/src/main/webapp/WEB-INF/dhis-web-mobile-velocity/data-entry.vm b/dhis-2/dhis-web/dhis-web-mobile/src/main/webapp/WEB-INF/dhis-web-mobile-velocity/data-entry.vm index 3ef4213b..f8b6cff5 100644 --- a/dhis-2/dhis-web/dhis-web-mobile/src/main/webapp/WEB-INF/dhis-web-mobile-velocity/data-entry.vm +++ b/dhis-2/dhis-web/dhis-web-mobile/src/main/webapp/WEB-INF/dhis-web-mobile-velocity/data-entry.vm @@ -265,7 +265,7 @@ function saveValues( completed ) { var val = ''; if( field.attr('type') == 'checkbox' ) { - val = field.attr('checked') == 'checked' ? 'true' : 'false'; + val = field.prop('checked') == 'checked' ? 'true' : 'false'; } else { val = field.val(); } diff --git a/dhis-2/dhis-web/dhis-web-sms/src/main/webapp/dhis-web-sms/javascript/patient.js b/dhis-2/dhis-web/dhis-web-sms/src/main/webapp/dhis-web-sms/javascript/patient.js index e4e076e4..13d3f61f 100644 --- a/dhis-2/dhis-web/dhis-web-sms/src/main/webapp/dhis-web-sms/javascript/patient.js +++ b/dhis-2/dhis-web/dhis-web-sms/src/main/webapp/dhis-web-sms/javascript/patient.js @@ -304,7 +304,7 @@ function getParamsForDiv( patientDiv) if( $(this).attr('type') == 'checkbox' ) { - var checked = jQuery(this).attr('checked') ? true : false; + var checked = jQuery(this).prop('checked') ? true : false; params += elementId + "=" + checked + "&"; } else if( elementId =='dateOperator' ) From 6971aab1b868f4260d8cd7d65d04d59a0652030d Mon Sep 17 00:00:00 2001 From: lkwaerst Date: Thu, 28 Sep 2017 10:56:44 +0200 Subject: [PATCH 09/17] isAssigned flag set on import --- .../dxf2/datavalueset/DefaultDataValueSetService.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/datavalueset/DefaultDataValueSetService.java b/dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/datavalueset/DefaultDataValueSetService.java index 3bd53900..96e15089 100644 --- a/dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/datavalueset/DefaultDataValueSetService.java +++ b/dhis-2/dhis-services/dhis-service-dxf2/src/main/java/org/hisp/dhis/dxf2/datavalueset/DefaultDataValueSetService.java @@ -1166,6 +1166,15 @@ else if ( strategy.isDelete() ) if ( !dryRun ) { added = dataValueBatchHandler.addObject( internalValue ); + + if ( added && dataElement.isFileType() ) + { + FileResource fr = fileResourceService.getFileResource( internalValue.getValue() ); + + fr.setAssigned( true ); + + fileResourceService.updateFileResource( fr ); + } } if ( dryRun || added ) From 2db4ef1485c4a033f18b2c44c778e6ef8ce7fd62 Mon Sep 17 00:00:00 2001 From: Stian Sandvold Date: Wed, 4 Oct 2017 10:04:32 +0200 Subject: [PATCH 10/17] Fixed a bug where data entry app would go to offline mode when not offline (cherry picked from commit 530b92707104aa68e3bb2a61d2115e031809325f) --- .../webapi/controller/CompleteDataSetRegistrationController.java | 1 + 1 file changed, 1 insertion(+) diff --git a/dhis-2/dhis-web/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/CompleteDataSetRegistrationController.java b/dhis-2/dhis-web/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/CompleteDataSetRegistrationController.java index 1b3b47f9..6a5d27d4 100644 --- a/dhis-2/dhis-web/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/CompleteDataSetRegistrationController.java +++ b/dhis-2/dhis-web/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/CompleteDataSetRegistrationController.java @@ -192,6 +192,7 @@ private CompleteDataSetRegistrations getCompleteDataSetRegistrations( Set Date: Wed, 16 May 2018 14:23:52 +0200 Subject: [PATCH 11/17] Period fix backport to 2.25 (#1920) --- dhis-2/.gitignore | 1 + .../dhis/common/BaseAnalyticalObject.java | 3 -- .../dhis/common/IdentifiableObjectUtils.java | 8 ++-- .../java/org/hisp/dhis/i18n/I18nFormat.java | 16 ++++---- .../comparator/AscendingPeriodComparator.java | 38 +++++-------------- .../data/DefaultAnalyticsService.java | 30 ++++++++++++--- .../data/DefaultDataQueryService.java | 29 +++++++++++++- 7 files changed, 76 insertions(+), 49 deletions(-) create mode 100644 dhis-2/.gitignore diff --git a/dhis-2/.gitignore b/dhis-2/.gitignore new file mode 100644 index 00000000..b256d423 --- /dev/null +++ b/dhis-2/.gitignore @@ -0,0 +1 @@ +**/rebel.xml \ No newline at end of file diff --git a/dhis-2/dhis-api/src/main/java/org/hisp/dhis/common/BaseAnalyticalObject.java b/dhis-2/dhis-api/src/main/java/org/hisp/dhis/common/BaseAnalyticalObject.java index d7ea613d..183d8303 100644 --- a/dhis-2/dhis-api/src/main/java/org/hisp/dhis/common/BaseAnalyticalObject.java +++ b/dhis-2/dhis-api/src/main/java/org/hisp/dhis/common/BaseAnalyticalObject.java @@ -55,7 +55,6 @@ import org.hisp.dhis.period.Period; import org.hisp.dhis.period.RelativePeriodEnum; import org.hisp.dhis.period.RelativePeriods; -import org.hisp.dhis.period.comparator.AscendingPeriodComparator; import org.hisp.dhis.schema.annotation.PropertyRange; import org.hisp.dhis.trackedentity.TrackedEntityAttributeDimension; import org.hisp.dhis.trackedentity.TrackedEntityDataElementDimension; @@ -549,8 +548,6 @@ else if ( PERIOD_DIM_ID.equals( dimension ) ) } } - Collections.sort( periodList, new AscendingPeriodComparator() ); - return new BaseDimensionalObject( dimension, DimensionType.PERIOD, periodList ); } else if ( ORGUNIT_DIM_ID.equals( dimension ) ) diff --git a/dhis-2/dhis-api/src/main/java/org/hisp/dhis/common/IdentifiableObjectUtils.java b/dhis-2/dhis-api/src/main/java/org/hisp/dhis/common/IdentifiableObjectUtils.java index 5152e056..08561271 100644 --- a/dhis-2/dhis-api/src/main/java/org/hisp/dhis/common/IdentifiableObjectUtils.java +++ b/dhis-2/dhis-api/src/main/java/org/hisp/dhis/common/IdentifiableObjectUtils.java @@ -102,7 +102,7 @@ public static String join( Collection objects ) */ public static List getUids( Collection objects ) { - return objects != null ? objects.stream().map( o -> o.getUid() ).collect( Collectors.toList() ) : null; + return objects != null ? objects.stream().map( IdentifiableObject::getUid ).collect( Collectors.toList() ) : null; } /** @@ -113,7 +113,7 @@ public static List getUids( Collection */ public static List getIdentifiers( Collection objects ) { - return objects != null ? objects.stream().map( o -> o.getId() ).collect( Collectors.toList() ) : null; + return objects != null ? objects.stream().map( IdentifiableObject::getId ).collect( Collectors.toList() ) : null; } /** @@ -192,7 +192,7 @@ public static List filterNameByKey( List id T object = iterator.next(); String name = ignoreCase ? object.getDisplayName().toLowerCase() : object.getDisplayName(); - if ( name.indexOf( key ) != -1 ) + if ( name.contains( key ) ) { objects.add( object ); } @@ -244,7 +244,7 @@ public static String getLastUpdatedTag( Collectio } } - return latest != null && objects != null ? objects.size() + SEPARATOR + LONG_DATE_FORMAT.print( new DateTime( latest ) ) : null; + return latest != null ? objects.size() + SEPARATOR + LONG_DATE_FORMAT.print( new DateTime( latest ) ) : null; } /** diff --git a/dhis-2/dhis-api/src/main/java/org/hisp/dhis/i18n/I18nFormat.java b/dhis-2/dhis-api/src/main/java/org/hisp/dhis/i18n/I18nFormat.java index fb067414..3905582a 100644 --- a/dhis-2/dhis-api/src/main/java/org/hisp/dhis/i18n/I18nFormat.java +++ b/dhis-2/dhis-api/src/main/java/org/hisp/dhis/i18n/I18nFormat.java @@ -28,6 +28,12 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +import org.hisp.dhis.calendar.DateTimeUnit; +import org.hisp.dhis.period.Period; +import org.hisp.dhis.period.PeriodType; +import org.hisp.dhis.period.WeeklyPeriodType; +import org.joda.time.DateTime; + import java.text.DateFormat; import java.text.DateFormatSymbols; import java.text.DecimalFormat; @@ -36,11 +42,6 @@ import java.util.Date; import java.util.ResourceBundle; -import org.hisp.dhis.calendar.DateTimeUnit; -import org.hisp.dhis.period.Period; -import org.hisp.dhis.period.PeriodType; -import org.hisp.dhis.period.WeeklyPeriodType; - /** * @author Pham Thi Thuy * @author Nguyen Dang Quang @@ -222,9 +223,10 @@ public String formatPeriod( Period period ) String typeName = period.getPeriodType().getName(); - if ( typeName.equals( WeeklyPeriodType.NAME ) ) // Use ISO dates due to potential week confusion + if ( typeName.contains( WeeklyPeriodType.NAME ) ) // Use ISO dates due to potential week confusion { - return period.getIsoDate(); + DateTime dateTime = new DateTime( period.getStartDate() ); + return "W" + dateTime.weekOfWeekyear().getAsText() + " " + (typeName.equals( WeeklyPeriodType.NAME ) ? dateTime.year().getAsText() : dateTime.dayOfWeek().getAsShortText() + " " + dateTime.year().getAsText()); } String keyStartDate = "format." + typeName + ".startDate"; diff --git a/dhis-2/dhis-api/src/main/java/org/hisp/dhis/period/comparator/AscendingPeriodComparator.java b/dhis-2/dhis-api/src/main/java/org/hisp/dhis/period/comparator/AscendingPeriodComparator.java index 68118f61..48393dec 100644 --- a/dhis-2/dhis-api/src/main/java/org/hisp/dhis/period/comparator/AscendingPeriodComparator.java +++ b/dhis-2/dhis-api/src/main/java/org/hisp/dhis/period/comparator/AscendingPeriodComparator.java @@ -28,9 +28,10 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -import java.util.Comparator; - import org.hisp.dhis.period.Period; +import org.hisp.dhis.period.PeriodType; + +import java.util.Comparator; /** * Sorts periods ascending based on the start date, then the end date. @@ -45,31 +46,12 @@ public class AscendingPeriodComparator @Override public int compare( Period period1, Period period2 ) { - if ( period1.getStartDate() == null ) - { - return -1; - } - - if ( period2.getStartDate() == null ) - { - return 1; - } - - if ( period1.getStartDate().compareTo( period2.getStartDate() ) != 0 ) - { - return period1.getStartDate().compareTo( period2.getStartDate() ); - } - - if ( period1.getEndDate() == null ) - { - return -1; - } - - if ( period2.getEndDate() == null ) - { - return 1; - } - - return period1.getEndDate().compareTo( period2.getEndDate() ); + PeriodType a = period1.getPeriodType(); + PeriodType b = period2.getPeriodType(); + + int freqCompare = Integer.compare( a.getFrequencyOrder(), b.getFrequencyOrder() ); + int nameCompare = a.getName().compareTo( b.getName() ); + + return freqCompare == 0 ? ( nameCompare == 0 ? period1.getStartDate().compareTo(period2.getStartDate() ) : nameCompare ) : freqCompare; } } diff --git a/dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/data/DefaultAnalyticsService.java b/dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/data/DefaultAnalyticsService.java index 589a31f2..0ba32300 100644 --- a/dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/data/DefaultAnalyticsService.java +++ b/dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/data/DefaultAnalyticsService.java @@ -93,13 +93,33 @@ import java.util.function.Function; import static org.hisp.dhis.analytics.AnalyticsTableManager.*; -import static org.hisp.dhis.analytics.DataQueryParams.*; -import static org.hisp.dhis.common.DataDimensionItemType.*; -import static org.hisp.dhis.common.DimensionalObject.*; +import static org.hisp.dhis.analytics.DataQueryParams.COMPLETENESS_DIMENSION_TYPES; +import static org.hisp.dhis.analytics.DataQueryParams.DENOMINATOR_HEADER_NAME; +import static org.hisp.dhis.analytics.DataQueryParams.DENOMINATOR_ID; +import static org.hisp.dhis.analytics.DataQueryParams.DISPLAY_NAME_DATA_X; +import static org.hisp.dhis.analytics.DataQueryParams.DX_INDEX; +import static org.hisp.dhis.analytics.DataQueryParams.FACTOR_HEADER_NAME; +import static org.hisp.dhis.analytics.DataQueryParams.FACTOR_ID; +import static org.hisp.dhis.analytics.DataQueryParams.NUMERATOR_HEADER_NAME; +import static org.hisp.dhis.analytics.DataQueryParams.NUMERATOR_ID; +import static org.hisp.dhis.analytics.DataQueryParams.VALUE_HEADER_NAME; +import static org.hisp.dhis.analytics.DataQueryParams.VALUE_ID; +import static org.hisp.dhis.common.DataDimensionItemType.PROGRAM_ATTRIBUTE; +import static org.hisp.dhis.common.DataDimensionItemType.PROGRAM_DATA_ELEMENT; +import static org.hisp.dhis.common.DataDimensionItemType.PROGRAM_INDICATOR; +import static org.hisp.dhis.common.DimensionalObject.CATEGORYOPTIONCOMBO_DIM_ID; +import static org.hisp.dhis.common.DimensionalObject.DATA_X_DIM_ID; +import static org.hisp.dhis.common.DimensionalObject.DIMENSION_SEP; +import static org.hisp.dhis.common.DimensionalObject.ORGUNIT_DIM_ID; +import static org.hisp.dhis.common.DimensionalObject.PERIOD_DIM_ID; import static org.hisp.dhis.common.DimensionalObjectUtils.asTypedList; import static org.hisp.dhis.common.DimensionalObjectUtils.getDimensionalItemIds; import static org.hisp.dhis.common.IdentifiableObjectUtils.getLocalPeriodIdentifiers; -import static org.hisp.dhis.common.ReportingRateMetric.*; +import static org.hisp.dhis.common.IdentifiableObjectUtils.getUids; +import static org.hisp.dhis.common.ReportingRateMetric.ACTUAL_REPORTS; +import static org.hisp.dhis.common.ReportingRateMetric.ACTUAL_REPORTS_ON_TIME; +import static org.hisp.dhis.common.ReportingRateMetric.EXPECTED_REPORTS; +import static org.hisp.dhis.common.ReportingRateMetric.REPORTING_RATE_ON_TIME; import static org.hisp.dhis.organisationunit.OrganisationUnit.getParentGraphMap; import static org.hisp.dhis.organisationunit.OrganisationUnit.getParentNameGraphMap; import static org.hisp.dhis.period.PeriodType.getPeriodTypeFromIsoString; @@ -718,7 +738,7 @@ private void addMetaData( DataQueryParams params, Grid grid ) Calendar calendar = PeriodType.getCalendar(); List periodUids = calendar.isIso8601() ? - getDimensionalItemIds( params.getDimensionOrFilterItems( PERIOD_DIM_ID ) ) : + getUids( params.getDimensionOrFilterItems( PERIOD_DIM_ID ) ) : getLocalPeriodIdentifiers( params.getDimensionOrFilterItems( PERIOD_DIM_ID ), calendar ); metaData.put( PERIOD_DIM_ID, periodUids ); diff --git a/dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/data/DefaultDataQueryService.java b/dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/data/DefaultDataQueryService.java index 20d35b4e..99567586 100644 --- a/dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/data/DefaultDataQueryService.java +++ b/dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/data/DefaultDataQueryService.java @@ -67,7 +67,19 @@ import org.hisp.dhis.analytics.DataQueryService; import org.hisp.dhis.analytics.OutputFormat; import org.hisp.dhis.calendar.Calendar; -import org.hisp.dhis.common.*; +import org.hisp.dhis.common.AnalyticalObject; +import org.hisp.dhis.common.BaseDimensionalObject; +import org.hisp.dhis.common.CodeGenerator; +import org.hisp.dhis.common.DimensionService; +import org.hisp.dhis.common.DimensionType; +import org.hisp.dhis.common.DimensionalItemObject; +import org.hisp.dhis.common.DimensionalObject; +import org.hisp.dhis.common.DimensionalObjectUtils; +import org.hisp.dhis.common.DisplayProperty; +import org.hisp.dhis.common.IdScheme; +import org.hisp.dhis.common.IdentifiableObjectManager; +import org.hisp.dhis.common.IdentifiableProperty; +import org.hisp.dhis.common.IllegalQueryException; import org.hisp.dhis.dataelement.DataElementCategoryOptionCombo; import org.hisp.dhis.dataelement.DataElementGroup; import org.hisp.dhis.i18n.I18nFormat; @@ -80,6 +92,8 @@ import org.hisp.dhis.period.PeriodType; import org.hisp.dhis.period.RelativePeriodEnum; import org.hisp.dhis.period.RelativePeriods; +import org.hisp.dhis.period.WeeklyPeriodType; +import org.hisp.dhis.period.comparator.AscendingPeriodComparator; import org.hisp.dhis.system.util.ReflectionUtils; import org.hisp.dhis.user.User; import org.hisp.dhis.util.ObjectUtils; @@ -326,10 +340,12 @@ else if ( PERIOD_DIM_ID.equals( dimension ) ) List periods = new ArrayList<>(); + Boolean queryContainsRelativePeriods = false; for ( String isoPeriod : items ) { if ( RelativePeriodEnum.contains( isoPeriod ) ) { + queryContainsRelativePeriods = true; RelativePeriodEnum relativePeriod = RelativePeriodEnum.valueOf( isoPeriod ); List relativePeriods = RelativePeriods.getRelativePeriodsFromEnum( relativePeriod, relativePeriodDate, format, true ); periods.addAll( relativePeriods ); @@ -352,11 +368,20 @@ else if ( PERIOD_DIM_ID.equals( dimension ) ) throw new IllegalQueryException( "Dimension pe is present in query without any valid dimension options" ); } + if ( queryContainsRelativePeriods ) + { + periods.sort( new AscendingPeriodComparator() ); + } + for ( Period period : periods ) { String name = format != null ? format.formatPeriod( period ) : null; + if ( !period.getPeriodType().getName().contains( WeeklyPeriodType.NAME ) ) + { + period.setShortName( name ); + } period.setName( name ); - period.setShortName( name ); + if ( !calendar.isIso8601() ) { From 838c38766c99c275a8a70963009eae89237c7a76 Mon Sep 17 00:00:00 2001 From: Jim Grace Date: Sun, 26 Aug 2018 05:00:55 -0400 Subject: [PATCH 12/17] Fix predictor median function DHIS2-1884 (#2237) (cherry picked from commit 19b658b75d5ee1ca6e82d7e3d55647c0316cf4a6) --- .../main/java/org/hisp/dhis/system/jep/MedianValue.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/dhis-2/dhis-support/dhis-support-system/src/main/java/org/hisp/dhis/system/jep/MedianValue.java b/dhis-2/dhis-support/dhis-support-system/src/main/java/org/hisp/dhis/system/jep/MedianValue.java index 68314a8b..62d150c9 100644 --- a/dhis-2/dhis-support/dhis-support-system/src/main/java/org/hisp/dhis/system/jep/MedianValue.java +++ b/dhis-2/dhis-support/dhis-support-system/src/main/java/org/hisp/dhis/system/jep/MedianValue.java @@ -28,6 +28,7 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +import java.util.Collections; import java.util.List; import java.util.Stack; import java.lang.Object; @@ -58,14 +59,14 @@ public void run( Stack inStack ) Object param = inStack.pop(); List vals = CustomFunctions.checkVector( param ); int n = vals.size(); - // Sort it here + Collections.sort( vals ); if ( n % 2 == 0 ) { - inStack.push( new Double( (vals.get( n / 2 ) + vals.get( n / 2 + 1 )) / 2 ) ); + inStack.push( new Double( ( vals.get( n / 2 - 1 ) + vals.get( n / 2 ) ) / 2 ) ); } else { - inStack.push( new Double( vals.get( (n + 1) / 2 ) ) ); + inStack.push( new Double( vals.get( n / 2 ) ) ); } } } From 1218ced6323c697be2b823ce3cf49b5fc00a317a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lars=20Helge=20=C3=98verland?= Date: Tue, 25 Sep 2018 17:17:23 +0200 Subject: [PATCH 13/17] Config option for SQL view table protection --- .../org/hisp/dhis/sqlview/DefaultSqlViewService.java | 12 +++++++++++- .../src/main/resources/META-INF/dhis/beans.xml | 3 ++- .../hisp/dhis/external/conf/ConfigurationKey.java | 1 + .../conf/DefaultDhisConfigurationProvider.java | 7 +++++++ .../external/conf/DhisConfigurationProvider.java | 8 ++++++++ 5 files changed, 29 insertions(+), 2 deletions(-) diff --git a/dhis-2/dhis-services/dhis-service-administration/src/main/java/org/hisp/dhis/sqlview/DefaultSqlViewService.java b/dhis-2/dhis-services/dhis-service-administration/src/main/java/org/hisp/dhis/sqlview/DefaultSqlViewService.java index ca0ff710..ef9a7b86 100644 --- a/dhis-2/dhis-services/dhis-service-administration/src/main/java/org/hisp/dhis/sqlview/DefaultSqlViewService.java +++ b/dhis-2/dhis-services/dhis-service-administration/src/main/java/org/hisp/dhis/sqlview/DefaultSqlViewService.java @@ -38,6 +38,8 @@ import org.hisp.dhis.common.Grid; import org.hisp.dhis.common.IllegalQueryException; import org.hisp.dhis.commons.util.SqlHelper; +import org.hisp.dhis.external.conf.ConfigurationKey; +import org.hisp.dhis.external.conf.DhisConfigurationProvider; import org.hisp.dhis.jdbc.StatementBuilder; import org.hisp.dhis.system.grid.ListGrid; import org.springframework.transaction.annotation.Transactional; @@ -70,6 +72,13 @@ public void setStatementBuilder( StatementBuilder statementBuilder ) { this.statementBuilder = statementBuilder; } + + private DhisConfigurationProvider config; + + public void setConfig( DhisConfigurationProvider config ) + { + this.config = config; + } // ------------------------------------------------------------------------- // CRUD methods @@ -250,6 +259,7 @@ public void validateSqlView( SqlView sqlView, Map criteria, Map< final Set sqlVars = SqlViewUtils.getVariables( sqlView.getSqlQuery() ); final String sql = sqlView.getSqlQuery().replaceAll("\\r|\\n"," ").toLowerCase(); + final boolean ignoreSqlViewTableProtection = config.isDisabled( ConfigurationKey.SYSTEM_SQL_VIEW_TABLE_PROTECTION ); if ( !SELECT_PATTERN.matcher( sql ).matches() ) { @@ -296,7 +306,7 @@ public void validateSqlView( SqlView sqlView, Map criteria, Map< violation = "Criteria values are invalid: " + SqlView.getInvalidQueryValues( criteria.values() ); } - if ( sql.matches( SqlView.getProtectedTablesRegex() ) ) + if ( !ignoreSqlViewTableProtection && sql.matches( SqlView.getProtectedTablesRegex() ) ) { violation = "SQL query contains references to protected tables"; } diff --git a/dhis-2/dhis-services/dhis-service-administration/src/main/resources/META-INF/dhis/beans.xml b/dhis-2/dhis-services/dhis-service-administration/src/main/resources/META-INF/dhis/beans.xml index 0f6c2812..5d83bf94 100644 --- a/dhis-2/dhis-services/dhis-service-administration/src/main/resources/META-INF/dhis/beans.xml +++ b/dhis-2/dhis-services/dhis-service-administration/src/main/resources/META-INF/dhis/beans.xml @@ -18,7 +18,7 @@ - + @@ -60,6 +60,7 @@ + diff --git a/dhis-2/dhis-support/dhis-support-external/src/main/java/org/hisp/dhis/external/conf/ConfigurationKey.java b/dhis-2/dhis-support/dhis-support-external/src/main/java/org/hisp/dhis/external/conf/ConfigurationKey.java index a4233361..4c5a4496 100644 --- a/dhis-2/dhis-support/dhis-support-external/src/main/java/org/hisp/dhis/external/conf/ConfigurationKey.java +++ b/dhis-2/dhis-support/dhis-support-external/src/main/java/org/hisp/dhis/external/conf/ConfigurationKey.java @@ -35,6 +35,7 @@ public enum ConfigurationKey { SYSTEM_READ_ONLY_MODE( "system.read_only_mode", "off" ), SYSTEM_SESSION_TIMEOUT( "system.session.timeout", "3600" ), + SYSTEM_SQL_VIEW_TABLE_PROTECTION( "system.sql_view_table_protection", "on" ), INTERNAL_SERVICE_API( "system.internal_service_api", "off" ), ENCRYPTION_PASSWORD( "encryption.password", "" ), CONNECTION_DIALECT( "connection.dialect" ), diff --git a/dhis-2/dhis-support/dhis-support-external/src/main/java/org/hisp/dhis/external/conf/DefaultDhisConfigurationProvider.java b/dhis-2/dhis-support/dhis-support-external/src/main/java/org/hisp/dhis/external/conf/DefaultDhisConfigurationProvider.java index 008d07fb..daa8b7c0 100644 --- a/dhis-2/dhis-support/dhis-support-external/src/main/java/org/hisp/dhis/external/conf/DefaultDhisConfigurationProvider.java +++ b/dhis-2/dhis-support/dhis-support-external/src/main/java/org/hisp/dhis/external/conf/DefaultDhisConfigurationProvider.java @@ -63,6 +63,7 @@ public class DefaultDhisConfigurationProvider private static final String GOOGLE_AUTH_FILENAME = "dhis-google-auth.json"; private static final String GOOGLE_EE_SCOPE = "https://www.googleapis.com/auth/earthengine"; private static final String ENABLED_VALUE = "on"; + private static final String DISABLED_VALUE = "off"; // ------------------------------------------------------------------------- // Dependencies @@ -196,6 +197,12 @@ public boolean isEnabled( ConfigurationKey key ) return ENABLED_VALUE.equals( getProperty( key ) ); } + @Override + public boolean isDisabled( ConfigurationKey key ) + { + return DISABLED_VALUE.equals( getProperty( key ) ); + } + @Override public Optional getGoogleCredential() { diff --git a/dhis-2/dhis-support/dhis-support-external/src/main/java/org/hisp/dhis/external/conf/DhisConfigurationProvider.java b/dhis-2/dhis-support/dhis-support-external/src/main/java/org/hisp/dhis/external/conf/DhisConfigurationProvider.java index 9bc0262f..67b0d1cf 100644 --- a/dhis-2/dhis-support/dhis-support-external/src/main/java/org/hisp/dhis/external/conf/DhisConfigurationProvider.java +++ b/dhis-2/dhis-support/dhis-support-external/src/main/java/org/hisp/dhis/external/conf/DhisConfigurationProvider.java @@ -85,6 +85,14 @@ public interface DhisConfigurationProvider * @return true if the configuration key is enabled. */ boolean isEnabled( ConfigurationKey key ); + + /** + * Indicates whether a value for the given key is equal to "off". + * + * @param key the configuration key. + * @return true if the configuration key is disabled. + */ + boolean isDisabled( ConfigurationKey key ); /** * Returns a GoogleCredential, if a Google service account has been configured. From 17d427e4b6ef6ecd04415afa5f23aa71a6739503 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lars=20Helge=20=C3=98verland?= Date: Wed, 26 Sep 2018 08:03:37 +0200 Subject: [PATCH 14/17] Minor fix --- .../src/main/resources/META-INF/dhis/beans.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dhis-2/dhis-services/dhis-service-administration/src/main/resources/META-INF/dhis/beans.xml b/dhis-2/dhis-services/dhis-service-administration/src/main/resources/META-INF/dhis/beans.xml index 5d83bf94..5018211e 100644 --- a/dhis-2/dhis-services/dhis-service-administration/src/main/resources/META-INF/dhis/beans.xml +++ b/dhis-2/dhis-services/dhis-service-administration/src/main/resources/META-INF/dhis/beans.xml @@ -18,7 +18,7 @@ - + From 60cb7687ac210269689350b49a66c1343de63327 Mon Sep 17 00:00:00 2001 From: Stian Sandvold Date: Thu, 11 Oct 2018 11:31:12 +0200 Subject: [PATCH 15/17] Updated "Defaults" to use proper cache, and not cache during test (#2378) --- .../DefaultIdentifiableObjectManager.java | 29 ++++++++++++------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/common/DefaultIdentifiableObjectManager.java b/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/common/DefaultIdentifiableObjectManager.java index 7fa1b55a..e1782e8d 100644 --- a/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/common/DefaultIdentifiableObjectManager.java +++ b/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/common/DefaultIdentifiableObjectManager.java @@ -28,6 +28,9 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +import com.github.benmanes.caffeine.cache.Cache; +import com.github.benmanes.caffeine.cache.Caffeine; +import com.google.common.collect.ImmutableMap; import org.apache.commons.lang3.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -40,6 +43,7 @@ import org.hisp.dhis.dataelement.DataElementCategoryCombo; import org.hisp.dhis.dataelement.DataElementCategoryOption; import org.hisp.dhis.dataelement.DataElementCategoryOptionCombo; +import org.hisp.dhis.system.util.SystemUtils; import org.hisp.dhis.translation.ObjectTranslation; import org.hisp.dhis.user.CurrentUserService; import org.hisp.dhis.user.User; @@ -56,6 +60,7 @@ import java.util.List; import java.util.Map; import java.util.Set; +import java.util.concurrent.TimeUnit; /** * Note that it is required for nameable object stores to have concrete implementation @@ -70,7 +75,14 @@ public class DefaultIdentifiableObjectManager { private static final Log log = LogFactory.getLog( DefaultIdentifiableObjectManager.class ); - private final Map, IdentifiableObject> DEFAULTS = new HashMap<>(); + /** + * Cache for default category objects. Disabled during test phase. + */ + private static final Cache, IdentifiableObject> DEFAULT_OBJECT_CACHE = Caffeine.newBuilder() + .expireAfterAccess( 2, TimeUnit.HOURS ) + .initialCapacity( 4 ) + .maximumSize( SystemUtils.isTestRun() ? 0 : 10 ) + .build(); @Autowired private Set> identifiableObjectStores; @@ -1145,15 +1157,12 @@ public boolean isAttributeValueUnique( Class, IdentifiableObject> getDefaults() { - if ( DEFAULTS.isEmpty() ) - { - DEFAULTS.put( DataElementCategory.class, getByName( DataElementCategory.class, "default" ) ); - DEFAULTS.put( DataElementCategoryCombo.class, getByName( DataElementCategoryCombo.class, "default" ) ); - DEFAULTS.put( DataElementCategoryOption.class, getByName( DataElementCategoryOption.class, "default" ) ); - DEFAULTS.put( DataElementCategoryOptionCombo.class, getByName( DataElementCategoryOptionCombo.class, "default" ) ); - } - - return DEFAULTS; + return new ImmutableMap.Builder, IdentifiableObject>() + .put( DataElementCategory.class, DEFAULT_OBJECT_CACHE.get( DataElementCategory.class, key -> getByName( DataElementCategory.class, "default" ) ) ) + .put( DataElementCategoryCombo.class, DEFAULT_OBJECT_CACHE.get( DataElementCategoryCombo.class, key -> getByName( DataElementCategoryCombo.class, "default" ) ) ) + .put( DataElementCategoryOption.class, DEFAULT_OBJECT_CACHE.get( DataElementCategoryOption.class, key -> getByName( DataElementCategoryOption.class, "default" ) ) ) + .put( DataElementCategoryOptionCombo.class, DEFAULT_OBJECT_CACHE.get( DataElementCategoryOptionCombo.class, key -> getByName( DataElementCategoryOptionCombo.class, "default" ) ) ) + .build(); } //-------------------------------------------------------------------------- From 9dbb9e3bfe6e4c7abe29861e45e021feb5721ea6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lars=20Helge=20=C3=98verland?= Date: Wed, 17 Oct 2018 11:30:48 +0200 Subject: [PATCH 16/17] Hibernate query cache configuration update (#2411) Ensure that default cache is expired less frequently than query cache to avoid single-entity queries. (cherry picked from commit 07de315eca446866fd19ecc53a3a098433c5efd5) (cherry picked from commit aa4fce795fe1d4fb737fd83fd27a5c1746b68e51) --- .../src/main/resources/ehcache.xml | 29 +++++++++++++++---- 1 file changed, 24 insertions(+), 5 deletions(-) diff --git a/dhis-2/dhis-support/dhis-support-hibernate/src/main/resources/ehcache.xml b/dhis-2/dhis-support/dhis-support-hibernate/src/main/resources/ehcache.xml index 14c964d6..b8f52044 100644 --- a/dhis-2/dhis-support/dhis-support-hibernate/src/main/resources/ehcache.xml +++ b/dhis-2/dhis-support/dhis-support-hibernate/src/main/resources/ehcache.xml @@ -1,12 +1,31 @@ - + + + + + - + - - \ No newline at end of file + + From 15d8f564abe989ff619284b524a467d1c5d86dd9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lars=20Helge=20=C3=98verland?= Date: Fri, 9 Nov 2018 12:31:56 +0100 Subject: [PATCH 17/17] Upgraded to Struts 2.3.36, commons-fileupload 1.3.3 --- .gitignore | 1 + .../org/hisp/dhis/startup/TableAlteror.java | 36 ++++++++++--------- dhis-2/pom.xml | 4 +-- 3 files changed, 22 insertions(+), 19 deletions(-) diff --git a/.gitignore b/.gitignore index 9614c00a..8023c207 100644 --- a/.gitignore +++ b/.gitignore @@ -29,3 +29,4 @@ overlays/ dhis-2/projectFilesBackup coverage node_modules +package-lock.json diff --git a/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/startup/TableAlteror.java b/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/startup/TableAlteror.java index 5b95e7f6..821872a6 100644 --- a/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/startup/TableAlteror.java +++ b/dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/startup/TableAlteror.java @@ -59,7 +59,7 @@ public class TableAlteror @Autowired private StatementManager statementManager; - + @Autowired private StatementBuilder statementBuilder; @@ -213,10 +213,10 @@ public void execute() executeSql( "update dataset set categorycomboid = " + defaultCategoryComboId + " where categorycomboid is null" ); executeSql( "alter table dataset alter column categorycomboid set not null" ); - + executeSql( "update program set categorycomboid = " + defaultCategoryComboId + " where categorycomboid is null" ); executeSql( "alter table program alter column categorycomboid set not null" ); - + // categories_categoryoptions // set to 0 temporarily int c1 = executeSql( "UPDATE categories_categoryoptions SET sort_order=0 WHERE sort_order is NULL OR sort_order=0" ); @@ -890,9 +890,9 @@ public void execute() executeSql( "update programstage set repeatable = false where repeatable is null" ); executeSql( "alter table programstage drop column reportdatedescription" ); executeSql( "alter table programstage drop column irregular" ); - + executeSql( "update smscodes set compulsory = false where compulsory is null" ); - + executeSql( "alter table programmessage drop column storecopy" ); executeSql( "alter table programindicator drop column missingvaluereplacement" ); @@ -922,9 +922,9 @@ public void execute() executeSql( "alter table datastatisticsevent alter column eventtype type character varying" ); executeSql( "alter table orgunitlevel drop constraint orgunitlevel_name_key" ); - + executeSql( "update interpretation set likes = 0 where likes is null" ); - + executeSql( "update chart set regressiontype = 'NONE' where regression is false or regression is null" ); executeSql( "update chart set regressiontype = 'LINEAR' where regression is true" ); executeSql( "alter table chart alter column regressiontype set not null" ); @@ -941,11 +941,13 @@ public void execute() executeSql( "alter table validationrule drop column sequentialsamplecount" ); executeSql( "alter table validationrule drop column annualsamplecount" ); executeSql( "alter table validationrule drop column sequentialskipcount" ); - + + executeSql( "DELETE FROM systemsetting where name = 'keyCorsWhitelist';" ); + updateEnums(); upgradeDataValueSoftDelete(); - + initOauth2(); upgradeDataValuesWithAttributeOptionCombo(); @@ -976,13 +978,13 @@ public void execute() log.info( "Tables updated" ); } - + private void removeOutdatedTranslationProperties() { executeSql( "delete from indicatortranslations where objecttranslationid in (select objecttranslationid from objecttranslation where property in ('numeratorDescription', 'denominatorDescription'))" ); executeSql( "delete from objecttranslation where property in ('numeratorDescription', 'denominatorDescription')" ); } - + private void upgradeDataValueSoftDelete() { executeSql( "update datavalue set deleted = false where deleted is null" ); @@ -1085,8 +1087,8 @@ private void upgradeDataSetElements() { String autoIncr = statementBuilder.getAutoIncrementValue(); String uid = statementBuilder.getUid(); - - String insertSql = + + String insertSql = "insert into datasetelement(datasetelementid,uid,datasetid,dataelementid,created,lastupdated) " + "select " + autoIncr + " as datasetelementid, " + uid + " as uid, " + @@ -1095,16 +1097,16 @@ private void upgradeDataSetElements() "now() as created, " + "now() as lastupdated " + "from datasetmembers dsm; " + - "drop table datasetmembers; "; - + "drop table datasetmembers; "; + executeSql( insertSql ); - + executeSql( "alter table datasetelement alter column uid set not null" ); executeSql( "alter table datasetelement alter column created set not null" ); executeSql( "alter table datasetelement alter column lastupdated set not null" ); executeSql( "alter table datasetelement alter column datasetid drop not null" ); } - + private void upgradeAggregationType( String table ) { executeSql( "update " + table + " set aggregationtype='SUM' where aggregationtype='sum'" ); diff --git a/dhis-2/pom.xml b/dhis-2/pom.xml index 474b0098..f70626b3 100644 --- a/dhis-2/pom.xml +++ b/dhis-2/pom.xml @@ -691,7 +691,7 @@ commons-fileupload commons-fileupload - 1.3.1 + 1.3.3 org.apache.commons @@ -1082,7 +1082,7 @@ 4.2.5.RELEASE 3.2.9.RELEASE 2.0.5.RELEASE - 2.3.32 + 2.3.36 5.1.0.Final 4.3.2.Final 1.9.2