diff --git a/commcare_connect/form_receiver/processor.py b/commcare_connect/form_receiver/processor.py index 12792d7f..641213c5 100644 --- a/commcare_connect/form_receiver/processor.py +++ b/commcare_connect/form_receiver/processor.py @@ -179,13 +179,14 @@ def clean_form_submission(access: OpportunityAccess, user_visit: UserVisit, xfor if opportunity_flags.catchment_areas: areas = access.catchmentarea_set.filter(active=True) if areas: - cur_lat, cur_lon, *_ = xform.metadata.location.split(" ") within_catchment = False - for area in areas: - dist = distance((area.latitude, area.longitude), (cur_lat, cur_lon)) - if dist.meters < area.radius: - within_catchment = True - break + if xform.metadata.location is not None: + cur_lat, cur_lon, *_ = xform.metadata.location.split(" ") + for area in areas: + dist = distance((area.latitude, area.longitude), (cur_lat, cur_lon)) + if dist.meters < area.radius: + within_catchment = True + break if not within_catchment: flags.append(["catchment", "Visit outside worker catchment areas"]) if ( diff --git a/commcare_connect/form_receiver/tests/test_receiver_integration.py b/commcare_connect/form_receiver/tests/test_receiver_integration.py index 6966dedb..c52af2a5 100644 --- a/commcare_connect/form_receiver/tests/test_receiver_integration.py +++ b/commcare_connect/form_receiver/tests/test_receiver_integration.py @@ -27,6 +27,7 @@ ) from commcare_connect.opportunity.tasks import bulk_approve_completed_work from commcare_connect.opportunity.tests.factories import ( + CatchmentAreaFactory, DeliverUnitFactory, DeliverUnitFlagRulesFactory, FormJsonValidationRulesFactory, @@ -576,6 +577,25 @@ def test_reciever_verification_flags_form_json_rule_flagged( ] in visit.flag_reason.get("flags", []) +def test_reciever_verification_flags_catchment_areas( + user_with_connectid_link: User, api_client: APIClient, opportunity: Opportunity +): + verification_flags = OpportunityVerificationFlags.objects.get(opportunity=opportunity) + verification_flags.catchment_areas = True + verification_flags.save() + + form_json = _create_opp_and_form_json(opportunity, user=user_with_connectid_link) + form_json["metadata"]["location"] = None + + access = OpportunityAccess.objects.get(user=user_with_connectid_link, opportunity=opportunity) + CatchmentAreaFactory(opportunity=opportunity, opportunity_access=access, active=True) + + make_request(api_client, form_json, user_with_connectid_link) + visit = UserVisit.objects.get(user=user_with_connectid_link) + assert visit.flagged + assert ["catchment", "Visit outside worker catchment areas"] in visit.flag_reason.get("flags", []) + + def _get_form_json(learn_app, module_id, form_block=None): form_json = get_form_json( form_block=form_block or LearnModuleJsonFactory(id=module_id).json,