def testFindReleaseEventsByCohortYear_collapseTemporaryCustodyAndRevocation(self): """Tests the find_release_events_by_cohort_year function where a temporary custody incarceration period is followed by a revocation period. In this test case the person did recidivate. """ initial_incarceration_period = StateIncarcerationPeriod.new_with_defaults( incarceration_period_id=1111, external_id='1', incarceration_type=StateIncarcerationType.STATE_PRISON, status=StateIncarcerationPeriodStatus.NOT_IN_CUSTODY, state_code='TX', admission_date=date(2008, 11, 20), admission_reason=AdmissionReason.NEW_ADMISSION, release_date=date(2010, 12, 4), release_reason=ReleaseReason.SENTENCE_SERVED) temporary_custody_reincarceration = StateIncarcerationPeriod.new_with_defaults( incarceration_period_id=2222, external_id='2', incarceration_type=StateIncarcerationType.STATE_PRISON, status=StateIncarcerationPeriodStatus.NOT_IN_CUSTODY, state_code='TX', admission_date=date(2011, 4, 5), admission_reason=AdmissionReason.TEMPORARY_CUSTODY, release_date=date(2014, 4, 14), release_reason=ReleaseReason.RELEASED_FROM_TEMPORARY_CUSTODY) revocation_incarceration_period = StateIncarcerationPeriod.new_with_defaults( incarceration_period_id=3333, external_id='3', incarceration_type=StateIncarcerationType.STATE_PRISON, status=StateIncarcerationPeriodStatus.IN_CUSTODY, state_code='TX', admission_date=date(2014, 4, 14), admission_reason=AdmissionReason.PROBATION_REVOCATION) incarceration_periods = [ initial_incarceration_period, temporary_custody_reincarceration, revocation_incarceration_period] release_events_by_cohort = identifier.find_release_events_by_cohort_year( incarceration_periods, _COUNTY_OF_RESIDENCE) self.assertEqual(1, len(release_events_by_cohort)) self.assertCountEqual( [RecidivismReleaseEvent( state_code='TX', original_admission_date=initial_incarceration_period.admission_date, release_date=initial_incarceration_period.release_date, release_facility=None, reincarceration_date=temporary_custody_reincarceration.admission_date, reincarceration_facility=None, county_of_residence=_COUNTY_OF_RESIDENCE, from_supervision_type=StateSupervisionPeriodSupervisionType.PROBATION, return_type=ReincarcerationReturnType.REVOCATION)], release_events_by_cohort[2010])
def test_find_release_events_by_cohort_year_sentence_served_prob_rev(self): """Tests the find_release_events_by_cohort_year function path where the person served their first sentence, then later returned on a probation revocation.""" initial_incarceration_period = \ StateIncarcerationPeriod.new_with_defaults( incarceration_period_id=1111, incarceration_type=StateIncarcerationType.STATE_PRISON, status=StateIncarcerationPeriodStatus.NOT_IN_CUSTODY, state_code='TX', admission_date=date(2008, 11, 20), admission_reason=AdmissionReason.NEW_ADMISSION, release_date=date(2010, 12, 4), release_reason=ReleaseReason.SENTENCE_SERVED) first_reincarceration_period = \ StateIncarcerationPeriod.new_with_defaults( incarceration_period_id=2222, incarceration_type=StateIncarcerationType.STATE_PRISON, status=StateIncarcerationPeriodStatus.NOT_IN_CUSTODY, state_code='TX', admission_date=date(2011, 4, 5), admission_reason=AdmissionReason.PROBATION_REVOCATION, release_date=date(2014, 4, 14), release_reason=ReleaseReason.SENTENCE_SERVED) incarceration_periods = [initial_incarceration_period, first_reincarceration_period] release_events_by_cohort = \ identifier.find_release_events_by_cohort_year( incarceration_periods=incarceration_periods, county_of_residence=_COUNTY_OF_RESIDENCE) assert len(release_events_by_cohort) == 2 assert release_events_by_cohort[2010] == [RecidivismReleaseEvent( state_code='TX', original_admission_date=initial_incarceration_period.admission_date, release_date=initial_incarceration_period.release_date, release_facility=None, reincarceration_date=first_reincarceration_period.admission_date, reincarceration_facility=None, county_of_residence=_COUNTY_OF_RESIDENCE, return_type=ReincarcerationReturnType.REVOCATION, from_supervision_type=StateSupervisionPeriodSupervisionType. PROBATION)] assert release_events_by_cohort[2014] == [ NonRecidivismReleaseEvent( state_code='TX', original_admission_date=first_reincarceration_period. admission_date, release_date=first_reincarceration_period.release_date, county_of_residence=_COUNTY_OF_RESIDENCE, release_facility=None)]
def for_intermediate_incarceration_period( state_code: str, admission_date: date, release_date: date, release_facility: Optional[str], county_of_residence: Optional[str], reincarceration_date: date, reincarceration_facility: Optional[str], reincarceration_admission_reason: AdmissionReason, source_supervision_violation_response: Optional[StateSupervisionViolationResponse]) -> \ Optional[ReleaseEvent]: """Returns the ReleaseEvent relevant to an intermediate StateIncarcerationPeriod. If this is not the person's last StateIncarcerationPeriod and they have been released, there is probably an instance of recidivism to count. Args: state_code: state where the incarceration takes place admission_date: when the StateIncarcerationPeriod started release_date: when they were released from the StateIncarcerationPeriod release_facility: the facility they were released from on the StateIncarcerationPeriod reincarceration_date: date they were admitted to the subsequent StateIncarcerationPeriod county_of_residence: the county that the incarcerated person lives in (prior to incarceration). reincarceration_facility: facility in which the subsequent StateIncarcerationPeriod started reincarceration_admission_reason: reason they were admitted to the subsequent StateIncarcerationPeriod source_supervision_violation_response: the response to a supervision violation that resulted in the reincarceration Returns: A ReleaseEvent. """ return_type = get_return_type(reincarceration_admission_reason) from_supervision_type = get_from_supervision_type( reincarceration_admission_reason) source_violation_type = get_source_violation_type( source_supervision_violation_response) # This is a new admission recidivism event. Return it. return RecidivismReleaseEvent( state_code=state_code, original_admission_date=admission_date, release_date=release_date, release_facility=release_facility, county_of_residence=county_of_residence, reincarceration_date=reincarceration_date, reincarceration_facility=reincarceration_facility, return_type=return_type, from_supervision_type=from_supervision_type, source_violation_type=source_violation_type)
def test_find_release_events_by_cohort_year_cond_release_new_admit(self): """Tests the find_release_events_by_cohort_year function path where the person was conditionally released on parole but returned as a new admission.""" initial_incarceration_period = \ StateIncarcerationPeriod.new_with_defaults( incarceration_period_id=1111, incarceration_type=StateIncarcerationType.STATE_PRISON, status=StateIncarcerationPeriodStatus.NOT_IN_CUSTODY, state_code='TX', admission_date=date(2008, 11, 20), admission_reason=AdmissionReason.NEW_ADMISSION, release_date=date(2010, 12, 4), release_reason=ReleaseReason.CONDITIONAL_RELEASE) first_reincarceration_period = \ StateIncarcerationPeriod.new_with_defaults( incarceration_period_id=2222, incarceration_type=StateIncarcerationType.STATE_PRISON, status=StateIncarcerationPeriodStatus.NOT_IN_CUSTODY, state_code='TX', admission_date=date(2011, 4, 5), admission_reason=AdmissionReason.NEW_ADMISSION, release_date=date(2014, 4, 14), release_reason=ReleaseReason.SENTENCE_SERVED) incarceration_periods = [initial_incarceration_period, first_reincarceration_period] release_events_by_cohort = \ identifier.find_release_events_by_cohort_year( incarceration_periods=incarceration_periods, county_of_residence=_COUNTY_OF_RESIDENCE) assert len(release_events_by_cohort) == 2 assert release_events_by_cohort[2010] == [RecidivismReleaseEvent( state_code='TX', original_admission_date=initial_incarceration_period.admission_date, release_date=initial_incarceration_period.release_date, release_facility=None, reincarceration_date=first_reincarceration_period.admission_date, reincarceration_facility=None, county_of_residence=_COUNTY_OF_RESIDENCE, return_type=ReincarcerationReturnType.NEW_ADMISSION)] assert release_events_by_cohort[2014] == [ NonRecidivismReleaseEvent( state_code='TX', original_admission_date=first_reincarceration_period. admission_date, release_date=first_reincarceration_period.release_date, county_of_residence=_COUNTY_OF_RESIDENCE, release_facility=None)]
def test_find_release_events_by_cohort_year(self): """Tests the find_release_events_by_cohort_year function path where the person did recidivate.""" initial_incarceration_period = \ StateIncarcerationPeriod.new_with_defaults( incarceration_period_id=1111, incarceration_type=StateIncarcerationType.STATE_PRISON, status=StateIncarcerationPeriodStatus.NOT_IN_CUSTODY, state_code='TX', admission_date=date(2008, 11, 20), admission_reason=AdmissionReason.NEW_ADMISSION, release_date=date(2010, 12, 4), release_reason=ReleaseReason.SENTENCE_SERVED) first_reincarceration_period = \ StateIncarcerationPeriod.new_with_defaults( incarceration_period_id=2222, incarceration_type=StateIncarcerationType.STATE_PRISON, status=StateIncarcerationPeriodStatus.NOT_IN_CUSTODY, state_code='TX', admission_date=date(2011, 4, 5), admission_reason=AdmissionReason.NEW_ADMISSION, release_date=date(2014, 4, 14), release_reason=ReleaseReason.SENTENCE_SERVED) subsequent_reincarceration_period = \ StateIncarcerationPeriod.new_with_defaults( incarceration_period_id=3333, incarceration_type=StateIncarcerationType.STATE_PRISON, status=StateIncarcerationPeriodStatus.IN_CUSTODY, state_code='TX', admission_date=date(2017, 1, 4), admission_reason=AdmissionReason.NEW_ADMISSION) incarceration_periods = [ initial_incarceration_period, first_reincarceration_period, subsequent_reincarceration_period ] release_events_by_cohort = \ identifier.find_release_events_by_cohort_year( incarceration_periods, _COUNTY_OF_RESIDENCE) self.assertEqual(2, len(release_events_by_cohort)) self.assertCountEqual([ RecidivismReleaseEvent( state_code='TX', original_admission_date=initial_incarceration_period. admission_date, release_date=initial_incarceration_period.release_date, release_facility=None, reincarceration_date=first_reincarceration_period. admission_date, reincarceration_facility=None, county_of_residence=_COUNTY_OF_RESIDENCE, return_type=ReincarcerationReturnType.NEW_ADMISSION) ], release_events_by_cohort[2010]) self.assertCountEqual([ RecidivismReleaseEvent( state_code='TX', original_admission_date=first_reincarceration_period. admission_date, release_date=first_reincarceration_period.release_date, release_facility=None, reincarceration_date=subsequent_reincarceration_period. admission_date, reincarceration_facility=None, county_of_residence=_COUNTY_OF_RESIDENCE, return_type=ReincarcerationReturnType.NEW_ADMISSION) ], release_events_by_cohort[2014])