Esempio n. 1
0
    def test_convert_ingest_info_one_charge_to_one_bond(
        self, mock_create: Mock
    ) -> None:
        mock_create.side_effect = self._create_generated_id
        info = ingest_info.IngestInfo()
        person = info.create_person()
        person.person_id = "id1"

        booking = person.create_booking()
        booking.booking_id = "id1"
        charge = booking.create_charge()
        charge.charge_id = "id1"
        bond1 = charge.create_bond()
        bond1.amount = "$1"
        charge = booking.create_charge()
        charge.charge_id = "id2"
        bond2 = charge.create_bond()
        bond2.amount = "$1"

        expected_proto = ingest_info_pb2.IngestInfo()
        proto_person = expected_proto.people.add()
        proto_person.person_id = "id1"
        proto_person.booking_ids.append("id1")
        proto_booking = expected_proto.bookings.add()
        proto_booking.booking_id = "id1"
        proto_booking.charge_ids.extend(["id1", "id2"])
        proto_charge = expected_proto.charges.add()
        proto_charge.charge_id = "id1"
        proto_bond1 = expected_proto.bonds.add()
        proto_bond1.amount = "$1"
        proto_bond1.bond_id = "1_GENERATE"
        proto_charge.bond_id = proto_bond1.bond_id
        proto_charge = expected_proto.charges.add()
        proto_charge.charge_id = "id2"
        proto_bond2 = expected_proto.bonds.add()
        proto_bond2.amount = "$1"
        proto_bond2.bond_id = "2_GENERATE"
        proto_charge.bond_id = proto_bond2.bond_id

        proto = serialization.convert_ingest_info_to_proto(info)
        assert expected_proto == proto

        info_back = serialization.convert_proto_to_ingest_info(proto)
        assert info_back == info
Esempio n. 2
0
    def test_convert_ingest_info_one_charge_to_one_bond(self, mock_create):
        mock_create.side_effect = self._create_generated_id
        info = ingest_info.IngestInfo()
        person = info.create_person()
        person.person_id = 'id1'

        booking = person.create_booking()
        booking.booking_id = 'id1'
        charge = booking.create_charge()
        charge.charge_id = 'id1'
        bond1 = charge.create_bond()
        bond1.amount = '$1'
        charge = booking.create_charge()
        charge.charge_id = 'id2'
        bond2 = charge.create_bond()
        bond2.amount = '$1'

        expected_proto = ingest_info_pb2.IngestInfo()
        person = expected_proto.people.add()
        person.person_id = 'id1'
        person.booking_ids.append('id1')
        booking = expected_proto.bookings.add()
        booking.booking_id = 'id1'
        booking.charge_ids.extend(['id1', 'id2'])
        charge = expected_proto.charges.add()
        charge.charge_id = 'id1'
        proto_bond1 = expected_proto.bonds.add()
        proto_bond1.amount = '$1'
        proto_bond1.bond_id = '1_GENERATE'
        charge.bond_id = proto_bond1.bond_id
        charge = expected_proto.charges.add()
        charge.charge_id = 'id2'
        proto_bond2 = expected_proto.bonds.add()
        proto_bond2.amount = '$1'
        proto_bond2.bond_id = '2_GENERATE'
        charge.bond_id = proto_bond2.bond_id

        proto = ingest_utils.convert_ingest_info_to_proto(info)
        assert expected_proto == proto

        info_back = ingest_utils.convert_proto_to_ingest_info(proto)
        assert info_back == info
Esempio n. 3
0
    def test_convert_ingest_info_id_is_generated(self, mock_create):
        mock_create.side_effect = self._create_generated_id
        info = ingest_info.IngestInfo()
        person = info.create_person()
        person.surname = "testname"
        person.create_booking()

        expected_proto = ingest_info_pb2.IngestInfo()
        proto_person = expected_proto.people.add()
        proto_person.surname = "testname"
        proto_person.person_id = "1_GENERATE"
        proto_booking = expected_proto.bookings.add()
        proto_booking.booking_id = "2_GENERATE"
        proto_person.booking_ids.append(proto_booking.booking_id)

        proto = ingest_utils.convert_ingest_info_to_proto(info)
        assert proto == expected_proto

        info_back = ingest_utils.convert_proto_to_ingest_info(proto)
        assert info_back == info
Esempio n. 4
0
    def test_convert_ingest_info_many_charge_to_one_bond(self, mock_create):
        mock_create.side_effect = self._create_generated_id
        info = ingest_info.IngestInfo()
        person = info.create_person()
        person.person_id = "id1"

        booking = person.create_booking()
        booking.booking_id = "id1"
        charge = booking.create_charge()
        charge.charge_id = "id1"
        bond1 = charge.create_bond()
        bond1.amount = "$1"
        charge = booking.create_charge()
        charge.charge_id = "id2"
        charge.bond = bond1

        expected_proto = ingest_info_pb2.IngestInfo()
        person = expected_proto.people.add()
        person.person_id = "id1"
        person.booking_ids.append("id1")
        booking = expected_proto.bookings.add()
        booking.booking_id = "id1"
        booking.charge_ids.extend(["id1", "id2"])
        charge = expected_proto.charges.add()
        charge.charge_id = "id1"
        proto_bond = expected_proto.bonds.add()
        proto_bond.amount = "$1"
        proto_bond.bond_id = "1_GENERATE"
        charge.bond_id = proto_bond.bond_id
        charge = expected_proto.charges.add()
        charge.charge_id = "id2"
        charge.bond_id = proto_bond.bond_id

        proto = ingest_utils.convert_ingest_info_to_proto(info)
        assert len(proto.bonds) == 1
        assert expected_proto == proto

        info_back = ingest_utils.convert_proto_to_ingest_info(proto)
        assert info_back == info
Esempio n. 5
0
    def test_convert_ingest_info_id_is_not_generated(self):
        info = ingest_info.IngestInfo()
        person = info.create_person()
        person.person_id = "id1"
        person.surname = "testname"
        booking = person.create_booking()
        booking.booking_id = "id2"
        booking.admission_date = "testdate"

        expected_proto = ingest_info_pb2.IngestInfo()
        person = expected_proto.people.add()
        person.person_id = "id1"
        person.surname = "testname"
        person.booking_ids.append("id2")
        booking = expected_proto.bookings.add()
        booking.booking_id = "id2"
        booking.admission_date = "testdate"

        proto = ingest_utils.convert_ingest_info_to_proto(info)
        assert expected_proto == proto

        info_back = ingest_utils.convert_proto_to_ingest_info(proto)
        assert info_back == info
Esempio n. 6
0
    def test_convert_ingest_info_state_entities(self):
        # Arrange Python ingest info
        info = ingest_info.IngestInfo()
        person = info.create_state_person()
        person.state_person_id = "person1"
        person.surname = "testname"

        race = person.create_state_person_race()
        race.state_person_race_id = "race1"
        race.race = "white"
        ethnicity = person.create_state_person_ethnicity()
        ethnicity.state_person_ethnicity_id = "ethnicity1"
        ethnicity.ethnicity = "non-hispanic"
        external_id = person.create_state_person_external_id()
        external_id.state_person_external_id_id = "external_id1"
        external_id.id_type = "contrived"
        alias = person.create_state_alias()
        alias.state_alias_id = "alias1"
        alias.surname = "testerson"
        assessment = person.create_state_assessment()
        assessment.state_assessment_id = "assessment1"
        assessment.assessment_score = "42"
        supervising_officer = person.create_state_agent()
        supervising_officer.state_agent_id = "supervising_officer1"
        supervising_officer.full_name = "Officer Supervising"

        assessment_agent = assessment.create_state_agent()
        assessment_agent.state_agent_id = "agent1"
        assessment_agent.full_name = "Officer Jones"

        program_assignment = person.create_state_program_assignment()
        program_assignment.state_program_assignment_id = "assignment1"
        program_assignment.program_id = "program_id1"

        program_assignment_agent = program_assignment.create_state_agent()
        program_assignment_agent.state_agent_id = "program_agent1"
        program_assignment_agent.full_name = "Officer Program"

        group = person.create_state_sentence_group()
        group.state_sentence_group_id = "group1"

        fine = group.create_state_fine()
        fine.state_fine_id = "fine1"

        incarceration_sentence = group.create_state_incarceration_sentence()
        incarceration_sentence.state_incarceration_sentence_id = "is1"
        early_discharge1 = incarceration_sentence.create_state_early_discharge()
        early_discharge1.state_early_discharge_id = "early_discharge1"
        charge1 = incarceration_sentence.create_state_charge()
        charge1.state_charge_id = "charge1"
        charge1.classification_type = "F"
        incarceration_period = (
            incarceration_sentence.create_state_incarceration_period()
        )
        incarceration_period.state_incarceration_period_id = "ip1"
        incarceration_period.status = "IN_CUSTODY"
        incarceration_period.specialized_purpose_for_incarceration = (
            "SHOCK INCARCERATION"
        )
        incarceration_period.state_program_assignments = [program_assignment]
        incident = incarceration_period.create_state_incarceration_incident()
        incident.state_incarceration_incident_id = "incident1"
        incident.incident_type = "FISTICUFFS"
        incident_outcome = incident.create_state_incarceration_incident_outcome()
        incident_outcome.state_incarceration_incident_outcome_id = "incident1-1"
        incident_outcome.outcome_type = "FINE"

        incident_agent = incident.create_state_agent()
        incident_agent.state_agent_id = "agent2"
        incident_agent.full_name = "Officer Thompson"

        decision = incarceration_period.create_state_parole_decision()
        decision.state_parole_decision_id = "decision1"

        decision_agent = decision.create_state_agent()
        decision_agent.state_agent_id = "agent3"
        decision_agent.full_name = "Officer Barkley"

        supervision_sentence = group.create_state_supervision_sentence()
        supervision_sentence.state_supervision_sentence_id = "ss1"
        early_discharge2 = supervision_sentence.create_state_early_discharge()
        early_discharge2.state_early_discharge_id = "early_discharge2"
        charge2 = supervision_sentence.create_state_charge()
        charge2.state_charge_id = "charge2"
        charge2.classification_type = "M"
        supervision_period = supervision_sentence.create_state_supervision_period()
        supervision_period.state_supervision_period_id = "sp1"
        supervision_period.status = "TERMINATED"
        supervision_period_agent = supervision_period.create_state_agent()
        supervision_period_agent.state_agent_id = "agentPO"
        supervision_period_agent.full_name = "Officer Paroley"
        supervision_period.state_program_assignments = [program_assignment]

        supervision_case_type_entry = (
            supervision_period.create_state_supervision_case_type_entry()
        )
        supervision_case_type_entry.case_type = "case_type"
        supervision_case_type_entry.state_supervision_case_type_entry_id = (
            "case_type_entry_id"
        )

        supervision_contact = supervision_period.create_state_supervision_contact()
        supervision_contact.state_supervision_contact_id = "supervision_contact_id"
        supervision_contact.contact_type = "contact_type"
        supervision_contacted_agent = supervision_contact.create_state_agent()
        supervision_contacted_agent.state_agent_id = "agentPO"
        supervision_contacted_agent.full_name = "Officer Paroley"

        violation = supervision_period.create_state_supervision_violation()
        violation.state_supervision_violation_id = "violation1"
        violation.violated_conditions = "cond"
        violation.is_violent = "false"

        violation_type = violation.create_state_supervision_violation_type_entry()
        violation_type.state_supervision_violation_type_entry_id = "violation_type_id"
        violation_type.violation_type = "FELONY"

        violated_condition = (
            violation.create_state_supervision_violated_condition_entry()
        )
        violated_condition.state_supervision_violated_condition_entry_id = (
            "condition_id"
        )
        violated_condition.condition = "CURFEW"

        response = violation.create_state_supervision_violation_response()
        response.state_supervision_violation_response_id = "response1"
        response_decision_agent = response.create_state_agent()
        response_decision_agent.state_agent_id = "agentTERM"
        response_decision_agent.full_name = "Officer Termy"

        response_decision = (
            response.create_state_supervision_violation_response_decision_entry()
        )
        response_decision.state_supervision_violation_response_decision_entry_id = (
            "response_decision_id"
        )
        response_decision.decision = "REVOCATION"
        response_decision.revocation_type = "REINCARCERATION"

        bond = charge1.create_state_bond()
        bond.state_bond_id = "bond1"

        court_case = charge2.create_state_court_case()
        court_case.state_court_case_id = "case1"

        court_case_agent = court_case.create_state_agent()
        court_case_agent.state_agent_id = "agentJ"
        court_case_agent.full_name = "Judge Agent"

        # Arrange Proto ingest info
        expected_proto = ingest_info_pb2.IngestInfo()
        person_pb = expected_proto.state_people.add()
        person_pb.state_person_id = "person1"
        person_pb.surname = "testname"

        person_pb.state_person_race_ids.append("race1")
        race_pb = expected_proto.state_person_races.add()
        race_pb.state_person_race_id = "race1"
        race_pb.race = "white"
        person_pb.state_person_ethnicity_ids.append("ethnicity1")
        ethnicity_pb = expected_proto.state_person_ethnicities.add()
        ethnicity_pb.state_person_ethnicity_id = "ethnicity1"
        ethnicity_pb.ethnicity = "non-hispanic"
        person_pb.state_person_external_ids_ids.append("contrived:external_id1")
        external_id_pb = expected_proto.state_person_external_ids.add()
        external_id_pb.state_person_external_id_id = "contrived:external_id1"
        external_id_pb.id_type = "contrived"
        person_pb.state_alias_ids.append("alias1")
        alias_pb = expected_proto.state_aliases.add()
        alias_pb.state_alias_id = "alias1"
        alias_pb.surname = "testerson"
        person_pb.state_assessment_ids.append("assessment1")
        assessment_pb = expected_proto.state_assessments.add()
        assessment_pb.state_assessment_id = "assessment1"
        assessment_pb.assessment_score = "42"
        person_pb.supervising_officer_id = "supervising_officer1"
        supervising_officer_pb = expected_proto.state_agents.add()
        supervising_officer_pb.state_agent_id = "supervising_officer1"
        supervising_officer_pb.full_name = "Officer Supervising"

        assessment_pb.conducting_agent_id = "agent1"
        assessment_agent_pb = expected_proto.state_agents.add()
        assessment_agent_pb.state_agent_id = "agent1"
        assessment_agent_pb.full_name = "Officer Jones"

        person_pb.state_program_assignment_ids.append("assignment1")
        program_assignment_pb = expected_proto.state_program_assignments.add()
        program_assignment_pb.state_program_assignment_id = "assignment1"
        program_assignment_pb.program_id = "program_id1"
        program_assignment_pb.referring_agent_id = "program_agent1"
        program_assignment_agent_pb = expected_proto.state_agents.add()
        program_assignment_agent_pb.state_agent_id = "program_agent1"
        program_assignment_agent_pb.full_name = "Officer Program"

        person_pb.state_sentence_group_ids.append("group1")
        group_pb = expected_proto.state_sentence_groups.add()
        group_pb.state_sentence_group_id = "group1"

        group_pb.state_fine_ids.append("fine1")
        fine_pb = expected_proto.state_fines.add()
        fine_pb.state_fine_id = "fine1"

        group_pb.state_supervision_sentence_ids.append("ss1")
        supervision_sentence_pb = expected_proto.state_supervision_sentences.add()
        supervision_sentence_pb.state_supervision_sentence_id = "ss1"
        supervision_sentence_pb.state_early_discharge_ids.append("early_discharge2")
        early_discharge2_pb = expected_proto.state_early_discharges.add()
        early_discharge2_pb.state_early_discharge_id = "early_discharge2"
        supervision_sentence_pb.state_charge_ids.append("charge2")
        charge2_pb = expected_proto.state_charges.add()
        charge2_pb.state_charge_id = "charge2"
        charge2_pb.classification_type = "M"
        supervision_sentence_pb.state_supervision_period_ids.append("sp1")
        supervision_period_pb = expected_proto.state_supervision_periods.add()
        supervision_period_pb.state_supervision_period_id = "sp1"
        supervision_period_pb.status = "TERMINATED"
        supervision_period_pb.state_program_assignment_ids.append("assignment1")

        # An ordering requirement in the proto equality check at the end of this
        # test requires that this agent be added after agent1 and before agentPO
        court_case_agent_pb = expected_proto.state_agents.add()
        court_case_agent_pb.state_agent_id = "agentJ"
        court_case_agent_pb.full_name = "Judge Agent"

        supervision_period_pb.supervising_officer_id = "agentPO"
        supervision_period_agent_pb = expected_proto.state_agents.add()
        supervision_period_agent_pb.state_agent_id = "agentPO"
        supervision_period_agent_pb.full_name = "Officer Paroley"

        supervision_case_type_entry_pb = (
            expected_proto.state_supervision_case_type_entries.add()
        )
        supervision_case_type_entry_pb.state_supervision_case_type_entry_id = (
            "case_type_entry_id"
        )
        supervision_case_type_entry_pb.case_type = "case_type"
        supervision_period_pb.state_supervision_case_type_entry_ids.append(
            "case_type_entry_id"
        )

        supervision_contact_pb = expected_proto.state_supervision_contacts.add()
        supervision_contact_pb.state_supervision_contact_id = "supervision_contact_id"
        supervision_contact_pb.contact_type = "contact_type"
        supervision_contact_pb.contacted_agent_id = "agentPO"
        supervision_period_pb.state_supervision_contact_ids.append(
            "supervision_contact_id"
        )

        supervision_period_pb.state_supervision_violation_entry_ids.append("violation1")
        violation_pb = expected_proto.state_supervision_violations.add()
        violation_pb.state_supervision_violation_id = "violation1"
        violation_pb.is_violent = "false"
        violation_pb.violated_conditions = "cond"
        violation_pb.state_supervision_violation_type_entry_ids.append(
            "violation_type_id"
        )
        violation_type_pb = (
            expected_proto.state_supervision_violation_type_entries.add()
        )
        violation_type_pb.state_supervision_violation_type_entry_id = (
            "violation_type_id"
        )
        violation_type_pb.violation_type = "FELONY"

        violation_pb.state_supervision_violated_condition_entry_ids.append(
            "condition_id"
        )
        violation_type_pb = (
            expected_proto.state_supervision_violated_condition_entries.add()
        )
        violation_type_pb.state_supervision_violated_condition_entry_id = "condition_id"
        violation_type_pb.condition = "CURFEW"

        violation_pb.state_supervision_violation_response_ids.append("response1")
        response_pb = expected_proto.state_supervision_violation_responses.add()
        response_pb.state_supervision_violation_response_id = "response1"
        response_pb.decision_agent_ids.append("agentTERM")
        response_decision_agent_pb = expected_proto.state_agents.add()
        response_decision_agent_pb.state_agent_id = "agentTERM"
        response_decision_agent_pb.full_name = "Officer Termy"
        response_decision_pb = (
            expected_proto.state_supervision_violation_response_decision_entries.add()
        )
        response_decision_pb.state_supervision_violation_response_decision_entry_id = (
            "response_decision_id"
        )
        response_decision_pb.decision = "REVOCATION"
        response_decision_pb.revocation_type = "REINCARCERATION"
        response_pb.state_supervision_violation_response_decision_entry_ids.append(
            "response_decision_id"
        )

        group_pb.state_incarceration_sentence_ids.append("is1")
        incarceration_sentence_pb = expected_proto.state_incarceration_sentences.add()
        incarceration_sentence_pb.state_incarceration_sentence_id = "is1"
        incarceration_sentence_pb.state_early_discharge_ids.append("early_discharge1")
        early_discharge1_pb = expected_proto.state_early_discharges.add()
        early_discharge1_pb.state_early_discharge_id = "early_discharge1"
        incarceration_sentence_pb.state_charge_ids.append("charge1")
        charge1_pb = expected_proto.state_charges.add()
        charge1_pb.state_charge_id = "charge1"
        charge1_pb.classification_type = "F"
        incarceration_sentence_pb.state_incarceration_period_ids.append("ip1")
        incarceration_period_pb = expected_proto.state_incarceration_periods.add()
        incarceration_period_pb.state_incarceration_period_id = "ip1"
        incarceration_period_pb.status = "IN_CUSTODY"
        incarceration_period_pb.specialized_purpose_for_incarceration = (
            "SHOCK INCARCERATION"
        )
        incarceration_period_pb.state_incarceration_incident_ids.append("incident1")
        incident_pb = expected_proto.state_incarceration_incidents.add()
        incident_pb.state_incarceration_incident_id = "incident1"
        incident_pb.incident_type = "FISTICUFFS"
        incarceration_period_pb.state_program_assignment_ids.append("assignment1")

        incident_pb.responding_officer_id = "agent2"
        incident_agent_pb = expected_proto.state_agents.add()
        incident_agent_pb.state_agent_id = "agent2"
        incident_agent_pb.full_name = "Officer Thompson"

        incident_pb.state_incarceration_incident_outcome_ids.append("incident1-1")
        incident_outcome_pb = expected_proto.state_incarceration_incident_outcomes.add()
        incident_outcome_pb.state_incarceration_incident_outcome_id = "incident1-1"
        incident_outcome_pb.outcome_type = "FINE"

        incarceration_period_pb.state_parole_decision_ids.append("decision1")
        decision_pb = expected_proto.state_parole_decisions.add()
        decision_pb.state_parole_decision_id = "decision1"

        decision_pb.decision_agent_ids.append("agent3")
        decision_agent_pb = expected_proto.state_agents.add()
        decision_agent_pb.state_agent_id = "agent3"
        decision_agent_pb.full_name = "Officer Barkley"

        charge1_pb.state_bond_id = "bond1"
        bond_pb = expected_proto.state_bonds.add()
        bond_pb.state_bond_id = "bond1"

        charge2_pb.state_court_case_id = "case1"
        court_case_pb = expected_proto.state_court_cases.add()
        court_case_pb.state_court_case_id = "case1"

        court_case_pb.judge_id = "agentJ"

        expected_info = copy.deepcopy(info)
        # Act & Assert

        proto = ingest_utils.convert_ingest_info_to_proto(info)
        assert expected_proto == proto

        info_back = ingest_utils.convert_proto_to_ingest_info(proto)
        assert info_back == expected_info

        # Assert that none of the proto's collections are empty, i.e. we've
        # tested all of the object graph
        proto_classes = [field.name for field in proto.DESCRIPTOR.fields]
        for cls in proto_classes:
            if cls.startswith("state_"):
                assert proto.__getattribute__(cls)
Esempio n. 7
0
    def test_convert_ingest_info_state_entities(self):
        # Arrange Python ingest info
        info = ingest_info.IngestInfo()
        person = info.create_state_person()
        person.state_person_id = 'person1'
        person.surname = 'testname'

        race = person.create_state_person_race()
        race.state_person_race_id = 'race1'
        race.race = 'white'
        ethnicity = person.create_state_person_ethnicity()
        ethnicity.state_person_ethnicity_id = 'ethnicity1'
        ethnicity.ethnicity = 'non-hispanic'
        external_id = person.create_state_person_external_id()
        external_id.state_person_external_id_id = 'external_id1'
        external_id.id_type = 'contrived'
        alias = person.create_state_alias()
        alias.state_alias_id = 'alias1'
        alias.surname = 'testerson'
        assessment = person.create_state_assessment()
        assessment.state_assessment_id = 'assessment1'
        assessment.assessment_score = '42'
        supervising_officer = person.create_state_agent()
        supervising_officer.state_agent_id = 'supervising_officer1'
        supervising_officer.full_name = 'Officer Supervising'

        assessment_agent = assessment.create_state_agent()
        assessment_agent.state_agent_id = 'agent1'
        assessment_agent.full_name = 'Officer Jones'

        program_assignment = person.create_state_program_assignment()
        program_assignment.state_program_assignment_id = 'assignment1'
        program_assignment.program_id = 'program_id1'

        program_assignment_agent = program_assignment.create_state_agent()
        program_assignment_agent.state_agent_id = 'program_agent1'
        program_assignment_agent.full_name = 'Officer Program'

        group = person.create_state_sentence_group()
        group.state_sentence_group_id = 'group1'

        fine = group.create_state_fine()
        fine.state_fine_id = 'fine1'

        incarceration_sentence = group.create_state_incarceration_sentence()
        incarceration_sentence.state_incarceration_sentence_id = 'is1'
        early_discharge1 = incarceration_sentence.create_state_early_discharge(
        )
        early_discharge1.state_early_discharge_id = 'early_discharge1'
        charge1 = incarceration_sentence.create_state_charge()
        charge1.state_charge_id = 'charge1'
        charge1.classification_type = 'F'
        incarceration_period = incarceration_sentence. \
            create_state_incarceration_period()
        incarceration_period.state_incarceration_period_id = 'ip1'
        incarceration_period.status = 'IN_CUSTODY'
        incarceration_period.specialized_purpose_for_incarceration = \
            'SHOCK INCARCERATION'
        incarceration_period.state_program_assignments = [program_assignment]
        incident = incarceration_period.create_state_incarceration_incident()
        incident.state_incarceration_incident_id = 'incident1'
        incident.incident_type = 'FISTICUFFS'
        incident_outcome = \
            incident.create_state_incarceration_incident_outcome()
        incident_outcome.state_incarceration_incident_outcome_id = 'incident1-1'
        incident_outcome.outcome_type = 'FINE'

        incident_agent = incident.create_state_agent()
        incident_agent.state_agent_id = 'agent2'
        incident_agent.full_name = 'Officer Thompson'

        decision = incarceration_period.create_state_parole_decision()
        decision.state_parole_decision_id = 'decision1'

        decision_agent = decision.create_state_agent()
        decision_agent.state_agent_id = 'agent3'
        decision_agent.full_name = 'Officer Barkley'

        supervision_sentence = group.create_state_supervision_sentence()
        supervision_sentence.state_supervision_sentence_id = 'ss1'
        early_discharge2 = supervision_sentence.create_state_early_discharge()
        early_discharge2.state_early_discharge_id = 'early_discharge2'
        charge2 = supervision_sentence.create_state_charge()
        charge2.state_charge_id = 'charge2'
        charge2.classification_type = 'M'
        supervision_period = supervision_sentence. \
            create_state_supervision_period()
        supervision_period.state_supervision_period_id = 'sp1'
        supervision_period.status = 'TERMINATED'
        supervision_period_agent = supervision_period.create_state_agent()
        supervision_period_agent.state_agent_id = 'agentPO'
        supervision_period_agent.full_name = 'Officer Paroley'
        supervision_period.state_program_assignments = [program_assignment]

        supervision_case_type_entry = supervision_period.create_state_supervision_case_type_entry(
        )
        supervision_case_type_entry.case_type = 'case_type'
        supervision_case_type_entry.state_supervision_case_type_entry_id = 'case_type_entry_id'

        supervision_contact = supervision_period.create_state_supervision_contact(
        )
        supervision_contact.state_supervision_contact_id = 'supervision_contact_id'
        supervision_contact.contact_type = 'contact_type'
        supervision_contacted_agent = supervision_contact.create_state_agent()
        supervision_contacted_agent.state_agent_id = 'agentPO'
        supervision_contacted_agent.full_name = 'Officer Paroley'

        violation = supervision_period.create_state_supervision_violation()
        violation.state_supervision_violation_id = 'violation1'
        violation.violated_conditions = 'cond'
        violation.is_violent = 'false'

        violation_type = violation.\
            create_state_supervision_violation_type_entry()
        violation_type.state_supervision_violation_type_entry_id =\
            'violation_type_id'
        violation_type.violation_type = 'FELONY'

        violated_condition = \
            violation.create_state_supervision_violated_condition_entry()
        violated_condition.state_supervision_violated_condition_entry_id =\
            'condition_id'
        violated_condition.condition = 'CURFEW'

        response = violation.create_state_supervision_violation_response()
        response.state_supervision_violation_response_id = 'response1'
        response_decision_agent = response.create_state_agent()
        response_decision_agent.state_agent_id = 'agentTERM'
        response_decision_agent.full_name = 'Officer Termy'

        response_decision = response.\
            create_state_supervision_violation_response_decision_entry()
        response_decision.\
            state_supervision_violation_response_decision_entry_id =\
            'response_decision_id'
        response_decision.decision = 'REVOCATION'
        response_decision.revocation_type = 'REINCARCERATION'

        bond = charge1.create_state_bond()
        bond.state_bond_id = 'bond1'

        court_case = charge2.create_state_court_case()
        court_case.state_court_case_id = 'case1'

        court_case_agent = court_case.create_state_agent()
        court_case_agent.state_agent_id = 'agentJ'
        court_case_agent.full_name = 'Judge Agent'

        # Arrange Proto ingest info
        expected_proto = ingest_info_pb2.IngestInfo()
        person_pb = expected_proto.state_people.add()
        person_pb.state_person_id = 'person1'
        person_pb.surname = 'testname'

        person_pb.state_person_race_ids.append('race1')
        race_pb = expected_proto.state_person_races.add()
        race_pb.state_person_race_id = 'race1'
        race_pb.race = 'white'
        person_pb.state_person_ethnicity_ids.append('ethnicity1')
        ethnicity_pb = expected_proto.state_person_ethnicities.add()
        ethnicity_pb.state_person_ethnicity_id = 'ethnicity1'
        ethnicity_pb.ethnicity = 'non-hispanic'
        person_pb.state_person_external_ids_ids.append(
            'contrived:external_id1')
        external_id_pb = expected_proto.state_person_external_ids.add()
        external_id_pb.state_person_external_id_id = 'contrived:external_id1'
        external_id_pb.id_type = 'contrived'
        person_pb.state_alias_ids.append('alias1')
        alias_pb = expected_proto.state_aliases.add()
        alias_pb.state_alias_id = 'alias1'
        alias_pb.surname = 'testerson'
        person_pb.state_assessment_ids.append('assessment1')
        assessment_pb = expected_proto.state_assessments.add()
        assessment_pb.state_assessment_id = 'assessment1'
        assessment_pb.assessment_score = '42'
        person_pb.supervising_officer_id = 'supervising_officer1'
        supervising_officer_pb = expected_proto.state_agents.add()
        supervising_officer_pb.state_agent_id = 'supervising_officer1'
        supervising_officer_pb.full_name = 'Officer Supervising'

        assessment_pb.conducting_agent_id = 'agent1'
        assessment_agent_pb = expected_proto.state_agents.add()
        assessment_agent_pb.state_agent_id = 'agent1'
        assessment_agent_pb.full_name = 'Officer Jones'

        person_pb.state_program_assignment_ids.append('assignment1')
        program_assignment_pb = expected_proto.state_program_assignments.add()
        program_assignment_pb.state_program_assignment_id = 'assignment1'
        program_assignment_pb.program_id = 'program_id1'
        program_assignment_pb.referring_agent_id = 'program_agent1'
        program_assignment_agent_pb = expected_proto.state_agents.add()
        program_assignment_agent_pb.state_agent_id = 'program_agent1'
        program_assignment_agent_pb.full_name = 'Officer Program'

        person_pb.state_sentence_group_ids.append('group1')
        group_pb = expected_proto.state_sentence_groups.add()
        group_pb.state_sentence_group_id = 'group1'

        group_pb.state_fine_ids.append('fine1')
        fine_pb = expected_proto.state_fines.add()
        fine_pb.state_fine_id = 'fine1'

        group_pb.state_supervision_sentence_ids.append('ss1')
        supervision_sentence_pb = \
            expected_proto.state_supervision_sentences.add()
        supervision_sentence_pb.state_supervision_sentence_id = 'ss1'
        supervision_sentence_pb.state_early_discharge_ids.append(
            'early_discharge2')
        early_discharge2_pb = expected_proto.state_early_discharges.add()
        early_discharge2_pb.state_early_discharge_id = 'early_discharge2'
        supervision_sentence_pb.state_charge_ids.append('charge2')
        charge2_pb = expected_proto.state_charges.add()
        charge2_pb.state_charge_id = 'charge2'
        charge2_pb.classification_type = 'M'
        supervision_sentence_pb.state_supervision_period_ids.append('sp1')
        supervision_period_pb = expected_proto.state_supervision_periods.add()
        supervision_period_pb.state_supervision_period_id = 'sp1'
        supervision_period_pb.status = 'TERMINATED'
        supervision_period_pb.state_program_assignment_ids.append(
            'assignment1')

        # An ordering requirement in the proto equality check at the end of this
        # test requires that this agent be added after agent1 and before agentPO
        court_case_agent_pb = expected_proto.state_agents.add()
        court_case_agent_pb.state_agent_id = 'agentJ'
        court_case_agent_pb.full_name = 'Judge Agent'

        supervision_period_pb.supervising_officer_id = 'agentPO'
        supervision_period_agent_pb = expected_proto.state_agents.add()
        supervision_period_agent_pb.state_agent_id = 'agentPO'
        supervision_period_agent_pb.full_name = 'Officer Paroley'

        supervision_case_type_entry_pb = expected_proto.state_supervision_case_type_entries.add(
        )
        supervision_case_type_entry_pb.state_supervision_case_type_entry_id = 'case_type_entry_id'
        supervision_case_type_entry_pb.case_type = 'case_type'
        supervision_period_pb.state_supervision_case_type_entry_ids.append(
            'case_type_entry_id')

        supervision_contact_pb = expected_proto.state_supervision_contacts.add(
        )
        supervision_contact_pb.state_supervision_contact_id = 'supervision_contact_id'
        supervision_contact_pb.contact_type = 'contact_type'
        supervision_contact_pb.contacted_agent_id = 'agentPO'
        supervision_period_pb.state_supervision_contact_ids.append(
            'supervision_contact_id')

        supervision_period_pb.state_supervision_violation_entry_ids.append(
            'violation1')
        violation_pb = expected_proto.state_supervision_violations.add()
        violation_pb.state_supervision_violation_id = 'violation1'
        violation_pb.is_violent = 'false'
        violation_pb.violated_conditions = 'cond'
        violation_pb.state_supervision_violation_type_entry_ids.append(
            'violation_type_id')
        violation_type_pb = \
            expected_proto.state_supervision_violation_type_entries.add()
        violation_type_pb.state_supervision_violation_type_entry_id = \
            'violation_type_id'
        violation_type_pb.violation_type = 'FELONY'

        violation_pb.state_supervision_violated_condition_entry_ids.append(
            'condition_id')
        violation_type_pb = \
            expected_proto.state_supervision_violated_condition_entries.add()
        violation_type_pb.state_supervision_violated_condition_entry_id = \
            'condition_id'
        violation_type_pb.condition = 'CURFEW'

        violation_pb.state_supervision_violation_response_ids.append(
            'response1')
        response_pb = expected_proto.state_supervision_violation_responses.add(
        )
        response_pb.state_supervision_violation_response_id = 'response1'
        response_pb.decision_agent_ids.append('agentTERM')
        response_decision_agent_pb = expected_proto.state_agents.add()
        response_decision_agent_pb.state_agent_id = 'agentTERM'
        response_decision_agent_pb.full_name = 'Officer Termy'
        response_decision_pb = \
            expected_proto.\
            state_supervision_violation_response_decision_entries.add()
        response_decision_pb.\
            state_supervision_violation_response_decision_entry_id = \
            'response_decision_id'
        response_decision_pb.decision = 'REVOCATION'
        response_decision_pb.revocation_type = 'REINCARCERATION'
        response_pb.\
            state_supervision_violation_response_decision_entry_ids.append(
                'response_decision_id'
            )

        group_pb.state_incarceration_sentence_ids.append('is1')
        incarceration_sentence_pb = \
            expected_proto.state_incarceration_sentences.add()
        incarceration_sentence_pb.state_incarceration_sentence_id = 'is1'
        incarceration_sentence_pb.state_early_discharge_ids.append(
            'early_discharge1')
        early_discharge1_pb = expected_proto.state_early_discharges.add()
        early_discharge1_pb.state_early_discharge_id = 'early_discharge1'
        incarceration_sentence_pb.state_charge_ids.append('charge1')
        charge1_pb = expected_proto.state_charges.add()
        charge1_pb.state_charge_id = 'charge1'
        charge1_pb.classification_type = 'F'
        incarceration_sentence_pb.state_incarceration_period_ids.append('ip1')
        incarceration_period_pb = \
            expected_proto.state_incarceration_periods.add()
        incarceration_period_pb.state_incarceration_period_id = 'ip1'
        incarceration_period_pb.status = 'IN_CUSTODY'
        incarceration_period_pb.specialized_purpose_for_incarceration = \
            'SHOCK INCARCERATION'
        incarceration_period_pb.state_incarceration_incident_ids \
            .append('incident1')
        incident_pb = expected_proto.state_incarceration_incidents.add()
        incident_pb.state_incarceration_incident_id = 'incident1'
        incident_pb.incident_type = 'FISTICUFFS'
        incarceration_period_pb.state_program_assignment_ids.append(
            'assignment1')

        incident_pb.responding_officer_id = 'agent2'
        incident_agent_pb = expected_proto.state_agents.add()
        incident_agent_pb.state_agent_id = 'agent2'
        incident_agent_pb.full_name = 'Officer Thompson'

        incident_pb.state_incarceration_incident_outcome_ids.append(
            'incident1-1')
        incident_outcome_pb = \
            expected_proto.state_incarceration_incident_outcomes.add()
        incident_outcome_pb.state_incarceration_incident_outcome_id = \
            'incident1-1'
        incident_outcome_pb.outcome_type = 'FINE'

        incarceration_period_pb.state_parole_decision_ids.append('decision1')
        decision_pb = expected_proto.state_parole_decisions.add()
        decision_pb.state_parole_decision_id = 'decision1'

        decision_pb.decision_agent_ids.append('agent3')
        decision_agent_pb = expected_proto.state_agents.add()
        decision_agent_pb.state_agent_id = 'agent3'
        decision_agent_pb.full_name = 'Officer Barkley'

        charge1_pb.state_bond_id = 'bond1'
        bond_pb = expected_proto.state_bonds.add()
        bond_pb.state_bond_id = 'bond1'

        charge2_pb.state_court_case_id = 'case1'
        court_case_pb = expected_proto.state_court_cases.add()
        court_case_pb.state_court_case_id = 'case1'

        court_case_pb.judge_id = 'agentJ'

        expected_info = copy.deepcopy(info)
        # Act & Assert

        proto = ingest_utils.convert_ingest_info_to_proto(info)
        assert expected_proto == proto

        info_back = ingest_utils.convert_proto_to_ingest_info(proto)
        assert info_back == expected_info

        # Assert that none of the proto's collections are empty, i.e. we've
        # tested all of the object graph
        proto_classes = [field.name for field in proto.DESCRIPTOR.fields]
        for cls in proto_classes:
            if cls.startswith('state_'):
                assert proto.__getattribute__(cls)
Esempio n. 8
0
def ingest_info_from_serializable(serializable: Dict[Any, Any]) \
        -> ingest_info.IngestInfo:
    proto = json_format.ParseDict(serializable, ingest_info_pb2.IngestInfo())
    return convert_proto_to_ingest_info(proto)
Esempio n. 9
0
def convert_ingest_info_to_proto(ingest_info_py: ingest_info.IngestInfo) \
        -> ingest_info_pb2.IngestInfo:
    """Converts an ingest_info python object to an ingest info proto."""
    def _process_external_ids(ii: ingest_info.IngestInfo) -> None:
        # As states can have multiple external_ids from different systems, we
        # create new ids that contain type and external_id information so ids
        # from different systems don't collide.
        for p in ii.state_people:
            for ex_id in p.state_person_external_ids:
                id_type = cast(str, ex_id.id_type)
                existing_id = cast(str, ex_id.state_person_external_id_id)
                ex_id.state_person_external_id_id = create_synthetic_id(
                    external_id=existing_id, id_type=id_type)

    _process_external_ids(ingest_info_py)
    proto = ingest_info_pb2.IngestInfo()

    person_map: Dict[str, ingest_info.Person] = {}
    booking_map: Dict[str, ingest_info.Booking] = {}
    charge_map: Dict[str, ingest_info.Charge] = {}
    hold_map: Dict[str, ingest_info.Hold] = {}
    arrest_map: Dict[str, ingest_info.Arrest] = {}
    bond_map: Dict[str, ingest_info.Bond] = {}
    sentence_map: Dict[str, ingest_info.Sentence] = {}

    state_person_map: Dict[str, ingest_info.StatePerson] = {}
    state_person_race_map: Dict[str, ingest_info.StatePersonRace] = {}
    state_person_ethnicity_map: Dict[str,
                                     ingest_info.StatePersonEthnicity] = {}
    state_person_external_id_map: \
        Dict[str, ingest_info.StatePersonExternalId] = {}
    state_alias_map: Dict[str, ingest_info.StateAlias] = {}
    state_assessment_map: Dict[str, ingest_info.StateAssessment] = {}
    state_sentence_group_map: Dict[str, ingest_info.StateSentenceGroup] = {}
    state_supervision_sentence_map: \
        Dict[str, ingest_info.StateSupervisionSentence] = {}
    state_incarceration_sentence_map: \
        Dict[str, ingest_info.StateIncarcerationSentence] = {}
    state_fine_map: Dict[str, ingest_info.StateFine] = {}
    state_charge_map: Dict[str, ingest_info.StateCharge] = {}
    state_court_case_map: Dict[str, ingest_info.StateCourtCase] = {}
    state_bond_map: Dict[str, ingest_info.StateBond] = {}
    state_incarceration_period_map: \
        Dict[str, ingest_info.StateIncarcerationPeriod] = {}
    state_supervision_period_map: \
        Dict[str, ingest_info.StateSupervisionPeriod] = {}
    state_incarceration_incident_map: \
        Dict[str, ingest_info.StateIncarcerationIncident] = {}
    state_incarceration_incident_outcome_map: \
        Dict[str, ingest_info.StateIncarcerationIncidentOutcome] = {}
    state_parole_decision_map: Dict[str, ingest_info.StateParoleDecision] = {}
    state_supervision_violation_map: \
        Dict[str, ingest_info.StateSupervisionViolation] = {}
    state_supervision_violation_response_map: \
        Dict[str, ingest_info.StateSupervisionViolationResponse] = {}
    state_agent_map: Dict[str, ingest_info.StateAgent] = {}

    id_to_generated: Dict[int, str] = {}

    def _populate_proto(proto_name, ingest_info_source, id_name, proto_map):
        """Populates all of the proto fields from an IngestInfo object.

        Args:
            proto_name: The name of the proto we are populating, like 'people',
                'arrests', etc...
            ingest_info_source: The source object we are copying from
            id_name: The name of the id, is 'person_id', 'arrest_id', etc...
                This is used to decide whether or not to generate a new proto,
                use the given id, or generate a new one
            proto_map: A map of protos we have already created to know whether
                we need to go ahead creating one or if we can just return
                the already created one.
        Returns:
            A populated proto
        """
        obj_id = getattr(ingest_info_source, id_name)
        if not obj_id:
            obj_id = id_to_generated.get(id(ingest_info_source)) or \
                     common_utils.create_generated_id()
            id_to_generated[id(ingest_info_source)] = obj_id

        # If we've already seen this id, we don't need to create it, we can
        # simply return it as is.  Not that we use this local in memory
        # proto map so as to avoid using the map provided in proto to make it
        # simpler for external people to read it.  If we decide that no one
        # but us will ever read the proto then we can remove this logic here
        # and use the built in proto map.
        if obj_id in proto_map:
            return proto_map[obj_id]

        proto_to_populate = getattr(proto, proto_name).add()
        setattr(proto_to_populate, id_name, obj_id)
        _copy_fields(ingest_info_source, proto_to_populate,
                     proto_to_populate.DESCRIPTOR)

        proto_map[obj_id] = proto_to_populate
        return proto_to_populate

    def _populate_state_charge_protos(parent_ingest_object, parent_proto):
        """Populates StateCharge proto fields for some parent object,
        e.g. SupervisionSentence and IncarcerationSentence, which both
        reference StateCharge.
        """
        for state_charge in parent_ingest_object.state_charges:
            proto_state_charge = _populate_proto('state_charges', state_charge,
                                                 'state_charge_id',
                                                 state_charge_map)
            parent_proto.state_charge_ids.append(
                proto_state_charge.state_charge_id)

            if state_charge.state_court_case:
                state_court_case = state_charge.state_court_case

                proto_court_case = _populate_proto('state_court_cases',
                                                   state_court_case,
                                                   'state_court_case_id',
                                                   state_court_case_map)
                proto_state_charge.state_court_case_id = \
                    proto_court_case.state_court_case_id

                if state_court_case.judge:
                    proto_judge = _populate_proto('state_agents',
                                                  state_court_case.judge,
                                                  'state_agent_id',
                                                  state_agent_map)
                    proto_court_case.judge_id = \
                        proto_judge.state_agent_id

            if state_charge.state_bond:
                proto_state_bond = _populate_proto('state_bonds',
                                                   state_charge.state_bond,
                                                   'state_bond_id',
                                                   state_bond_map)
                proto_state_charge.state_bond_id = \
                    proto_state_bond.state_bond_id

    def _populate_incarceration_period_protos(parent_ingest_object,
                                              parent_proto):
        """Populates IncarcerationPeriod proto fields for some parent object,
        e.g. SupervisionSentence and IncarcerationSentence, which both
        reference IncarcerationPeriod.
        """
        for incarceration_period in \
                parent_ingest_object.state_incarceration_periods:
            proto_period = _populate_proto('state_incarceration_periods',
                                           incarceration_period,
                                           'state_incarceration_period_id',
                                           state_incarceration_period_map)
            parent_proto.state_incarceration_period_ids.append(
                proto_period.state_incarceration_period_id)

            for incident in incarceration_period.state_incarceration_incidents:
                proto_incident = _populate_proto(
                    'state_incarceration_incidents', incident,
                    'state_incarceration_incident_id',
                    state_incarceration_incident_map)
                if proto_incident.state_incarceration_incident_id not in \
                        proto_period.state_incarceration_incident_ids:
                    proto_period.state_incarceration_incident_ids.append(
                        proto_incident.state_incarceration_incident_id)

                if incident.responding_officer:
                    proto_agent = _populate_proto('state_agents',
                                                  incident.responding_officer,
                                                  'state_agent_id',
                                                  state_agent_map)
                    proto_incident.responding_officer_id = \
                        proto_agent.state_agent_id

                for incident_outcome in \
                        incident.state_incarceration_incident_outcomes:
                    proto_incident_outcome = _populate_proto(
                        'state_incarceration_incident_outcomes',
                        incident_outcome,
                        'state_incarceration_incident_outcome_id',
                        state_incarceration_incident_outcome_map)
                    proto_incident.state_incarceration_incident_outcome_ids \
                        .append(proto_incident_outcome.
                                state_incarceration_incident_outcome_id)

            for decision in incarceration_period.state_parole_decisions:
                proto_decision = _populate_proto('state_parole_decisions',
                                                 decision,
                                                 'state_parole_decision_id',
                                                 state_parole_decision_map)
                proto_period.state_parole_decision_ids.append(
                    proto_decision.state_parole_decision_id)

                for agent in decision.decision_agents:
                    proto_agent = _populate_proto('state_agents', agent,
                                                  'state_agent_id',
                                                  state_agent_map)
                    proto_decision.decision_agent_ids.append(
                        proto_agent.state_agent_id)

            for period_assessment in incarceration_period.state_assessments:
                proto_period_assessment = _populate_proto(
                    'state_assessments', period_assessment,
                    'state_assessment_id', state_assessment_map)
                proto_period.state_assessment_ids.append(
                    proto_period_assessment.state_assessment_id)

                if period_assessment.conducting_agent:
                    proto_agent = _populate_proto(
                        'state_agents', period_assessment.conducting_agent,
                        'state_agent_id', state_agent_map)
                    proto_period_assessment.conducting_agent_id = \
                        proto_agent.state_agent_id

    def _populate_supervision_period_protos(parent_ingest_object,
                                            parent_proto):
        """Populates SupervisionPeriod proto fields for some parent object,
        e.g. SupervisionSentence and IncarcerationSentence, which both
        reference SupervisionPeriod.
        """
        for supervision_period in \
                parent_ingest_object.state_supervision_periods:
            proto_period = _populate_proto('state_supervision_periods',
                                           supervision_period,
                                           'state_supervision_period_id',
                                           state_supervision_period_map)
            parent_proto.state_supervision_period_ids.append(
                proto_period.state_supervision_period_id)

            for violation in supervision_period.state_supervision_violations:
                proto_violation = _populate_proto(
                    'state_supervision_violations', violation,
                    'state_supervision_violation_id',
                    state_supervision_violation_map)
                proto_period.state_supervision_violation_ids.append(
                    proto_violation.state_supervision_violation_id)

                for response in violation.state_supervision_violation_responses:
                    proto_response = _populate_proto(
                        'state_supervision_violation_responses', response,
                        'state_supervision_violation_response_id',
                        state_supervision_violation_response_map)
                    proto_violation.state_supervision_violation_response_ids \
                        .append(proto_response.
                                state_supervision_violation_response_id)

            for period_assessment in supervision_period.state_assessments:
                proto_period_assessment = _populate_proto(
                    'state_assessments', period_assessment,
                    'state_assessment_id', state_assessment_map)
                proto_period.state_assessment_ids.append(
                    proto_period_assessment.state_assessment_id)

                if period_assessment.conducting_agent:
                    proto_agent = _populate_proto(
                        'state_agents', period_assessment.conducting_agent,
                        'state_agent_id', state_agent_map)
                    proto_period_assessment.conducting_agent_id = \
                        proto_agent.state_agent_id

    for person in ingest_info_py.people:
        proto_person = _populate_proto('people', person, 'person_id',
                                       person_map)
        for booking in person.bookings:
            proto_booking = _populate_proto('bookings', booking, 'booking_id',
                                            booking_map)
            # Can safely append the ids now since they should be unique.
            proto_person.booking_ids.append(proto_booking.booking_id)

            if booking.arrest:
                proto_arrest = _populate_proto('arrests', booking.arrest,
                                               'arrest_id', arrest_map)
                proto_booking.arrest_id = proto_arrest.arrest_id

            for hold in booking.holds:
                proto_hold = _populate_proto('holds', hold, 'hold_id',
                                             hold_map)
                proto_booking.hold_ids.append(proto_hold.hold_id)

            for charge in booking.charges:
                proto_charge = _populate_proto('charges', charge, 'charge_id',
                                               charge_map)
                proto_booking.charge_ids.append(proto_charge.charge_id)

                if charge.bond:
                    proto_bond = _populate_proto('bonds', charge.bond,
                                                 'bond_id', bond_map)
                    proto_charge.bond_id = proto_bond.bond_id

                if charge.sentence:
                    proto_sentence = _populate_proto('sentences',
                                                     charge.sentence,
                                                     'sentence_id',
                                                     sentence_map)
                    proto_charge.sentence_id = proto_sentence.sentence_id

    for state_person in ingest_info_py.state_people:
        proto_state_person = _populate_proto('state_people', state_person,
                                             'state_person_id',
                                             state_person_map)

        for race in state_person.state_person_races:
            proto_race = _populate_proto('state_person_races', race,
                                         'state_person_race_id',
                                         state_person_race_map)
            proto_state_person.state_person_race_ids.append(
                proto_race.state_person_race_id)

        for ethnicity in state_person.state_person_ethnicities:
            proto_ethnicity = _populate_proto('state_person_ethnicities',
                                              ethnicity,
                                              'state_person_ethnicity_id',
                                              state_person_ethnicity_map)
            proto_state_person.state_person_ethnicity_ids.append(
                proto_ethnicity.state_person_ethnicity_id)

        for external_id in state_person.state_person_external_ids:
            proto_external_id = _populate_proto('state_person_external_ids',
                                                external_id,
                                                'state_person_external_id_id',
                                                state_person_external_id_map)
            proto_state_person.state_person_external_ids_ids.append(
                proto_external_id.state_person_external_id_id)

        for alias in state_person.state_aliases:
            proto_alias = _populate_proto('state_aliases', alias,
                                          'state_alias_id', state_alias_map)
            proto_state_person.state_alias_ids.append(
                proto_alias.state_alias_id)

        for assessment in state_person.state_assessments:
            proto_assessment = _populate_proto('state_assessments', assessment,
                                               'state_assessment_id',
                                               state_assessment_map)
            proto_state_person.state_assessment_ids.append(
                proto_assessment.state_assessment_id)

            if assessment.conducting_agent:
                proto_agent = _populate_proto('state_agents',
                                              assessment.conducting_agent,
                                              'state_agent_id',
                                              state_agent_map)
                proto_assessment.conducting_agent_id = \
                    proto_agent.state_agent_id

        for sentence_group in state_person.state_sentence_groups:
            proto_sentence_group = _populate_proto('state_sentence_groups',
                                                   sentence_group,
                                                   'state_sentence_group_id',
                                                   state_sentence_group_map)
            proto_state_person.state_sentence_group_ids.append(
                proto_sentence_group.state_sentence_group_id)

            for supervision_sentence in \
                    sentence_group.state_supervision_sentences:
                proto_supervision_sentence = _populate_proto(
                    'state_supervision_sentences', supervision_sentence,
                    'state_supervision_sentence_id',
                    state_supervision_sentence_map)
                proto_sentence_group.state_supervision_sentence_ids.append(
                    proto_supervision_sentence.state_supervision_sentence_id)

                _populate_state_charge_protos(supervision_sentence,
                                              proto_supervision_sentence)

                _populate_incarceration_period_protos(
                    supervision_sentence, proto_supervision_sentence)

                _populate_supervision_period_protos(
                    supervision_sentence, proto_supervision_sentence)

            for incarceration_sentence in \
                    sentence_group.state_incarceration_sentences:
                proto_incarceration_sentence = _populate_proto(
                    'state_incarceration_sentences', incarceration_sentence,
                    'state_incarceration_sentence_id',
                    state_incarceration_sentence_map)
                proto_sentence_group.state_incarceration_sentence_ids \
                    .append(proto_incarceration_sentence
                            .state_incarceration_sentence_id)

                _populate_state_charge_protos(incarceration_sentence,
                                              proto_incarceration_sentence)

                _populate_incarceration_period_protos(
                    incarceration_sentence, proto_incarceration_sentence)

                _populate_supervision_period_protos(
                    incarceration_sentence, proto_incarceration_sentence)

            for fine in sentence_group.state_fines:
                proto_fine = _populate_proto('state_fines', fine,
                                             'state_fine_id', state_fine_map)
                proto_sentence_group.state_fine_ids.append(
                    proto_fine.state_fine_id)

                _populate_state_charge_protos(fine, proto_fine)

    return proto
Esempio n. 10
0
    def test_convert_ingest_info_duplicate_incarceration_incidents(self):
        # Arrange Python ingest info
        info = ingest_info.IngestInfo()
        person = info.create_state_person()
        person.state_person_id = 'person1'
        person.surname = 'testname'

        group = person.create_state_sentence_group()
        group.state_sentence_group_id = 'group1'

        incarceration_sentence = group.create_state_incarceration_sentence()
        incarceration_sentence.state_incarceration_sentence_id = 'is1'
        incarceration_period = incarceration_sentence. \
            create_state_incarceration_period()
        incarceration_period.state_incarceration_period_id = 'ip1'
        incarceration_period.status = 'IN_CUSTODY'

        incident = incarceration_period.create_state_incarceration_incident()
        incident.state_incarceration_incident_id = 'incident1'
        incident.incident_type = 'FISTICUFFS'
        incident_outcome = \
            incident.create_state_incarceration_incident_outcome()
        incident_outcome.state_incarceration_incident_outcome_id = 'incident1-1'
        incident_outcome.outcome_type = 'FINE'

        incident_dup = \
            incarceration_period.create_state_incarceration_incident()
        incident_dup.state_incarceration_incident_id = 'incident1'
        incident_dup.incident_type = 'FISTICUFFS'
        incident_outcome_2 = \
            incident_dup.create_state_incarceration_incident_outcome()
        incident_outcome_2.state_incarceration_incident_outcome_id = \
            'incident1-2'
        incident_outcome_2.outcome_type = 'FINE'

        # Arrange Proto ingest info
        expected_proto = ingest_info_pb2.IngestInfo()
        pb_person = expected_proto.state_people.add()
        pb_person.state_person_id = 'person1'
        pb_person.surname = 'testname'
        pb_person.state_sentence_group_ids.append('group1')
        pb_group = expected_proto.state_sentence_groups.add()
        pb_group.state_sentence_group_id = 'group1'
        pb_group.state_incarceration_sentence_ids.append('is1')

        pb_incarceration_sentence = \
            expected_proto.state_incarceration_sentences.add()
        pb_incarceration_sentence.state_incarceration_sentence_id = 'is1'
        pb_incarceration_sentence.state_incarceration_period_ids.append('ip1')
        pb_incarceration_period = \
            expected_proto.state_incarceration_periods.add()
        pb_incarceration_period.state_incarceration_period_id = 'ip1'
        pb_incarceration_period.status = 'IN_CUSTODY'
        pb_incarceration_period.state_incarceration_incident_ids \
            .append('incident1')

        pb_incident = expected_proto.state_incarceration_incidents.add()
        pb_incident.state_incarceration_incident_id = 'incident1'
        pb_incident.incident_type = 'FISTICUFFS'

        pb_incident.state_incarceration_incident_outcome_ids.append(
            'incident1-1')
        pb_incident_outcome = \
            expected_proto.state_incarceration_incident_outcomes.add()
        pb_incident_outcome.state_incarceration_incident_outcome_id = \
            'incident1-1'
        pb_incident_outcome.outcome_type = 'FINE'

        pb_incident.state_incarceration_incident_outcome_ids.append(
            'incident1-2')
        pb_incident_outcome = \
            expected_proto.state_incarceration_incident_outcomes.add()
        pb_incident_outcome.state_incarceration_incident_outcome_id = \
            'incident1-2'
        pb_incident_outcome.outcome_type = 'FINE'

        # Act & Assert
        proto = ingest_utils.convert_ingest_info_to_proto(info)
        assert expected_proto == proto

        # Duplicate IncarcerationIncident is gone.
        info_back = ingest_utils.convert_proto_to_ingest_info(proto)
        incarceration_period.state_incarceration_incidents = [incident]
        incident.state_incarceration_incident_outcomes = [
            incident_outcome, incident_outcome_2
        ]

        assert info_back == info