def test_eligible_mrc_with_single_arrest(): three_yr_mrc = ChargeFactory.create( disposition=DispositionCreator.create(ruling="Convicted", date=Time.THREE_YEARS_AGO) ) arrest = ChargeFactory.create(disposition=DispositionCreator.create(ruling="Dismissed", date=Time.THREE_YEARS_AGO)) case = CaseFactory.create(charges=tuple([three_yr_mrc, arrest])) record = Record(tuple([case])) expunger_result = Expunger.run(record) assert expunger_result[arrest.ambiguous_charge_id].status is EligibilityStatus.ELIGIBLE assert ( expunger_result[arrest.ambiguous_charge_id].reason == 'Time eligibility of the arrest matches conviction on the same case (the "friendly" rule)' ) assert expunger_result[arrest.ambiguous_charge_id].date_will_be_eligible == date.today() assert expunger_result[three_yr_mrc.ambiguous_charge_id].status is EligibilityStatus.ELIGIBLE assert expunger_result[three_yr_mrc.ambiguous_charge_id].reason == "Eligible now" assert expunger_result[three_yr_mrc.ambiguous_charge_id].date_will_be_eligible == date.today() merged_record = RecordMerger.merge([record], [expunger_result]) assert ( merged_record.cases[0].charges[0].expungement_result.charge_eligibility.status # type: ignore == ChargeEligibilityStatus.ELIGIBLE_NOW ) assert merged_record.cases[0].charges[0].expungement_result.charge_eligibility.label == "Eligible" # type: ignore assert ( merged_record.cases[0].charges[1].expungement_result.charge_eligibility.status # type: ignore == ChargeEligibilityStatus.ELIGIBLE_NOW ) assert merged_record.cases[0].charges[1].expungement_result.charge_eligibility.label == "Eligible" # type: ignore
def analyze_ambiguous_record(ambiguous_record: AmbiguousRecord): charge_id_to_time_eligibilities = [] for record in ambiguous_record: record.errors += ErrorChecker.check(record) # TODO: Fix mutation expunger = Expunger(record) charge_id_to_time_eligibility = expunger.run() charge_id_to_time_eligibilities.append( charge_id_to_time_eligibility) record = RecordMerger.merge(ambiguous_record, charge_id_to_time_eligibilities) return record
def analyze_ambiguous_record(ambiguous_record: AmbiguousRecord): charge_id_to_time_eligibilities = [] ambiguous_record_with_errors = [] for record in ambiguous_record: record_with_errors = replace(record, errors=tuple( ErrorChecker.check(record))) charge_id_to_time_eligibility = Expunger.run(record_with_errors) charge_id_to_time_eligibilities.append( charge_id_to_time_eligibility) ambiguous_record_with_errors.append(record_with_errors) record = RecordMerger.merge(ambiguous_record_with_errors, charge_id_to_time_eligibilities) return record
def _analyze_ambiguous_record(ambiguous_record: AmbiguousRecord, charge_ids_with_question: List[str]): charge_id_to_time_eligibilities = [] ambiguous_record_with_errors = [] for record in ambiguous_record: charge_id_to_time_eligibility = Expunger.run(record) charge_id_to_time_eligibilities.append( charge_id_to_time_eligibility) ambiguous_record_with_errors.append(record) record = RecordMerger.merge(ambiguous_record_with_errors, charge_id_to_time_eligibilities, charge_ids_with_question) sorted_record = RecordCreator.sort_record(record) return replace(sorted_record, errors=tuple(ErrorChecker.check(sorted_record)))
def test_marijuana_violation_uses_statewide_form(record_with_mj_over_21): expunger_result = Expunger.run(record_with_mj_over_21) merged_record = RecordMerger.merge([record_with_mj_over_21], [expunger_result], []) record_summary = RecordSummarizer.summarize(merged_record, {}) user_information = { "full_name": "", "date_of_birth": "", "mailing_address": "", "phone_number": "", "city": "", "state": "", "zip_code": "", } zip_path, zip_name = FormFilling.build_zip(record_summary, user_information) temp_dir = mkdtemp() with ZipFile(zip_path, "r") as zip_ref: zip_ref.extractall(temp_dir) for _root, _dir, files in os.walk(temp_dir): assert len(files) == 1 assert "statewide_marijuana_conviction" in files[0]
def test_normal_conviction_uses_multnomah_conviction_form(): record = CrawlerFactory.create(JohnDoe.SINGLE_CASE_RECORD, {"CASEJD1": CaseDetails.CASEJD74}) expunger_result = Expunger.run(record) merged_record = RecordMerger.merge([record], [expunger_result], []) record_summary = RecordSummarizer.summarize(merged_record, {}) user_information = { "full_name": "", "date_of_birth": "", "mailing_address": "", "phone_number": "", "city": "", "state": "", "zip_code": "", } zip_path, zip_name = FormFilling.build_zip(record_summary, user_information) temp_dir = mkdtemp() with ZipFile(zip_path, "r") as zip_ref: zip_ref.extractall(temp_dir) for _root, _dir, files in os.walk(temp_dir): assert len(files) == 1 assert "multnomah_conviction" in files[0]
def test_record_summarizer_multiple_cases(): case_all_eligible = CaseFactory.create(case_number="1", balance="100.00", date_location=["1/1/1995", "Multnomah"]) case_all_eligible.charges = [ ChargeFactory.create( case_number=case_all_eligible.case_number, name="Theft of dignity", disposition=Disposition(ruling="Convicted", date=Time.TEN_YEARS_AGO), ) ] case_partially_eligible = CaseFactory.create( case_number="2", balance="200.00", date_location=["1/1/1995", "Clackamas"] ) case_partially_eligible.charges = [ ChargeFactory.create( case_number=case_partially_eligible.case_number, disposition=Disposition(ruling="Convicted", date=Time.TEN_YEARS_AGO), ), ChargeFactory.create( case_number=case_partially_eligible.case_number, level="Felony Class A", disposition=Disposition(ruling="Convicted", date=Time.TEN_YEARS_AGO), ), ] case_possibly_eligible = CaseFactory.create(case_number="3", balance="300.00", date_location=["1/1/1995", "Baker"]) case_possibly_eligible.charges = [ ChargeFactory.create( case_number=case_possibly_eligible.case_number, level="Felony Class B", disposition=Disposition(ruling="Convicted", date=Time.TEN_YEARS_AGO), ) ] case_all_ineligible = CaseFactory.create(case_number="4", balance="400.00", date_location=["1/1/1995", "Baker"]) case_all_ineligible.charges = [ ChargeFactory.create( case_number=case_all_ineligible.case_number, level="Felony Class A", disposition=Disposition(ruling="Convicted", date=Time.TEN_YEARS_AGO), ) ] case_all_ineligible_2 = CaseFactory.create(case_number="5", date_location=["1/1/1995", "Baker"]) case_all_ineligible_2.charges = [ ChargeFactory.create( case_number=case_all_ineligible_2.case_number, level="Felony Class A", disposition=Disposition(ruling="Convicted", date=Time.TEN_YEARS_AGO), ) ] record = Record( [case_all_eligible, case_partially_eligible, case_possibly_eligible, case_all_ineligible, case_all_ineligible_2] ) expunger = Expunger(record) expunger_result = expunger.run() merged_record = RecordMerger.merge([record], [expunger_result]) record_summary = RecordSummarizer.summarize(merged_record, {}) assert record_summary.total_balance_due == 1000.00 assert record_summary.total_cases == 5 assert record_summary.total_charges == 6 assert record_summary.cases_sorted["fully_eligible"] == ["1"] assert record_summary.cases_sorted["fully_ineligible"] == ["4", "5"] assert record_summary.cases_sorted["partially_eligible"] == ["2"] assert record_summary.cases_sorted["other"] == ["3"] """
def test_round_trip_various_records(record): expunger_result = Expunger.run(record) updated_record = RecordMerger.merge([record], [expunger_result]) json.loads(json.dumps(updated_record, cls=ExpungeModelEncoder))
def test_record_summarizer_multiple_cases(): case_all_eligible = CaseFactory.create( case_number="1", balance="100.00", date_location=["1/1/1995", "Multnomah"], charges=tuple([ ChargeFactory.create( case_number="1", name="Theft of dignity", disposition=DispositionCreator.create(ruling="Convicted", date=date(2010, 1, 1)), ) ]), ) case_partially_eligible = CaseFactory.create( case_number="2", balance="200.00", date_location=["1/1/1995", "Clackamas"], charges=tuple([ ChargeFactory.create( case_number="2", disposition=DispositionCreator.create(ruling="Convicted", date=date(2010, 1, 1)), ), ChargeFactory.create( case_number="2", level="Felony Class A", disposition=DispositionCreator.create(ruling="Convicted", date=date(2010, 1, 1)), ), ]), ) case_possibly_eligible = CaseFactory.create( case_number="3", balance="300.00", date_location=["1/1/1995", "Baker"], charges=tuple([ ChargeFactory.create( case_number="3", level="Felony Class B", disposition=DispositionCreator.create(ruling="Convicted", date=date(2010, 1, 1)), ) ]), ) case_all_ineligible = CaseFactory.create( case_number="4", balance="400.00", date_location=["1/1/1995", "Baker"], charges=tuple([ ChargeFactory.create( case_number="4", level="Felony Class A", disposition=DispositionCreator.create(ruling="Convicted", date=date(2010, 1, 1)), ) ]), ) case_all_ineligible_2 = CaseFactory.create( case_number="5", date_location=["1/1/1995", "Baker"], charges=tuple([ ChargeFactory.create( case_number="5", level="Felony Class A", disposition=DispositionCreator.create(ruling="Convicted", date=date(2010, 1, 1)), ) ]), ) record = Record( tuple([ case_all_eligible, case_partially_eligible, case_possibly_eligible, case_all_ineligible, case_all_ineligible_2, ])) expunger_result = Expunger.run(record) merged_record = RecordMerger.merge([record], [expunger_result], []) record_summary = RecordSummarizer.summarize(merged_record, {}) assert record_summary.total_fines_due == 1000.00 assert record_summary.total_cases == 5 assert record_summary.total_charges == 6 assert record_summary.eligible_charges_by_date == { "Eligible Jan 1, 2030": [( case_possibly_eligible.charges[0].ambiguous_charge_id, "Theft of services (CONVICTED) Charged Jan 1, " "2010", )], "Eligible Now": [ (case_all_eligible.charges[0].ambiguous_charge_id, "Theft of dignity (CONVICTED) Charged Jan 1, 2010"), ( case_partially_eligible.charges[0].ambiguous_charge_id, "Theft of services (CONVICTED) Charged Jan 1, 2010", ), ], "Ineligible": [ ( case_partially_eligible.charges[1].ambiguous_charge_id, "Theft of services (CONVICTED) Charged Jan 1, 2010", ), ( case_all_ineligible.charges[0].ambiguous_charge_id, "Theft of services (CONVICTED) Charged Jan 1, 2010", ), ( case_all_ineligible_2.charges[0].ambiguous_charge_id, "Theft of services (CONVICTED) Charged Jan 1, 2010", ), ], } assert len(record_summary.county_filing_fees) == 2 assert record_summary.total_filing_fees_due == 722 assert (next(county.total_fines_due for county in record_summary.county_fines if county.county_name == "Multnomah") == 100) assert (next(county.total_fines_due for county in record_summary.county_fines if county.county_name == "Clackamas") == 200) assert (next(county.total_fines_due for county in record_summary.county_fines if county.county_name == "Baker") == 700)