Exemple #1
0
def admission_event_for_period(
    incarceration_sentences: List[StateIncarcerationSentence],
    supervision_sentences: List[StateSupervisionSentence],
    incarceration_period: StateIncarcerationPeriod,
    county_of_residence: Optional[str]
) -> Optional[IncarcerationAdmissionEvent]:
    """Returns an IncarcerationAdmissionEvent if this incarceration period represents an admission to incarceration."""

    admission_date = incarceration_period.admission_date
    admission_reason = incarceration_period.admission_reason
    supervision_type_at_admission = get_pre_incarceration_supervision_type(
        incarceration_sentences, supervision_sentences, incarceration_period)
    specialized_purpose_for_incarceration = incarceration_period.specialized_purpose_for_incarceration

    if admission_date and admission_reason:
        admission_reason = state_specific_admission_reason_override(
            incarceration_period.state_code, admission_reason,
            supervision_type_at_admission)
        return IncarcerationAdmissionEvent(
            state_code=incarceration_period.state_code,
            event_date=admission_date,
            facility=incarceration_period.facility,
            admission_reason=admission_reason,
            admission_reason_raw_text=incarceration_period.
            admission_reason_raw_text,
            supervision_type_at_admission=supervision_type_at_admission,
            specialized_purpose_for_incarceration=
            specialized_purpose_for_incarceration,
            county_of_residence=county_of_residence,
        )

    return None
Exemple #2
0
def release_event_for_period(
    incarceration_sentences: List[StateIncarcerationSentence],
    supervision_sentences: List[StateSupervisionSentence],
    incarceration_period: StateIncarcerationPeriod,
    county_of_residence: Optional[str],
) -> Optional[IncarcerationReleaseEvent]:
    """Returns an IncarcerationReleaseEvent if this incarceration period represents an release from incarceration."""
    release_date = incarceration_period.release_date
    release_reason = incarceration_period.release_reason
    purpose_for_incarceration = (
        incarceration_period.specialized_purpose_for_incarceration)

    supervision_type_at_admission = get_pre_incarceration_supervision_type(
        incarceration_sentences, supervision_sentences, incarceration_period)

    admission_reason = None
    if incarceration_period.admission_reason:
        admission_reason = state_specific_incarceration_admission_reason_override(
            incarceration_period.state_code,
            incarceration_period.admission_reason,
            supervision_type_at_admission,
        )

    if release_date and release_reason:
        supervision_type_at_release = get_post_incarceration_supervision_type(
            incarceration_sentences, supervision_sentences,
            incarceration_period)

        total_days_incarcerated = None

        if incarceration_period.admission_date:
            total_days_incarcerated = (
                release_date - incarceration_period.admission_date).days

            if total_days_incarcerated < 0:
                logging.warning(
                    "release_date before admission_date on incarceration period: %s",
                    incarceration_period,
                )
                total_days_incarcerated = 0

        return IncarcerationReleaseEvent(
            state_code=incarceration_period.state_code,
            event_date=release_date,
            facility=incarceration_period.facility,
            release_reason=release_reason,
            release_reason_raw_text=incarceration_period.
            release_reason_raw_text,
            purpose_for_incarceration=purpose_for_incarceration,
            county_of_residence=county_of_residence,
            supervision_type_at_release=supervision_type_at_release,
            admission_reason=admission_reason,
            total_days_incarcerated=total_days_incarcerated,
        )

    return None
Exemple #3
0
def find_incarceration_stays(
        incarceration_sentences: List[StateIncarcerationSentence],
        supervision_sentences: List[StateSupervisionSentence],
        incarceration_period: StateIncarcerationPeriod,
        county_of_residence: Optional[str]) -> List[IncarcerationStayEvent]:
    """Finds all days for which this person was incarcerated."""
    incarceration_stay_events: List[IncarcerationStayEvent] = []

    admission_date = incarceration_period.admission_date
    release_date = incarceration_period.release_date

    if release_date is None:
        if incarceration_period.status != StateIncarcerationPeriodStatus.IN_CUSTODY:
            # This should not happen after validation.
            raise ValueError(
                "Unexpected missing release date. _infer_missing_dates_and_statuses is not properly"
                " setting missing dates.")

        # This person is in custody for this period. Set the release date for tomorrow.
        release_date = date.today() + relativedelta(days=1)

    if admission_date is None:
        return incarceration_stay_events

    supervision_type_at_admission = get_pre_incarceration_supervision_type(
        incarceration_sentences, supervision_sentences, incarceration_period)

    sentence_group = _get_sentence_group_for_incarceration_period(
        incarceration_period)

    stay_date = admission_date

    while stay_date < release_date:
        most_serious_charge = find_most_serious_prior_charge_in_sentence_group(
            sentence_group, stay_date)
        most_serious_offense_ncic_code = most_serious_charge.ncic_code if most_serious_charge else None
        most_serious_offense_statute = most_serious_charge.statute if most_serious_charge else None

        incarceration_stay_events.append(
            IncarcerationStayEvent(
                state_code=incarceration_period.state_code,
                event_date=stay_date,
                facility=incarceration_period.facility,
                county_of_residence=county_of_residence,
                most_serious_offense_ncic_code=most_serious_offense_ncic_code,
                most_serious_offense_statute=most_serious_offense_statute,
                admission_reason=incarceration_period.admission_reason,
                admission_reason_raw_text=incarceration_period.
                admission_reason_raw_text,
                supervision_type_at_admission=supervision_type_at_admission,
            ))

        stay_date = stay_date + relativedelta(days=1)

    return incarceration_stay_events
Exemple #4
0
def find_incarceration_stays(
        incarceration_sentences: List[StateIncarcerationSentence],
        supervision_sentences: List[StateSupervisionSentence],
        incarceration_period: StateIncarcerationPeriod,
        original_admission_reasons_by_period_id: Dict[int, Tuple[
            StateIncarcerationPeriodAdmissionReason, Optional[str]]],
        incarceration_period_to_judicial_district: Dict[int, Dict[Any, Any]],
        county_of_residence: Optional[str]) -> List[IncarcerationStayEvent]:
    """Finds all days for which this person was incarcerated."""
    incarceration_stay_events: List[IncarcerationStayEvent] = []

    admission_date = incarceration_period.admission_date
    release_date = incarceration_period.release_date

    if release_date is None:
        if incarceration_period.status != StateIncarcerationPeriodStatus.IN_CUSTODY:
            # This should not happen after validation.
            raise ValueError(
                "Unexpected missing release date. _infer_missing_dates_and_statuses is not properly"
                " setting missing dates.")

        # This person is in custody for this period. Set the release date for tomorrow.
        release_date = date.today() + relativedelta(days=1)

    if admission_date is None:
        return incarceration_stay_events

    supervision_type_at_admission = get_pre_incarceration_supervision_type(
        incarceration_sentences, supervision_sentences, incarceration_period)

    sentence_group = _get_sentence_group_for_incarceration_period(
        incarceration_period)
    judicial_district_code = _get_judicial_district_code(
        incarceration_period, incarceration_period_to_judicial_district)

    stay_date = admission_date

    incarceration_period_id = incarceration_period.incarceration_period_id

    if not incarceration_period_id:
        raise ValueError(
            "Unexpected incarceration period without an incarceration_period_id."
        )

    original_admission_reason, original_admission_reason_raw_text = \
        original_admission_reasons_by_period_id[incarceration_period_id]

    original_admission_reason = state_specific_admission_reason_override(
        incarceration_period.state_code, original_admission_reason,
        supervision_type_at_admission)

    while stay_date < release_date:
        most_serious_charge = find_most_serious_prior_charge_in_sentence_group(
            sentence_group, stay_date)
        most_serious_offense_ncic_code = most_serious_charge.ncic_code if most_serious_charge else None
        most_serious_offense_statute = most_serious_charge.statute if most_serious_charge else None

        incarceration_stay_events.append(
            IncarcerationStayEvent(
                state_code=incarceration_period.state_code,
                event_date=stay_date,
                facility=incarceration_period.facility,
                county_of_residence=county_of_residence,
                most_serious_offense_ncic_code=most_serious_offense_ncic_code,
                most_serious_offense_statute=most_serious_offense_statute,
                admission_reason=original_admission_reason,
                admission_reason_raw_text=original_admission_reason_raw_text,
                supervision_type_at_admission=supervision_type_at_admission,
                judicial_district_code=judicial_district_code,
                specialized_purpose_for_incarceration=incarceration_period.
                specialized_purpose_for_incarceration))

        stay_date = stay_date + relativedelta(days=1)

    return incarceration_stay_events