def _traffic_crime(statute, level, disposition):
     chapter = statute[:3]
     if chapter.isdigit():
         statute_range = range(801, 826)
         chapter_num = int(chapter)
         if chapter_num == 813:
             if ChargeClassifier._is_dimissed(disposition):
                 question_string = "Was the charge dismissed pursuant to a court-ordered diversion program?"
                 options = ["Yes", "No"]
                 return AmbiguousChargeTypeWithQuestion(
                     [DivertedDuii, DismissedCharge], question_string,
                     options)
             else:
                 return AmbiguousChargeTypeWithQuestion([Duii])
         if chapter_num in statute_range:
             level_str = level.lower()
             if "felony" in level_str or "misdemeanor" in level_str:
                 if ChargeClassifier._is_dimissed(disposition):
                     return AmbiguousChargeTypeWithQuestion(
                         [DismissedCharge])
                 else:
                     return AmbiguousChargeTypeWithQuestion(
                         [TrafficOffense])
             else:
                 return AmbiguousChargeTypeWithQuestion([TrafficViolation])
 def _marijuana_eligible(section, name, birth_year, disposition):
     if section == "475860" or "marij" in name or "mj" in name.split():
         if birth_year and disposition:
             convicted_age = ceil(disposition.date.year - birth_year)
             if convicted_age < 21:
                 return AmbiguousChargeTypeWithQuestion([MarijuanaUnder21])
         return AmbiguousChargeTypeWithQuestion([MarijuanaEligible])
 def _subsection_6(section, level, statute):
     mistreatment_one = "163205"  #  (Criminal mistreatment in the second degree) if the victim at the time of the crime was 65 years of age or older.
     mistreatment_two = "163200"  # (Criminal mistreatment in the first degree) if the victim at the time of the crime was 65 years of age or older, or when the offense constitutes child abuse as defined in ORS 419B.005 (Definitions).
     endangering_welfare = "163575"  #  (Endangering the welfare of a minor) (1)(a), when the offense constitutes child abuse as defined in ORS 419B.005 (Definitions).
     negligent_homicide = (
         "163145"  # (Criminally negligent homicide), when that offense was punishable as a Class C felony.
     )
     assault_three = "163165"  # ineligible
     if section == mistreatment_one:
         charge_type_by_level = ChargeClassifier._classification_by_level(
             level, statute).ambiguous_charge_type[0]
         question_string = "Was the victim between the ages of 18 and 65?"
         options = {"Yes": charge_type_by_level, "No": Subsection6()}
         return ChargeClassifier._build_ambiguous_charge_type_with_question(
             question_string, options)
     elif section == mistreatment_two:
         charge_type_by_level = ChargeClassifier._classification_by_level(
             level, statute).ambiguous_charge_type[0]
         question_string = "Was the victim older than 65?"
         options = {"Yes": Subsection6(), "No": charge_type_by_level}
         return ChargeClassifier._build_ambiguous_charge_type_with_question(
             question_string, options)
     elif section == endangering_welfare:
         charge_type_by_level = ChargeClassifier._classification_by_level(
             level, statute).ambiguous_charge_type[0]
         question_string = "Was the charge for physical abuse?"
         options = {"Yes": Subsection6(), "No": charge_type_by_level}
         return ChargeClassifier._build_ambiguous_charge_type_with_question(
             question_string, options)
     elif section == assault_three:
         return AmbiguousChargeTypeWithQuestion([Subsection6()])
     elif section == negligent_homicide and level == "felony class c":
         return AmbiguousChargeTypeWithQuestion([Subsection6()])
 def _civil_offense(statute, chapter, name):
     statute_range = range(1, 100)
     if chapter:
         if chapter.isdigit() and int(chapter) in statute_range:
             return AmbiguousChargeTypeWithQuestion([CivilOffense])
     elif statute.isdigit() and int(statute) in statute_range:
         return AmbiguousChargeTypeWithQuestion([CivilOffense])
     elif "fugitive" in name:
         return AmbiguousChargeTypeWithQuestion([CivilOffense])
 def _classification_by_level(level, statute):
     if "Misdemeanor" in level:
         return AmbiguousChargeTypeWithQuestion([Misdemeanor])
     if level == "Felony Class C":
         return AmbiguousChargeTypeWithQuestion([FelonyClassC])
     if level == "Felony Class B":
         if ChargeClassifier._person_felony(statute):
             return AmbiguousChargeTypeWithQuestion([PersonFelonyClassB])
         else:
             return AmbiguousChargeTypeWithQuestion([FelonyClassB])
     if level == "Felony Class A":
         return AmbiguousChargeTypeWithQuestion([FelonyClassA])
 def _civil_offense(statute, name):
     statute_range = range(1, 100)
     chapter = ChargeClassifier._build_chapter_for_civil_offense(statute)
     if chapter:
         if chapter.isdigit() and int(chapter) in statute_range:
             return AmbiguousChargeTypeWithQuestion([CivilOffense])
     elif statute.isdigit() and int(statute) in statute_range:
         return AmbiguousChargeTypeWithQuestion([CivilOffense])
     elif "fugitive" in name:
         return AmbiguousChargeTypeWithQuestion([CivilOffense])
     elif "contempt of court" in name:
         return AmbiguousChargeTypeWithQuestion([CivilOffense])
 def _sex_crime(statute):
     if statute in SexCrime.statutes:
         return AmbiguousChargeTypeWithQuestion([SexCrime])
     elif statute in SexCrime.romeo_and_juliet_exceptions:
         question_string = """
         Select "Yes" if ALL of the following are true:
         1. The victim's lack of consent was solely due to age (statutory rape) AND
         2. You were under 23 years old when the act occurred AND
         3. The victim was less than five years younger than you when the act occurred
         """
         options = ["Yes (Rare, contact [email protected])", "No"]
         return AmbiguousChargeTypeWithQuestion(
             [RomeoAndJulietNMASexCrime, RomeoAndJulietIneligibleSexCrime],
             question_string, options)
 def _attempt_to_commit(name, level, statute):
     if (level == "misdemeanor class a"
             or level == "felony class c") and "attempt to commit" in name:
         question_string = "Was the underlying conduct a sex crime?"
         charge_type_by_level = ChargeClassifier._classification_by_level(
             level, statute).ambiguous_charge_type[0]
         options = {"Yes": SexCrime(), "No": charge_type_by_level}
         return ChargeClassifier._build_ambiguous_charge_type_with_question(
             question_string, options)
     if level == "felony class b" and "attempt to commit" in name:
         question_string = "Was this a drug-related charge?"
         drug_crime_question_string = "Was the underlying substance marijuana?"
         drug_crime_options = {
             "Yes": MarijuanaEligible(),
             "No": FelonyClassB()
         }
         drug_crime_classification = ChargeClassifier._build_ambiguous_charge_type_with_question(
             drug_crime_question_string, drug_crime_options)
         drug_crime_question_id = f"{question_string}-Yes-{drug_crime_classification.question.question_id}"  # type: ignore
         drug_crime_question = replace(drug_crime_classification.question,
                                       question_id=drug_crime_question_id)
         charge_types = drug_crime_classification.ambiguous_charge_type + [
             PersonFelonyClassB()
         ]
         question = Question(
             question_string,
             question_string,
             {
                 "Yes":
                 Answer(question=drug_crime_question),
                 "No":
                 Answer(edit={"charge_type": PersonFelonyClassB.__name__}),
             },
         )
         return AmbiguousChargeTypeWithQuestion(charge_types, question)
 def _sex_crime(level, statute):
     if statute in SexCrime.statutes:
         return AmbiguousChargeTypeWithQuestion([SexCrime])
     elif statute in SexCrime.romeo_and_juliet_exceptions:
         question_string = """
         Select "Yes" if ALL of the following are true:
         1. The victim's lack of consent was solely due to age (statutory rape) AND
         2. The victim was at least twelve years old at the time of the act AND
         3. You were no more than nineteen years old at the time of the act
         """
         options = ["Yes", "No"]
         charge_type_by_level = ChargeClassifier._classification_by_level(
             level, statute).ambiguous_charge_type
         return AmbiguousChargeTypeWithQuestion(
             charge_type_by_level + [RomeoAndJulietIneligibleSexCrime],
             question_string, options)
Beispiel #10
0
 def _manufacture_delivery(name, level, statute):
     if any([
             manu_del_keyword in name
             for manu_del_keyword in ["delivery", "manu/del", "manufactur"]
     ]):
         if any([
                 schedule_2_keyword in name for schedule_2_keyword in
             ["2", "ii", "heroin", "cocaine", "meth"]
         ]):
             if level == "Felony Unclassified":
                 question_string = "Was the charge for an A Felony or B Felony?"
                 options = {
                     "A Felony": FelonyClassA(),
                     "B Felony": FelonyClassB()
                 }
                 return ChargeClassifier._build_ambiguous_charge_type_with_question(
                     question_string, options)
         elif any([
                 schedule_3_keyword in name
                 for schedule_3_keyword in ["3", "iii", "4", " iv"]
         ]):
             return ChargeClassifier._classification_by_level(
                 level, statute)
         else:
             # The name contains either a "1" or no schedule number, and thus is possibly a marijuana charge.
             question_string = "Was the underlying substance marijuana?"
             charge_types_with_question = ChargeClassifier._classification_by_level(
                 level, statute)
             if level == "Felony Unclassified":
                 felony_unclassified_question_id = (
                     f"{question_string}-No-{charge_types_with_question.question.question_id}"
                 )
                 felony_unclassified_question = replace(
                     charge_types_with_question.question,
                     question_id=felony_unclassified_question_id)
                 charge_types = [
                     MarijuanaEligible()
                 ] + charge_types_with_question.ambiguous_charge_type
                 question = Question(
                     question_string,
                     question_string,
                     {
                         "Yes":
                         Answer(edit={
                             "charge_type": MarijuanaEligible.__name__
                         }),
                         "No":
                         Answer(question=felony_unclassified_question),
                     },
                 )
                 return AmbiguousChargeTypeWithQuestion(
                     charge_types, question)
             elif level == "Felony Class A" or level == "Felony Class B":
                 charge_type = charge_types_with_question.ambiguous_charge_type[
                     0]
                 options = {"Yes": MarijuanaEligible(), "No": charge_type}
                 return ChargeClassifier._build_ambiguous_charge_type_with_question(
                     question_string, options)
    def classify(self) -> AmbiguousChargeTypeWithQuestion:
        def classification_found(c):
            return c is not None

        for c in self.__classifications_list():
            if classification_found(c):
                return c

        return AmbiguousChargeTypeWithQuestion([UnclassifiedCharge])
 def _manufacture_delivery(name, level, statute):
     if any([
             keyword in name
             for keyword in ["delivery", "manu/del", "manufactur"]
     ]):
         if "2" in name or "heroin" in name or "cocaine" in name or "meth" in name:
             if level == "Felony Unclassified":
                 question_string = "Was the charge for an A Felony or B Felony?"
                 options = ["A Felony", "B Felony"]
                 return AmbiguousChargeTypeWithQuestion(
                     [FelonyClassA, FelonyClassB], question_string, options)
             else:
                 return ChargeClassifier._classification_by_level(
                     level, statute)
         elif "3" in name or "4" in name:
             if level == "Felony Unclassified":
                 question_string = "Was the charge for an A Felony, B Felony, or C Felony?"
                 options = ["A Felony", "B Felony", "C Felony"]
                 return AmbiguousChargeTypeWithQuestion(
                     [FelonyClassA, FelonyClassB, FelonyClassC],
                     question_string, options)
             else:
                 return ChargeClassifier._classification_by_level(
                     level, statute)
         else:
             # The name contains either a "1" or no schedule number, and is possibly a marijuana charge.
             if level == "Felony Unclassified":
                 question_string = "Was the underlying substance marijuana, and if not, was the charge for an A Felony, B Felony, or C Felony?"
                 options = [
                     "Yes", "No: A Felony", "No: B Felony", "No: C Felony"
                 ]
                 return AmbiguousChargeTypeWithQuestion([
                     FelonyClassA, FelonyClassB, FelonyClassC,
                     MarijuanaEligible
                 ], question_string, options)
             else:
                 question_string = "Was the underlying substance marijuana?"
                 options = ["Yes", "No"]
                 charge_type_by_level = ChargeClassifier._classification_by_level(
                     level, statute).ambiguous_charge_type
                 return AmbiguousChargeTypeWithQuestion(
                     [MarijuanaEligible] + charge_type_by_level,
                     question_string, options)
 def _build_ambiguous_charge_type_with_question(
         question: str,
         options: Dict[str, ChargeType]) -> AmbiguousChargeTypeWithQuestion:
     options_dict = {}
     charge_types = []
     for key, value in options.items():
         charge_types.append(value)
         options_dict[key] = Answer(
             edit={"charge_type": value.__class__.__name__})
     return AmbiguousChargeTypeWithQuestion(
         charge_types, Question(question, question, options_dict))
Beispiel #14
0
 def _classification_by_level(level, statute):
     if "misdemeanor" in level:
         return AmbiguousChargeTypeWithQuestion([Misdemeanor()])
     if level == "felony class c":
         return AmbiguousChargeTypeWithQuestion([FelonyClassC()])
     if level == "felony class b":
         if ChargeClassifier._person_felony(statute):
             return AmbiguousChargeTypeWithQuestion([PersonFelonyClassB()])
         else:
             return AmbiguousChargeTypeWithQuestion([FelonyClassB()])
     if level == "felony class a":
         return AmbiguousChargeTypeWithQuestion([FelonyClassA()])
     if level == "felony unclassified":
         question_string = "Was the charge for an A Felony, B Felony, or C Felony?"
         options = {
             "A Felony": FelonyClassA(),
             "B Felony": FelonyClassB(),
             "C Felony": FelonyClassC()
         }
         return ChargeClassifier._build_ambiguous_charge_type_with_question(
             question_string, options)
 def _traffic_crime(statute, name, level, disposition):
     chapter = statute[:3]
     if chapter.isdigit():
         statute_range = [481, 482, 483] + list(range(801, 826))
         chapter_num = int(chapter)
         if chapter_num == 813:
             if ChargeClassifier._is_dimissed(disposition):
                 question_string = "Was the charge dismissed pursuant to a court-ordered diversion program?"
                 options = {"Yes": DivertedDuii(), "No": DismissedCharge()}
                 return ChargeClassifier._build_ambiguous_charge_type_with_question(
                     question_string, options)
             else:
                 return AmbiguousChargeTypeWithQuestion([Duii()])
         if chapter_num in statute_range:
             if "felony" in level or "misdemeanor" in level:
                 if ChargeClassifier._is_dimissed(disposition):
                     return AmbiguousChargeTypeWithQuestion(
                         [DismissedCharge()])
                 else:
                     return AmbiguousChargeTypeWithQuestion(
                         [TrafficOffense()])
             else:
                 return AmbiguousChargeTypeWithQuestion(
                     [TrafficViolation()])
     if name == "pedestrian j-walking":
         return AmbiguousChargeTypeWithQuestion([TrafficViolation()])
     if "infraction" in level:
         return AmbiguousChargeTypeWithQuestion([TrafficViolation()])
 def _subsection_6(section, level, statute):
     mistreatment_one = "163205"  #  (Criminal mistreatment in the second degree) if the victim at the time of the crime was 65 years of age or older.
     mistreatment_two = "163200"  # (Criminal mistreatment in the first degree) if the victim at the time of the crime was 65 years of age or older, or when the offense constitutes child abuse as defined in ORS 419B.005 (Definitions).
     endangering_welfare = "163575"  #  (Endangering the welfare of a minor) (1)(a), when the offense constitutes child abuse as defined in ORS 419B.005 (Definitions).
     negligent_homicide = (
         "163145"  # (Criminally negligent homicide), when that offense was punishable as a Class C felony.
     )
     assault_three = "163165"  # ( ineligible if under subection(1)(h) ; Assault in the third degree of a minor 10 years or younger)
     if section == mistreatment_one:
         question_string = "Was the victim between the ages of 18 and 65?"
         options = ["Yes", "No"]
         charge_type_by_level = ChargeClassifier._classification_by_level(
             level, statute).ambiguous_charge_type
         return AmbiguousChargeTypeWithQuestion(
             charge_type_by_level + [Subsection6], question_string, options)
     elif section == mistreatment_two:
         question_string = "Was the victim older than 65?"
         options = ["Yes", "No"]
         charge_type_by_level = ChargeClassifier._classification_by_level(
             level, statute).ambiguous_charge_type
         return AmbiguousChargeTypeWithQuestion(
             [Subsection6] + charge_type_by_level, question_string, options)
     elif section == endangering_welfare:
         question_string = "Was the charge for physical abuse?"
         options = ["Yes", "No"]
         charge_type_by_level = ChargeClassifier._classification_by_level(
             level, statute).ambiguous_charge_type
         return AmbiguousChargeTypeWithQuestion(
             [Subsection6] + charge_type_by_level, question_string, options)
     elif section == assault_three:
         question_string = "Was the victim more than ten years old?"
         options = ["Yes", "No"]
         charge_type_by_level = ChargeClassifier._classification_by_level(
             level, statute).ambiguous_charge_type
         return AmbiguousChargeTypeWithQuestion(
             charge_type_by_level + [Subsection6], question_string, options)
     elif section == negligent_homicide and level == "Felony Class C":
         return AmbiguousChargeTypeWithQuestion([Subsection6])
 def _handle_pcs_and_manufacture_delivery(name, level, statute,
                                          schedule_2_handler):
     if any([
             schedule_2_keyword in name for schedule_2_keyword in
         ["2", "ii", "heroin", "cocaine", "meth"]
     ]):
         return schedule_2_handler(level)
     elif any([
             schedule_3_keyword in name
             for schedule_3_keyword in ["3", "iii", "4", " iv"]
     ]):
         return ChargeClassifier._classification_by_level(level, statute)
     else:
         # The name contains either a "1" or no schedule number, and thus is possibly a marijuana charge.
         question_string = "Was the underlying substance marijuana?"
         charge_types_with_question = ChargeClassifier._classification_by_level(
             level, statute)
         if level == "felony unclassified":
             felony_unclassified_question_id = (
                 f"{question_string}-No-{charge_types_with_question.question.question_id}"
             )
             felony_unclassified_question = replace(
                 charge_types_with_question.question,
                 question_id=felony_unclassified_question_id)
             charge_types = [
                 MarijuanaManufactureDelivery()
             ] + charge_types_with_question.ambiguous_charge_type
             question = Question(
                 question_string,
                 question_string,
                 {
                     "Yes":
                     Answer(edit={
                         "charge_type":
                         MarijuanaManufactureDelivery.__name__
                     }),
                     "No":
                     Answer(question=felony_unclassified_question),
                 },
             )
             return AmbiguousChargeTypeWithQuestion(charge_types, question)
         elif level == "felony class a" or level == "felony class b":
             charge_type = charge_types_with_question.ambiguous_charge_type[
                 0]
             options = {
                 "Yes": MarijuanaManufactureDelivery(),
                 "No": charge_type
             }
             return ChargeClassifier._build_ambiguous_charge_type_with_question(
                 question_string, options)
 def __classifications_list(
         self) -> Iterator[AmbiguousChargeTypeWithQuestion]:
     yield ChargeClassifier._juvenile_charge(self.violation_type)
     yield ChargeClassifier._contempt_of_court(self.name)
     yield ChargeClassifier._parking_ticket(self.violation_type)
     yield ChargeClassifier._civil_offense(self.statute, self.chapter,
                                           self.name.lower())
     yield ChargeClassifier._traffic_crime(self.statute, self.level,
                                           self.disposition)
     yield ChargeClassifier._violation(self.level)
     criminal_charge = next((c for c in ChargeClassifier._criminal_charge(
         self.statute, self.section, self.name, self.level) if c), None)
     if criminal_charge and ChargeClassifier._is_dimissed(self.disposition):
         yield AmbiguousChargeTypeWithQuestion([DismissedCharge])
     elif criminal_charge:
         yield criminal_charge
Beispiel #19
0
 def __classifications_list(
         self) -> Iterator[AmbiguousChargeTypeWithQuestion]:
     name = self.name.lower()
     yield ChargeClassifier._juvenile_charge(self.violation_type)
     yield ChargeClassifier._parking_ticket(self.violation_type)
     yield ChargeClassifier._fare_violation(name)
     yield ChargeClassifier._civil_offense(self.statute, name)
     yield ChargeClassifier._criminal_forfeiture(self.statute)
     yield ChargeClassifier._traffic_crime(self.statute, name, self.level,
                                           self.disposition)
     yield ChargeClassifier._marijuana_violation(name, self.level)
     yield ChargeClassifier._violation(self.level, name)
     criminal_charge = next(
         (c for c in ChargeClassifier._criminal_charge(
             self.statute, self.section, self.name, self.level,
             self.birth_year, self.disposition) if c),
         None,
     )
     if criminal_charge and ChargeClassifier._is_dimissed(self.disposition):
         yield AmbiguousChargeTypeWithQuestion([DismissedCharge()])
     elif criminal_charge:
         yield criminal_charge
 def _classification_by_level(level, statute):
     if "Misdemeanor" in level:
         return AmbiguousChargeTypeWithQuestion([Misdemeanor])
     if level == "Felony Class C":
         return AmbiguousChargeTypeWithQuestion([FelonyClassC])
     if level == "Felony Class B":
         if ChargeClassifier._person_felony(statute):
             return AmbiguousChargeTypeWithQuestion([PersonFelonyClassB])
         else:
             return AmbiguousChargeTypeWithQuestion([FelonyClassB])
     if level == "Felony Class A":
         return AmbiguousChargeTypeWithQuestion([FelonyClassA])
     if level == "Felony Unclassified":
         question_string = "Was the charge for an A Felony, B Felony, or C Felony?"
         options = ["A Felony", "B Felony", "C Felony"]
         return AmbiguousChargeTypeWithQuestion(
             [FelonyClassA, FelonyClassB, FelonyClassC], question_string,
             options)
 def _contempt_of_court(name):
     if "contempt" in name:
         return AmbiguousChargeTypeWithQuestion([ContemptOfCourt()])
 def _fare_violation(name):
     if "fare violation" in name or "non-payment of fare" in name:
         return AmbiguousChargeTypeWithQuestion([FareViolation])
 def _juvenile_charge(violation_type: str):
     if "juvenile" in violation_type.lower():
         return AmbiguousChargeTypeWithQuestion([JuvenileCharge])
 def _parking_ticket(violation_type):
     if "parking" in violation_type.lower():
         return AmbiguousChargeTypeWithQuestion([ParkingTicket])
 def _criminal_forfeiture(statute):
     if statute == "131582":
         return AmbiguousChargeTypeWithQuestion([CriminalForfeiture()])
 def _severe_unclassified_charges(name, statute):
     treason_statute = "166005"
     if "murder" in name or statute == treason_statute:
         return AmbiguousChargeTypeWithQuestion([SevereCharge])
 def _marijuana_violation(name, level):
     if ("marij" in name or "mj" in name.split()) and "violation" in level:
         return AmbiguousChargeTypeWithQuestion([MarijuanaViolation()])
 def _marijuana_ineligible(statute, section):
     ineligible_statutes = ["475B359", "475B367", "475B371", "167262"]
     if statute == "475B3493C" or section in ineligible_statutes:
         return AmbiguousChargeTypeWithQuestion([MarijuanaIneligible])
 def _violation(level, name):
     if "Violation" in level:
         if "reduced" in name or "treated as" in name:
             return AmbiguousChargeTypeWithQuestion([ReducedToViolation])
         else:
             return AmbiguousChargeTypeWithQuestion([Violation])
 def _civil_offense(statute, name):
     statute_range = range(1, 100)
     chapter = ChargeClassifier._build_chapter_for_civil_offense(statute)
     is_civil_chapter_range = (chapter and chapter.isdigit()
                               and int(chapter) in statute_range) or (
                                   statute.isdigit()
                                   and int(statute) in statute_range)
     is_fugitive = "fugitive" in name
     extradition_states = [
         "/AL",
         "/AK",
         "/AS",
         "/AZ",
         "/AR",
         "/CA",
         "/CO",
         "/CT",
         "/DE",
         "/DC",
         "/FL",
         "/GA",
         "/GU",
         "/HI",
         "/ID",
         "/IL",
         "/IN",
         "/IA",
         "/KS",
         "/KY",
         "/LA",
         "/ME",
         "/MD",
         "/MA",
         "/MI",
         "/MN",
         "/MS",
         "/MO",
         "/MT",
         "/NE",
         "/NV",
         "/NH",
         "/NJ",
         "/NM",
         "/NY",
         "/NC",
         "/ND",
         "/MP",
         "/OH",
         "/OK",
         "/OR",
         "/PA",
         "/PR",
         "/RI",
         "/SC",
         "/SD",
         "/TN",
         "/TX",
         "/UT",
         "/VT",
         "/VI",
         "/VA",
         "/WA",
         "/WV",
         "/WI",
         "/WY",
     ]
     is_extradition = any(
         [state.lower() == name[-3:] for state in extradition_states])
     if is_civil_chapter_range or is_fugitive or is_extradition:
         return AmbiguousChargeTypeWithQuestion([CivilOffense()])