=== modified file 'dhis-2/dhis-web/dhis-web-api/src/main/java/org/hisp/dhis/api/controller/DataApprovalController.java' --- dhis-2/dhis-web/dhis-web-api/src/main/java/org/hisp/dhis/api/controller/DataApprovalController.java 2014-03-30 04:37:39 +0000 +++ dhis-2/dhis-web/dhis-web-api/src/main/java/org/hisp/dhis/api/controller/DataApprovalController.java 2014-04-01 17:04:30 +0000 @@ -32,6 +32,7 @@ import java.util.Date; import java.util.HashMap; import java.util.Map; +import java.util.Set; import javax.servlet.http.HttpServletResponse; @@ -41,7 +42,7 @@ import org.hisp.dhis.api.utils.InputUtils; import org.hisp.dhis.dataapproval.*; import org.hisp.dhis.dataelement.CategoryOptionGroup; -import org.hisp.dhis.dataelement.DataElementCategoryOptionCombo; +import org.hisp.dhis.dataelement.DataElementCategoryOption; import org.hisp.dhis.dataelement.DataElementCategoryService; import org.hisp.dhis.dataset.DataSet; import org.hisp.dhis.dataset.DataSetService; @@ -89,9 +90,6 @@ private OrganisationUnitService organisationUnitService; @Autowired - private DataElementCategoryService categoryService; - - @Autowired private CurrentUserService currentUserService; @Autowired @@ -102,7 +100,7 @@ @RequestParam String ds, @RequestParam String pe, @RequestParam String ou, - @RequestParam( required = false ) String cc, + @RequestParam( required = false ) Set cog, @RequestParam( required = false ) String cp, HttpServletResponse response ) throws IOException { log.info( "getApprovalState called." ); @@ -130,15 +128,22 @@ ContextUtils.conflictResponse( response, "Illegal organisation unit identifier: " + ou ); return; } - - DataElementCategoryOptionCombo attributeOptionCombo = inputUtils.getAttributeOptionCombo( response, cc, cp ); - - if ( attributeOptionCombo == null ) - { - return; - } - - DataApprovalPermissions permissions = dataApprovalService.getDataApprovalPermissions( dataSet, period, organisationUnit, attributeOptionCombo ); + + Set categoryOptionGroups = inputUtils.getAttributeOptionGroups( response, cog ); + + if ( categoryOptionGroups != null && categoryOptionGroups.isEmpty() ) + { + return; + } + + Set categoryOptions = inputUtils.getAttributeOptions( response, cp ); + + if ( categoryOptions != null && categoryOptions.isEmpty() ) + { + return; + } + + DataApprovalPermissions permissions = dataApprovalService.getDataApprovalPermissions( dataSet, period, organisationUnit, categoryOptionGroups, categoryOptions ); Map approvalState = new HashMap(); approvalState.put( APPROVAL_STATE, permissions.getDataApprovalStatus().getDataApprovalState().toString() ); @@ -156,8 +161,7 @@ @RequestParam String ds, @RequestParam String pe, @RequestParam String ou, - @RequestParam( required = false ) String cc, - @RequestParam( required = false ) String cp, HttpServletResponse response ) + @RequestParam( required = false ) String cog, HttpServletResponse response ) { log.info( "saveApproval called." ); @@ -184,15 +188,15 @@ ContextUtils.conflictResponse( response, "Illegal organisation unit identifier: " + ou ); return; } - - DataElementCategoryOptionCombo attributeOptionCombo = inputUtils.getAttributeOptionCombo( response, cc, cp ); - - if ( attributeOptionCombo == null ) + + Set categoryOptionGroups = inputUtils.getAttributeOptionGroup( response, cog ); + + if ( categoryOptionGroups != null && categoryOptionGroups.isEmpty() ) { return; } - - DataApprovalPermissions permissions = dataApprovalService.getDataApprovalPermissions( dataSet, period, organisationUnit, attributeOptionCombo ); + + DataApprovalPermissions permissions = dataApprovalService.getDataApprovalPermissions( dataSet, period, organisationUnit, categoryOptionGroups, null ); if ( !DataApprovalState.UNAPPROVED_READY.equals( permissions.getDataApprovalStatus().getDataApprovalState() ) ) { @@ -202,16 +206,16 @@ if ( !permissions.isMayApprove() ) { - ContextUtils.conflictResponse( response, "Current user is not authorized to approve for organisation unit: " + ou ); + ContextUtils.conflictResponse( response, "Current user is not authorized to approve for " + + approvalParameters( dataSet, period, organisationUnit, categoryOptionGroups ) ); return; } User user = currentUserService.getCurrentUser(); - //TODO: FIX. We need to know what CategoryOptionGroup if any was selected, to use when constructing the data approval object. - CategoryOptionGroup attributeOptionGroup = null; + CategoryOptionGroup categoryOptionGroup = categoryOptionGroups == null ? null : (CategoryOptionGroup) categoryOptionGroups.toArray() [0]; - DataApproval approval = new DataApproval( dataSet, period, organisationUnit, attributeOptionGroup, false, new Date(), user ); + DataApproval approval = new DataApproval( dataSet, period, organisationUnit, categoryOptionGroup, false, new Date(), user ); dataApprovalService.addDataApproval( approval ); } @@ -223,8 +227,7 @@ @RequestParam String ds, @RequestParam String pe, @RequestParam String ou, - @RequestParam( required = false ) String cc, - @RequestParam( required = false ) String cp, HttpServletResponse response ) + @RequestParam( required = false ) String cog, HttpServletResponse response ) { log.info( "removeApproval called." ); @@ -251,15 +254,15 @@ ContextUtils.conflictResponse( response, "Illegal organisation unit identifier: " + ou ); return; } - - DataElementCategoryOptionCombo attributeOptionCombo = inputUtils.getAttributeOptionCombo( response, cc, cp ); - - if ( attributeOptionCombo == null ) + + Set categoryOptionGroups = inputUtils.getAttributeOptionGroup( response, cog ); + + if ( categoryOptionGroups != null && categoryOptionGroups.isEmpty() ) { return; } - DataApprovalPermissions permissions = dataApprovalService.getDataApprovalPermissions( dataSet, period, organisationUnit, attributeOptionCombo ); + DataApprovalPermissions permissions = dataApprovalService.getDataApprovalPermissions( dataSet, period, organisationUnit, categoryOptionGroups, null ); if ( !DataApprovalState.APPROVED_HERE.equals( permissions.getDataApprovalStatus().getDataApprovalState() ) ) { @@ -270,7 +273,7 @@ if ( !permissions.isMayUnapprove() ) { ContextUtils.conflictResponse( response, "Current user is not authorized to unapprove for " - + approvalParameters( dataSet, period, organisationUnit, attributeOptionCombo ) ); + + approvalParameters( dataSet, period, organisationUnit, categoryOptionGroups ) ); return; } @@ -283,8 +286,7 @@ @RequestParam String ds, @RequestParam String pe, @RequestParam String ou, - @RequestParam( required = false ) String cc, - @RequestParam( required = false ) String cp, HttpServletResponse response ) + @RequestParam( required = false ) String cog, HttpServletResponse response ) { log.info( "acceptApproval called." ); @@ -312,14 +314,14 @@ return; } - DataElementCategoryOptionCombo attributeOptionCombo = inputUtils.getAttributeOptionCombo( response, cc, cp ); + Set categoryOptionGroups = inputUtils.getAttributeOptionGroup( response, cog ); - if ( attributeOptionCombo == null ) + if ( categoryOptionGroups != null && categoryOptionGroups.isEmpty() ) { return; } - DataApprovalPermissions permissions = dataApprovalService.getDataApprovalPermissions( dataSet, period, organisationUnit, attributeOptionCombo ); + DataApprovalPermissions permissions = dataApprovalService.getDataApprovalPermissions( dataSet, period, organisationUnit, categoryOptionGroups, null ); if ( !DataApprovalState.APPROVED_HERE.equals( permissions.getDataApprovalStatus().getDataApprovalState() ) ) { @@ -330,7 +332,7 @@ if ( !permissions.isMayAccept() ) { ContextUtils.conflictResponse( response, "Current user is not authorized to accept approval for " - + approvalParameters( dataSet, period, organisationUnit, attributeOptionCombo ) ); + + approvalParameters( dataSet, period, organisationUnit, categoryOptionGroups ) ); return; } @@ -344,8 +346,7 @@ @RequestParam String ds, @RequestParam String pe, @RequestParam String ou, - @RequestParam( required = false ) String cc, - @RequestParam( required = false ) String cp, HttpServletResponse response ) + @RequestParam( required = false ) String cog, HttpServletResponse response ) { log.info( "unacceptApproval called." ); @@ -373,14 +374,14 @@ return; } - DataElementCategoryOptionCombo attributeOptionCombo = inputUtils.getAttributeOptionCombo( response, cc, cp ); + Set categoryOptionGroups = inputUtils.getAttributeOptionGroup( response, cog ); - if ( attributeOptionCombo == null ) + if ( categoryOptionGroups != null && categoryOptionGroups.isEmpty() ) { return; } - DataApprovalPermissions permissions = dataApprovalService.getDataApprovalPermissions( dataSet, period, organisationUnit, attributeOptionCombo ); + DataApprovalPermissions permissions = dataApprovalService.getDataApprovalPermissions( dataSet, period, organisationUnit, categoryOptionGroups, null ); if ( !DataApprovalState.ACCEPTED_HERE.equals( permissions.getDataApprovalStatus().getDataApprovalState() ) ) { @@ -391,7 +392,7 @@ if ( !permissions.isMayUnaccept() ) { ContextUtils.conflictResponse( response, "Current user is not authorized to unaccept approval for " - + approvalParameters( dataSet, period, organisationUnit, attributeOptionCombo ) ); + + approvalParameters( dataSet, period, organisationUnit, categoryOptionGroups ) ); return; } @@ -402,11 +403,11 @@ // Supportive methods // ------------------------------------------------------------------------- - private String approvalParameters( DataSet dataSet, Period period, OrganisationUnit organisationUnit, DataElementCategoryOptionCombo attributeOptionCombo ) + private String approvalParameters( DataSet dataSet, Period period, OrganisationUnit organisationUnit, Set categoryOptionGroups ) { return "dataSet " + dataSet.getName() + ", period " + period.getName() + ", org unit " + organisationUnit.getName() - + ", attributeOptionCombo " + ( attributeOptionCombo == null ? "null" : attributeOptionCombo.getName() ); + + ", categoryOptionGroup " + ( categoryOptionGroups == null ? "null" : ( (CategoryOptionGroup) categoryOptionGroups.toArray() [0] ).getName() ); } } === modified file 'dhis-2/dhis-web/dhis-web-api/src/main/java/org/hisp/dhis/api/utils/InputUtils.java' --- dhis-2/dhis-web/dhis-web-api/src/main/java/org/hisp/dhis/api/utils/InputUtils.java 2014-03-18 08:10:10 +0000 +++ dhis-2/dhis-web/dhis-web-api/src/main/java/org/hisp/dhis/api/utils/InputUtils.java 2014-04-01 17:04:30 +0000 @@ -34,6 +34,7 @@ import javax.servlet.http.HttpServletResponse; +import org.hisp.dhis.dataelement.CategoryOptionGroup; import org.hisp.dhis.dataelement.DataElementCategoryCombo; import org.hisp.dhis.dataelement.DataElementCategoryOption; import org.hisp.dhis.dataelement.DataElementCategoryOptionCombo; @@ -126,4 +127,95 @@ return attributeOptionCombo; } + + /** + * Validates and retrieves a single category option group. 409 conflict as + * status code along with a textual message will be set on the response in + * case of invalid input. + * + * @param response the servlet response. + * @param cog the category option group query string. + * @return the set of category option groups, null if the input was + * missing or an empty set if the input was invalid. + */ + public Set getAttributeOptionGroup( HttpServletResponse response, String cog ) + { + Set groups = new HashSet(); + + groups.add(cog); + + return getAttributeOptionGroups( response, groups ); + } + + /** + * Validates and retrieves a set of category option groups. 409 conflict as + * status code along with a textual message will be set on the response in + * case of invalid input. + * + * @param response the servlet response. + * @param cog the category option group query string set. + * @return the set of category option groups, null if the input was + * missing or an empty set if the input was invalid. + */ + public Set getAttributeOptionGroups( HttpServletResponse response, Set cog ) + { + Set groups = null; + + if ( cog != null ) + { + groups = new HashSet(); + + for ( String id : cog ) + { + CategoryOptionGroup categoryOptionGroup = categoryService.getCategoryOptionGroup( id ); + + if ( categoryOptionGroup == null ) + { + ContextUtils.conflictResponse( response, "Illegal category option group identifier: " + cog ); + return null; + } + + groups.add( categoryOptionGroup ); + } + } + + return groups; + } + + /** + * Validates and retrieves a set of category options. 409 conflict as + * status code along with a textual message will be set on the response in + * case of invalid input. + * + * @param response the servlet response. + * @param cp the category option query string. + * @return the set of category option groups, null if the input was + * missing or an empty set if the input was invalid. + */ + public Set getAttributeOptions( HttpServletResponse response, String cp ) + { + Set options = null; + + if ( cp != null ) + { + List opts = ContextUtils.getQueryParamValues( cp ); + + options = new HashSet(); + + for ( String id : opts ) + { + DataElementCategoryOption categoryOption = categoryService.getDataElementCategoryOption( id ); + + if ( categoryOption == null ) + { + ContextUtils.conflictResponse( response, "Illegal category option identifier: " + id ); + return null; + } + + options.add( categoryOption ); + } + } + + return options; + } }