def set_date_specific_lsir_fields(
        assessment: StateAssessment) -> StateAssessment:
    """Over time, US_PA has updated the mapping between an LSIR score and the associated assessment level. This function
    sets the appropriate assessment_level and assessment_score according to the score and the date of the |assessment|,
    as defined by _DATE_SPECIFIC_ORDERED_LSIR_LEVELS.

    Returns the updated StateAssessment object.
    """
    if not assessment.assessment_score:
        return assessment

    assessment_score = parse_int(assessment.assessment_score)

    if assessment_score == 60:
        # This value indicates the scoring was not completed
        assessment.assessment_score = None
        assessment.assessment_level = "UNKNOWN (60-ATTEMPTED_INCOMPLETE)"
    elif assessment_score == 70:
        # This person either refused to be assessed or did not need to be assessed because they chose not to be released
        # onto parole
        assessment.assessment_score = None
        assessment.assessment_level = "UNKNOWN (70-REFUSED)"
    elif assessment_score > 55:
        # Assessment score number is over the max value of 54, and isn't one of the expected special-case
        # codes (60, 70, 55)
        assessment.assessment_level = f"UNKNOWN ({assessment_score}-SCORE_OUT_OF_RANGE)"
        assessment.assessment_score = None
    else:
        if assessment_score == 55:
            # This should be treated as a 54
            assessment_score = 54
            assessment.assessment_score = "54"

        assessment_date_raw = assessment.assessment_date
        assessment_date = (str_field_utils.parse_date(assessment_date_raw)
                           if assessment_date_raw else None)

        if not assessment_date:
            # At this point we need a valid assessment_date to determine the date-specific LSIR level
            assessment.assessment_level = "UNKNOWN (NO_DATE)"
            return assessment
        for cutoff_date, score_level_map in _DATE_SPECIFIC_ORDERED_LSIR_LEVELS.items(
        ):
            if assessment_date <= cutoff_date:
                for cutoff_score, level in score_level_map.items():
                    if assessment_score <= cutoff_score:
                        assessment.assessment_level = level.value
                        return assessment

        raise ValueError(
            f"Unhandled assessment_score {assessment_score} with assessment_date {assessment_date}"
        )

    return assessment
Esempio n. 2
0
    def _convert_charges(self, ingest_charges) -> List[entities.Charge]:
        """Converts all ingest_info proto Charges to persistence entity Charges.

        When charges.number_of_counts is set, create duplicate charges for the
        persistence entity.
        """
        charges: List[entities.Charge] = []
        for ingest_charge in ingest_charges:
            new_charge = self._convert_charge(ingest_charge)
            number_of_counts = parse_int(ingest_charge.number_of_counts) if \
                ingest_charge.HasField('number_of_counts') else 1
            charges.extend(
                _duplicate_charge_with_counts(new_charge, number_of_counts))

        return charges
Esempio n. 3
0
    def convert_field_value(field: attr.Attribute,
                            field_value: Union[str, EnumParser]) -> Any:
        if field_value is None:
            return None

        if is_forward_ref(field) or is_list(field):
            return field_value

        if isinstance(field_value, str):
            if not field_value or not field_value.strip():
                return None

        if field.name in converter_overrides:
            converter = converter_overrides[field.name]
            if not isinstance(field_value, converter.field_type):
                raise ValueError(
                    f"Found converter for field [{field.name}] in the converter_overrides, but expected "
                    f"field type [{converter.field_type}] does not match actual field type "
                    f"[{type(field_value)}]")
            return converter.convert(field_value)

        if isinstance(field_value, EnumParser):
            if is_enum(field):
                return field_value.parse()
            raise ValueError(
                f"Found field value [{field_value}] for field that is not an enum [{field}]."
            )

        if isinstance(field_value, str):
            if is_str(field):
                return normalize(field_value)
            if is_date(field):
                return parse_date(field_value)
            if is_int(field):
                return parse_int(field_value)
            if field.type in {bool, Union[bool, None]}:
                return parse_bool(field_value)

        raise ValueError(f"Unsupported field {field.name}")
Esempio n. 4
0
 def test_parseInt_invalidStr(self):
     with pytest.raises(ValueError):
         parse_int('hello')
Esempio n. 5
0
 def test_parseInt_floatProvided(self):
     assert parse_int('123.6') == 123
Esempio n. 6
0
 def test_parseInt(self):
     assert parse_int('123') == 123
 def test_parseInt_invalidStr(self) -> None:
     with pytest.raises(ValueError):
         parse_int("hello")
 def test_parseInt_floatProvided(self) -> None:
     assert parse_int("123.6") == 123
 def test_parseInt(self) -> None:
     assert parse_int("123") == 123