Skip to content

Commit

Permalink
fix: Validate search scope when scheduled event [DHIS2-17335][2.40] (#…
Browse files Browse the repository at this point in the history
  • Loading branch information
muilpp authored Dec 13, 2024
1 parent c50e4ef commit e2af7dd
Show file tree
Hide file tree
Showing 3 changed files with 70 additions and 19 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -111,13 +111,18 @@ public void validate(Reporter reporter, TrackerBundle bundle, Event event) {
organisationUnit = bundle.getPreheat().getOrganisationUnit(event.getOrgUnit());
}

// If event is newly created, or going to be deleted, capture scope
// has to be checked
if (program.isWithoutRegistration() || strategy.isCreate() || strategy.isDelete()) {
if (organisationUnit == null) {
log.warn(ORG_UNIT_NO_USER_ASSIGNED, event.getEvent());
} else {
checkOrgUnitInCaptureScope(reporter, bundle, event, organisationUnit);
checkEventOrgUnitWriteAccess(
reporter,
event,
organisationUnit,
strategy.isCreate()
? event.isCreatableInSearchScope()
: bundle.getPreheat().getEvent(event.getUid()).isCreatableInSearchScope(),
bundle.getUser());
}
}
String teUid = getTeUidFromEvent(bundle, event, program);
Expand Down Expand Up @@ -253,18 +258,6 @@ public boolean needsToRun(TrackerImportStrategy strategy) {
return true;
}

private void checkOrgUnitInCaptureScope(
Reporter reporter, TrackerBundle bundle, TrackerDto dto, OrganisationUnit orgUnit) {
User user = bundle.getUser();

checkNotNull(user, USER_CANT_BE_NULL);
checkNotNull(orgUnit, ORGANISATION_UNIT_CANT_BE_NULL);

if (!organisationUnitService.isInUserHierarchyCached(user, orgUnit)) {
reporter.addError(dto, ValidationCode.E1000, user, orgUnit);
}
}

private void checkTeiTypeAndTeiProgramAccess(
Reporter reporter,
TrackerDto dto,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
*/
package org.hisp.dhis.tracker.validation;

import static org.hisp.dhis.tracker.Assertions.assertHasError;
import static org.hisp.dhis.tracker.Assertions.assertHasOnlyErrors;
import static org.hisp.dhis.tracker.Assertions.assertNoErrors;
import static org.hisp.dhis.tracker.validation.Users.USER_3;
Expand All @@ -37,6 +38,7 @@
import java.util.Calendar;
import java.util.Date;
import java.util.HashSet;
import java.util.Set;
import org.hisp.dhis.common.IdentifiableObjectManager;
import org.hisp.dhis.common.ValueType;
import org.hisp.dhis.dataelement.DataElement;
Expand Down Expand Up @@ -200,16 +202,12 @@ private void setupMetadata() {
trackedEntityProgramOwnerService.updateTrackedEntityProgramOwner(
maleA.getUid(), programA.getUid(), organisationUnitA.getUid());
manager.update(programA);
User user = userService.getUser(USER_5);
OrganisationUnit qfUVllTs6cS = organisationUnitService.getOrganisationUnit("QfUVllTs6cS");
user.addOrganisationUnit(qfUVllTs6cS);
user.addOrganisationUnit(organisationUnitA);
User adminUser = userService.getUser(ADMIN_USER_UID);
adminUser.addOrganisationUnit(organisationUnitA);
Program p = programService.getProgram("prabcdefghA");
p.addOrganisationUnit(qfUVllTs6cS);
programService.updateProgram(p);
manager.update(user);
manager.update(adminUser);
}

Expand Down Expand Up @@ -258,4 +256,35 @@ void testNoUncompleteEventAuth() throws IOException {
importReport = trackerImportService.importTracker(trackerBundleParams);
assertHasOnlyErrors(importReport, ValidationCode.E1083);
}

@Test
void shouldSucceedWhenCreatingScheduledEventFromInsideSearchOrgUnit() throws IOException {
TrackerImportParams trackerBundleParams =
fromJson("tracker/validations/events-scheduled-with-registration.json");
OrganisationUnit orgUnit = organisationUnitService.getOrganisationUnit("QfUVllTs6cS");
User user = userService.getUser(USER_5);
user.setTeiSearchOrganisationUnits(Set.of(orgUnit));
manager.update(user);
injectSecurityContext(user);
trackerBundleParams.setUser(user);

ImportReport importReport = trackerImportService.importTracker(trackerBundleParams);

assertNoErrors(importReport);
}

@Test
void shouldFailWhenCreatingScheduledEventFromOutsideSearchOrgUnit() throws IOException {
TrackerImportParams trackerBundleParams =
fromJson("tracker/validations/events-scheduled-with-registration.json");
TrackerImportParams params = TrackerImportParams.builder().build();
params.setImportStrategy(TrackerImportStrategy.CREATE);
User user = userService.getUser(USER_5);
injectSecurityContext(user);
trackerBundleParams.setUser(user);

ImportReport importReport = trackerImportService.importTracker(trackerBundleParams);

assertHasError(importReport, ValidationCode.E1000);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
{
"events": [
{
"event": "ZwwuwNp6gVd",
"status": "SCHEDULE",
"program": {
"idScheme": "UID",
"identifier": "E8o1E9tAppy"
},
"programStage": {
"idScheme": "UID",
"identifier": "Qmqxq907VNz"
},
"enrollment": "MNWZ6hnuhSw",
"orgUnit": {
"idScheme": "UID",
"identifier": "QfUVllTs6cS"
},
"orgUnitName": "TA org_unit lvl2",
"scheduledAt": "2019-08-19T13:59:13.688",
"storedBy": "admin",
"deleted": false,
"attributeOptionCombo": {
"idScheme": "UID",
"identifier": "HllvX50cXC0"
}
}
]
}

0 comments on commit e2af7dd

Please sign in to comment.