------------------------------------------------------------ revno: 11508 committer: Tran Chau <tran.hispviet...@gmail.com> branch nick: dhis2 timestamp: Thu 2013-07-25 09:32:32 +0700 message: Minor fix. added: dhis-2/dhis-web/dhis-web-caseentry/src/main/webapp/dhis-web-caseentry/reportsMenuWithoutOrgunit.vm modified: dhis-2/dhis-api/src/main/java/org/hisp/dhis/program/Program.java dhis-2/dhis-services/dhis-service-patient/src/main/java/org/hisp/dhis/patient/startup/TableAlteror.java dhis-2/dhis-services/dhis-service-patient/src/main/java/org/hisp/dhis/program/hibernate/HibernateProgramStageInstanceStore.java dhis-2/dhis-services/dhis-service-patient/src/main/resources/org/hisp/dhis/program/hibernate/Program.hbm.xml dhis-2/dhis-web/dhis-web-caseentry/src/main/java/org/hisp/dhis/caseentry/action/caseentry/CompleteDataEntryAction.java dhis-2/dhis-web/dhis-web-caseentry/src/main/webapp/dhis-web-caseentry/defaultPatientForm.vm dhis-2/dhis-web/dhis-web-caseentry/src/main/webapp/dhis-web-caseentry/javascript/commons.js dhis-2/dhis-web/dhis-web-caseentry/src/main/webapp/dhis-web-caseentry/patientForm.vm dhis-2/dhis-web/dhis-web-caseentry/src/main/webapp/dhis-web-caseentry/programEnrollmentSelectForm.vm dhis-2/dhis-web/dhis-web-caseentry/src/main/webapp/dhis-web-caseentry/visitSchedule.vm dhis-2/dhis-web/dhis-web-commons-resources/src/main/webapp/dhis-web-commons/ajax/jsonProgram.vm dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-patient/src/main/java/org/hisp/dhis/patient/action/program/AddProgramAction.java dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-patient/src/main/java/org/hisp/dhis/patient/action/program/UpdateProgramAction.java dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-patient/src/main/resources/org/hisp/dhis/patient/i18n_module.properties
-- lp:dhis2 https://code.launchpad.net/~dhis2-devs-core/dhis2/trunk Your team DHIS 2 developers is subscribed to branch lp:dhis2. To unsubscribe from this branch go to https://code.launchpad.net/~dhis2-devs-core/dhis2/trunk/+edit-subscription
=== modified file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/program/Program.java' --- dhis-2/dhis-api/src/main/java/org/hisp/dhis/program/Program.java 2013-07-16 04:31:27 +0000 +++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/program/Program.java 2013-07-25 02:32:32 +0000 @@ -27,12 +27,10 @@ package org.hisp.dhis.program; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonView; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; -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 java.util.HashSet; +import java.util.List; +import java.util.Set; + import org.apache.commons.lang.StringUtils; import org.hisp.dhis.common.BaseIdentifiableObject; import org.hisp.dhis.common.DxfNamespaces; @@ -47,9 +45,12 @@ import org.hisp.dhis.user.UserAuthorityGroup; import org.hisp.dhis.validation.ValidationCriteria; -import java.util.HashSet; -import java.util.List; -import java.util.Set; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonView; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper; +import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty; +import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement; /** * @author Abyot Asalefew @@ -127,15 +128,17 @@ private Set<OrganisationUnitGroup> organisationUnitGroups = new HashSet<OrganisationUnitGroup>(); /** - * Allow enrolling person to all orgunit no matter what the program is assigned for the orgunit or not + * Allow enrolling person to all orgunit no matter what the program is + * assigned for the orgunit or not */ private Boolean displayOnAllOrgunit = true; - - + private Boolean useBirthDateAsIncidentDate; - + private Boolean useBirthDateAsEnrollmentDate; + private Boolean selectEnrollmentDatesInFuture; + // ------------------------------------------------------------------------- // Constructors // ------------------------------------------------------------------------- @@ -523,7 +526,7 @@ { this.patientReminders = patientReminders; } - + @JsonProperty @JsonSerialize( contentAs = BaseIdentifiableObject.class ) @JacksonXmlElementWrapper( localName = "organisationUnitGroups", namespace = DxfNamespaces.DXF_2_0 ) @@ -574,4 +577,14 @@ this.useBirthDateAsEnrollmentDate = useBirthDateAsEnrollmentDate; } + public Boolean getSelectEnrollmentDatesInFuture() + { + return selectEnrollmentDatesInFuture; + } + + public void setSelectEnrollmentDatesInFuture( Boolean selectEnrollmentDatesInFuture ) + { + this.selectEnrollmentDatesInFuture = selectEnrollmentDatesInFuture; + } + } === modified file 'dhis-2/dhis-services/dhis-service-patient/src/main/java/org/hisp/dhis/patient/startup/TableAlteror.java' --- dhis-2/dhis-services/dhis-service-patient/src/main/java/org/hisp/dhis/patient/startup/TableAlteror.java 2013-07-16 04:31:27 +0000 +++ dhis-2/dhis-services/dhis-service-patient/src/main/java/org/hisp/dhis/patient/startup/TableAlteror.java 2013-07-25 02:32:32 +0000 @@ -221,6 +221,7 @@ executeSql( "update patientattribute set displayonvisitschedule = false where displayonvisitschedule is null"); executeSql( "update program set useBirthDateAsIncidentDate = false where useBirthDateAsIncidentDate is null"); executeSql( "update program set useBirthDateAsEnrollmentDate = false where useBirthDateAsEnrollmentDate is null"); + executeSql( "update program set selectEnrollmentDatesInFuture = true where selectEnrollmentDatesInFuture is null"); } // ------------------------------------------------------------------------- === modified file 'dhis-2/dhis-services/dhis-service-patient/src/main/java/org/hisp/dhis/program/hibernate/HibernateProgramStageInstanceStore.java' --- dhis-2/dhis-services/dhis-service-patient/src/main/java/org/hisp/dhis/program/hibernate/HibernateProgramStageInstanceStore.java 2013-07-24 07:03:54 +0000 +++ dhis-2/dhis-services/dhis-service-patient/src/main/java/org/hisp/dhis/program/hibernate/HibernateProgramStageInstanceStore.java 2013-07-25 02:32:32 +0000 @@ -2524,7 +2524,6 @@ + " and psi.executiondate is not null " + " and ( DATE(now()) - DATE(psi.duedate) ) = prm.daysallowedsendmessage " + " and prm.whentosend is null " - //+ " and prm.whentosend = " + PatientReminder.SEND_WHEN_TO_EMROLLEMENT + " and prm.sendto = " + PatientReminder.SEND_TO_USER_GROUP; } } === modified file 'dhis-2/dhis-services/dhis-service-patient/src/main/resources/org/hisp/dhis/program/hibernate/Program.hbm.xml' --- dhis-2/dhis-services/dhis-service-patient/src/main/resources/org/hisp/dhis/program/hibernate/Program.hbm.xml 2013-07-16 04:31:27 +0000 +++ dhis-2/dhis-services/dhis-service-patient/src/main/resources/org/hisp/dhis/program/hibernate/Program.hbm.xml 2013-07-25 02:32:32 +0000 @@ -92,6 +92,8 @@ <property name="useBirthDateAsEnrollmentDate" /> + <property name="selectEnrollmentDatesInFuture" /> + <!-- Access properties --> <many-to-one name="user" class="org.hisp.dhis.user.User" column="userid" foreign-key="fk_program_userid" /> === modified file 'dhis-2/dhis-web/dhis-web-caseentry/src/main/java/org/hisp/dhis/caseentry/action/caseentry/CompleteDataEntryAction.java' --- dhis-2/dhis-web/dhis-web-caseentry/src/main/java/org/hisp/dhis/caseentry/action/caseentry/CompleteDataEntryAction.java 2013-07-24 07:03:54 +0000 +++ dhis-2/dhis-web/dhis-web-caseentry/src/main/java/org/hisp/dhis/caseentry/action/caseentry/CompleteDataEntryAction.java 2013-07-25 02:32:32 +0000 @@ -276,7 +276,7 @@ Collection<PatientReminder> reminders = programInstance.getProgram().getPatientReminders(); for ( PatientReminder rm : reminders ) { - if ( rm != null && rm.getWhenToSend() == PatientReminder.SEND_WHEN_TO_C0MPLETED_PROGRAM ) + if ( rm != null && rm.getWhenToSend() != null && rm.getWhenToSend() == PatientReminder.SEND_WHEN_TO_C0MPLETED_PROGRAM ) { sendProgramMessage( rm, programInstance, patient ); } === modified file 'dhis-2/dhis-web/dhis-web-caseentry/src/main/webapp/dhis-web-caseentry/defaultPatientForm.vm' --- dhis-2/dhis-web/dhis-web-caseentry/src/main/webapp/dhis-web-caseentry/defaultPatientForm.vm 2013-07-12 04:32:20 +0000 +++ dhis-2/dhis-web/dhis-web-caseentry/src/main/webapp/dhis-web-caseentry/defaultPatientForm.vm 2013-07-25 02:32:32 +0000 @@ -199,7 +199,13 @@ <td class='text-column'><label for="dateOfIncident">$encoder.htmlEncode($program.dateOfIncidentDescription) <em title="$i18n.getString( "required" )" class="required">*</em></label></td> <td colspan='2' class='input-column'><input type="text" id="dateOfIncident" name="dateOfIncident" class="{validate:{required:true}}"></td> </tr> - <script>datePickerInRangeValid( 'dateOfIncident' , 'enrollmentDate', false, true );</script> + <script> + #if($program.selectEnrollmentDatesInFuture=='true') + datePickerInRange( 'dateOfIncident' , 'enrollmentDate', false, true ); + #else + datePickerInRangeValid( 'dateOfIncident' , 'enrollmentDate', false, true ); + #end + </script> #else <script>datePickerValid( 'enrollmentDate', true );</script> #end === modified file 'dhis-2/dhis-web/dhis-web-caseentry/src/main/webapp/dhis-web-caseentry/javascript/commons.js' --- dhis-2/dhis-web/dhis-web-caseentry/src/main/webapp/dhis-web-caseentry/javascript/commons.js 2013-07-22 04:59:04 +0000 +++ dhis-2/dhis-web/dhis-web-caseentry/src/main/webapp/dhis-web-caseentry/javascript/commons.js 2013-07-25 02:32:32 +0000 @@ -1267,10 +1267,11 @@ disable('dateOfIncidentField'); } } - var programId = jQuery('#programEnrollmentSelectDiv [id=programId] option:selected').val(); + + var program = jQuery('#programEnrollmentSelectDiv [id=programId] option:selected'); jQuery('#identifierAndAttributeDiv').load("getPatientIdentifierAndAttribute.action", { - id:programId + id:program.val() }, function(){ if(getFieldValue('useBirthDateAsEnrollmentDate')=='true'){ setFieldValue("enrollmentDateField", birthDate) @@ -1282,6 +1283,16 @@ else{ setFieldValue("dateOfIncidentField", ""); } + + jQuery("#dateOfIncidentField").datepicker("destroy"); + jQuery("#enrollmentDateField").datepicker("destroy"); + if(program.attr("selectEnrollmentDatesInFuture")=='true'){ + datePickerInRange( 'dateOfIncidentField' , 'enrollmentDateField', false, true ); + } + else{ + datePickerInRangeValid( 'dateOfIncidentField' , 'enrollmentDateField', false, true ); + } + showById('identifierAndAttributeDiv'); }); } === modified file 'dhis-2/dhis-web/dhis-web-caseentry/src/main/webapp/dhis-web-caseentry/patientForm.vm' --- dhis-2/dhis-web/dhis-web-caseentry/src/main/webapp/dhis-web-caseentry/patientForm.vm 2013-07-22 04:59:04 +0000 +++ dhis-2/dhis-web/dhis-web-caseentry/src/main/webapp/dhis-web-caseentry/patientForm.vm 2013-07-25 02:32:32 +0000 @@ -249,7 +249,13 @@ <td class='text-column'><label for="dateOfIncident">$encoder.htmlEncode($program.dateOfIncidentDescription) <em title="$i18n.getString( "required" )" class="required">*</em></label></td> <td colspan='2' class='input-column'><input type="text" id="dateOfIncident" name="dateOfIncident" class="{validate:{required:true}}"></td> </tr> - <script>datePickerInRangeValid( 'dateOfIncident' , 'enrollmentDate', false, true );</script> + <script> + #if($program.selectEnrollmentDatesInFuture=='true') + datePickerInRange( 'dateOfIncident' , 'enrollmentDate', false, true ); + #else + datePickerInRangeValid( 'dateOfIncident' , 'enrollmentDate', false, true ); + #end + </script> #else <script>datePickerValid( 'enrollmentDate', true );</script> #end === modified file 'dhis-2/dhis-web/dhis-web-caseentry/src/main/webapp/dhis-web-caseentry/programEnrollmentSelectForm.vm' --- dhis-2/dhis-web/dhis-web-caseentry/src/main/webapp/dhis-web-caseentry/programEnrollmentSelectForm.vm 2013-07-18 04:01:13 +0000 +++ dhis-2/dhis-web/dhis-web-caseentry/src/main/webapp/dhis-web-caseentry/programEnrollmentSelectForm.vm 2013-07-25 02:32:32 +0000 @@ -10,8 +10,6 @@ validation( 'programEnrollmentSelectDiv', function(form){ validateProgramEnrollment(); }); - datePickerInRangeValid( 'dateOfIncidentField' , 'enrollmentDateField' ); - var unSave = false; }); </script> @@ -32,7 +30,8 @@ <option value="$program.id" programType='$program.type' displayIncidentDate='$!program.displayIncidentDate' dateOfEnrollmentDescription='$!program.dateOfEnrollmentDescription' - dateOfIncidentDescription='$!program.dateOfIncidentDescription'>$encoder.htmlEncode( $program.displayName )</option> + dateOfIncidentDescription='$!program.dateOfIncidentDescription' + selectEnrollmentDatesInFuture='$!program.selectEnrollmentDatesInFuture'>$encoder.htmlEncode( $program.displayName )</option> #end </select> </td> === added file 'dhis-2/dhis-web/dhis-web-caseentry/src/main/webapp/dhis-web-caseentry/reportsMenuWithoutOrgunit.vm' --- dhis-2/dhis-web/dhis-web-caseentry/src/main/webapp/dhis-web-caseentry/reportsMenuWithoutOrgunit.vm 1970-01-01 00:00:00 +0000 +++ dhis-2/dhis-web/dhis-web-caseentry/src/main/webapp/dhis-web-caseentry/reportsMenuWithoutOrgunit.vm 2013-07-25 02:32:32 +0000 @@ -0,0 +1,16 @@ + +<a href="index.action"><h2>$i18n.getString( "reports" ) </h2></a> +<ul> + #if( $auth.hasAccess( "dhis-web-caseentry", "reportSelect" ) ) + <li><a href="reportSelect.action">$i18n.getString( "program_summary" ) </a></li> + #end + #if( $auth.hasAccess( "dhis-web-caseentry", "generateTabularReport" ) ) + <li><a href="app/index.html"> $i18n.getString( "tabular_report" ) </a></li> + #end + #if( $auth.hasAccess( "dhis-web-caseentry", "statisticalProgramReportSelect" ) ) + <li><a href="statisticalProgramReportSelect.action"> $i18n.getString( "statistical_program" ) </a></li> + #end + #if( $auth.hasAccess( "dhis-web-caseentry", "programStageCompletenessSelect" ) ) + <li><a href="programStageCompletenessSelect.action"> $i18n.getString( "program_stage_completeness" ) </a></li> + #end +</ul> === modified file 'dhis-2/dhis-web/dhis-web-caseentry/src/main/webapp/dhis-web-caseentry/visitSchedule.vm' --- dhis-2/dhis-web/dhis-web-caseentry/src/main/webapp/dhis-web-caseentry/visitSchedule.vm 2013-07-04 10:11:47 +0000 +++ dhis-2/dhis-web/dhis-web-caseentry/src/main/webapp/dhis-web-caseentry/visitSchedule.vm 2013-07-25 02:32:32 +0000 @@ -242,7 +242,12 @@ <script> #if( $programInstance.status==0) - datePickerInRangeValid( 'dateOfIncident' , 'enrollmentDate' ); + #if(program.attr("selectEnrollmentDatesInFuture")=='true') + datePickerInRange( 'dateOfIncident' , 'enrollmentDate', false, true ); + #else + datePickerInRangeValid( 'dateOfIncident' , 'enrollmentDate', false, true ); + #end + jQuery("#incompleteProgram").attr('disabled', true); #else jQuery(":input").attr('disabled', true); === modified file 'dhis-2/dhis-web/dhis-web-commons-resources/src/main/webapp/dhis-web-commons/ajax/jsonProgram.vm' --- dhis-2/dhis-web/dhis-web-commons-resources/src/main/webapp/dhis-web-commons/ajax/jsonProgram.vm 2013-07-16 04:31:27 +0000 +++ dhis-2/dhis-web/dhis-web-commons-resources/src/main/webapp/dhis-web-commons/ajax/jsonProgram.vm 2013-07-25 02:32:32 +0000 @@ -18,6 +18,7 @@ "remindCompleted": "$!program.remindCompleted", "displayOnAllOrgunit": "$!program.displayOnAllOrgunit", "useBirthDateAsIncidentDate": "$!program.useBirthDateAsIncidentDate", - "useBirthDateAsEnrollmentDate": "$!program.useBirthDateAsEnrollmentDate" + "useBirthDateAsEnrollmentDate": "$!program.useBirthDateAsEnrollmentDate", + "selecteEnrollmentDatesInFuture": "$!program.selecteEnrollmentDatesInFuture" } } \ No newline at end of file === modified file 'dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-patient/src/main/java/org/hisp/dhis/patient/action/program/AddProgramAction.java' --- dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-patient/src/main/java/org/hisp/dhis/patient/action/program/AddProgramAction.java 2013-07-16 04:31:27 +0000 +++ dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-patient/src/main/java/org/hisp/dhis/patient/action/program/AddProgramAction.java 2013-07-25 02:32:32 +0000 @@ -256,6 +256,13 @@ this.useBirthDateAsEnrollmentDate = useBirthDateAsEnrollmentDate; } + private Boolean selectEnrollmentDatesInFuture; + + public void setSelectEnrollmentDatesInFuture( Boolean selectEnrollmentDatesInFuture ) + { + this.selectEnrollmentDatesInFuture = selectEnrollmentDatesInFuture; + } + // ------------------------------------------------------------------------- // Action implementation // ------------------------------------------------------------------------- @@ -273,6 +280,7 @@ displayOnAllOrgunit = (displayOnAllOrgunit == null) ? false : displayOnAllOrgunit; useBirthDateAsIncidentDate = (useBirthDateAsIncidentDate == null) ? false : useBirthDateAsIncidentDate; useBirthDateAsEnrollmentDate = (useBirthDateAsEnrollmentDate == null) ? false : useBirthDateAsEnrollmentDate; + selectEnrollmentDatesInFuture = (selectEnrollmentDatesInFuture == null) ? false : selectEnrollmentDatesInFuture; Program program = new Program(); @@ -290,6 +298,7 @@ program.setDisplayOnAllOrgunit( displayOnAllOrgunit ); program.setUseBirthDateAsIncidentDate( useBirthDateAsIncidentDate ); program.setUseBirthDateAsEnrollmentDate( useBirthDateAsEnrollmentDate ); + program.setSelectEnrollmentDatesInFuture( selectEnrollmentDatesInFuture ); if ( type == Program.MULTIPLE_EVENTS_WITH_REGISTRATION ) { === modified file 'dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-patient/src/main/java/org/hisp/dhis/patient/action/program/UpdateProgramAction.java' --- dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-patient/src/main/java/org/hisp/dhis/patient/action/program/UpdateProgramAction.java 2013-07-22 09:24:53 +0000 +++ dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-patient/src/main/java/org/hisp/dhis/patient/action/program/UpdateProgramAction.java 2013-07-25 02:32:32 +0000 @@ -76,9 +76,9 @@ { this.patientAttributeService = patientAttributeService; } - + private UserGroupService userGroupService; - + public void setUserGroupService( UserGroupService userGroupService ) { this.userGroupService = userGroupService; @@ -246,7 +246,7 @@ { this.whenToSend = whenToSend; } - + private Boolean useBirthDateAsIncidentDate; public void setUseBirthDateAsIncidentDate( Boolean useBirthDateAsIncidentDate ) @@ -260,14 +260,21 @@ { this.useBirthDateAsEnrollmentDate = useBirthDateAsEnrollmentDate; } - + private List<Integer> userGroup = new ArrayList<Integer>(); - + public void setUserGroup( List<Integer> userGroup ) { this.userGroup = userGroup; } + private Boolean selectEnrollmentDatesInFuture; + + public void setSelectEnrollmentDatesInFuture( Boolean selectEnrollmentDatesInFuture ) + { + this.selectEnrollmentDatesInFuture = selectEnrollmentDatesInFuture; + } + // ------------------------------------------------------------------------- // Action implementation // ------------------------------------------------------------------------- @@ -284,7 +291,8 @@ displayOnAllOrgunit = (displayOnAllOrgunit == null) ? false : displayOnAllOrgunit; useBirthDateAsIncidentDate = (useBirthDateAsIncidentDate == null) ? false : useBirthDateAsIncidentDate; useBirthDateAsEnrollmentDate = (useBirthDateAsEnrollmentDate == null) ? false : useBirthDateAsEnrollmentDate; - + selectEnrollmentDatesInFuture = (selectEnrollmentDatesInFuture == null) ? false : selectEnrollmentDatesInFuture; + Program program = programService.getProgram( id ); program.setName( name ); program.setDescription( description ); @@ -300,7 +308,8 @@ program.setDisplayOnAllOrgunit( displayOnAllOrgunit ); program.setUseBirthDateAsIncidentDate( useBirthDateAsIncidentDate ); program.setUseBirthDateAsEnrollmentDate( useBirthDateAsEnrollmentDate ); - + program.setSelectEnrollmentDatesInFuture( selectEnrollmentDatesInFuture ); + if ( type == Program.MULTIPLE_EVENTS_WITH_REGISTRATION ) { program.setGeneratedByEnrollmentDate( generateBydEnrollmentDate ); === modified file 'dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-patient/src/main/resources/org/hisp/dhis/patient/i18n_module.properties' --- dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-patient/src/main/resources/org/hisp/dhis/patient/i18n_module.properties 2013-07-19 06:04:09 +0000 +++ dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-patient/src/main/resources/org/hisp/dhis/patient/i18n_module.properties 2013-07-25 02:32:32 +0000 @@ -447,4 +447,5 @@ use_birth_date_as_incident_date = Use birthdate as incident date use_birth_date_as_enrollment_date = Use birthdate as enrollment date default_form_name = Default form name -custom_form_name = Custom form name \ No newline at end of file +custom_form_name = Custom form name +allow_select_enrollment_dates_in_future = Allow seleting enrollment dates in future \ No newline at end of file
_______________________________________________ Mailing list: https://launchpad.net/~dhis2-devs Post to : dhis2-devs@lists.launchpad.net Unsubscribe : https://launchpad.net/~dhis2-devs More help : https://help.launchpad.net/ListHelp