コード例 #1
0
 def setUp(self):
     self.parser = RecordParser()
     self.parser.feed(JohnDoe.RECORD)
     self.case1_date = date(1963, 3, 23)
     self.case2_date = date(1963, 4, 11)
     self.case3_date = date(2012, 4, 1)
     self.base_uri = "https://publicaccess.courts.oregon.gov/PublicAccessLogin/CaseDetail.aspx?CaseID="
コード例 #2
0
def test_add_new_charge():
    record, questions = RecordCreator.build_record(
        search("single_case_two_charges"),
        "username",
        "password",
        (),
        {
            "X0001": {
                "summary": {
                    "edit_status": "UPDATE"
                },
                "charges": {
                    "X0001-3": {
                        "edit_status": "ADD",
                        "charge_type": "MisdemeanorClassA",
                        "level": "Misdemeanor Class A",
                        "date": "1/1/2001",
                        "disposition": {
                            "date": "2/1/2020",
                            "ruling": "Convicted"
                        },
                    }
                },
            }
        },
        date.today(),
        LRUCache(4),
    )
    assert isinstance(record.cases[0].charges[2].charge_type,
                      MisdemeanorClassA)
    assert record.cases[0].charges[2].date == date(2001, 1, 1)
    assert record.cases[0].charges[2].edit_status == EditStatus.ADD
コード例 #3
0
def test_edit_some_fields_on_case():
    record, questions = RecordCreator.build_record(
        search("two_cases_two_charges_each"),
        "username",
        "password",
        (),
        {
            "X0002": {
                "summary": {
                    "edit_status": "UPDATE",
                    "location": "ocean",
                    "balance_due": "100",
                    "date": "1/1/1981",
                }
            }
        },
        date.today(),
        LRUCache(4),
    )
    assert len(record.cases) == 2
    assert record.cases[0].summary.location == "earth"
    assert record.cases[0].summary.edit_status == EditStatus.UNCHANGED
    assert record.cases[1].summary.location == "ocean"
    assert record.cases[1].summary.balance_due_in_cents == 10000
    assert record.cases[1].summary.date == date(1981, 1, 1)
    assert record.cases[1].summary.edit_status == EditStatus.UPDATE
コード例 #4
0
def test_expunger_for_record_with_mj_over_21(record_with_mj_over_21):
    expunger_result = Expunger.run(record_with_mj_over_21)
    assert expunger_result == {
        "CASEJD1-1":
        TimeEligibility(status=EligibilityStatus.ELIGIBLE,
                        reason="Eligible now",
                        date_will_be_eligible=date(2001, 3, 3))
    }
コード例 #5
0
def test_probation_revoked_affects_time_eligibility(
        record_with_revoked_probation):
    record = record_with_revoked_probation
    expunger_result = Expunger.run(record)

    assert len(expunger_result) == 6
    assert expunger_result[record.cases[2].charges[0].
                           ambiguous_charge_id].date_will_be_eligible == date(
                               2020, 11, 9)
コード例 #6
0
def test_charge_with_unrecognized_disposition_eligibility():
    charge = ChargeFactory.create(level="Felony Class B",
                                  disposition=DispositionCreator.create(
                                      ruling="What am I",
                                      date=date(2001, 1, 1)))
    assert not charge.convicted()
    assert not charge.dismissed()
    assert charge.type_eligibility.status is EligibilityStatus.NEEDS_MORE_ANALYSIS
    assert charge.type_eligibility.reason == "Disposition not recognized. Needs further analysis"
コード例 #7
0
def test_expunger_for_record_with_mj_under_21(record_with_mj_under_21):
    assert isinstance(record_with_mj_under_21.charges[0].charge_type,
                      MarijuanaUnder21)
    expunger_result = Expunger.run(record_with_mj_under_21)
    assert expunger_result == {
        "CASEJD1-1":
        TimeEligibility(status=EligibilityStatus.ELIGIBLE,
                        reason="Eligible now",
                        date_will_be_eligible=date(1999, 3, 3))
    }
コード例 #8
0
def test_add_case():
    record, questions = RecordCreator.build_record(
        search("single_case_two_charges"),
        "username",
        "password",
        (),
        {
            "5": {
                "summary": {
                    "case_number": "5",
                    "edit_status": "ADD",
                    "location": "ocean",
                    "balance_due": "100",
                    "date": "1/1/1981",
                },
                "charges": {
                    "5-1": {
                        "edit_status": "ADD",
                        "charge_type": "FelonyClassC",
                        "level": "Felony Class C",
                        "date": "1/1/2001",
                        "disposition": {
                            "date": "2/1/2020",
                            "ruling": "Convicted"
                        },
                    }
                },
            }
        },
        date.today(),
        LRUCache(4),
    )
    assert len(record.cases) == 2
    assert record.cases[0].summary.location == "earth"
    assert record.cases[0].summary.edit_status == EditStatus.UNCHANGED

    assert record.cases[1].summary.location == "ocean"
    assert record.cases[1].summary.balance_due_in_cents == 10000
    assert record.cases[1].summary.date == date(1981, 1, 1)
    assert record.cases[1].summary.edit_status == EditStatus.ADD
    assert record.cases[1].charges[0].edit_status == EditStatus.ADD
    assert record.cases[1].charges[0].charge_type
    assert isinstance(record.cases[1].charges[0].charge_type, FelonyClassC)
コード例 #9
0
def test_expunger_for_record_with_mj_under_21_blocked_by_blocking_conviction():
    record = CrawlerFactory.create(
        record=YoungDoe.SINGLE_CASE_RECORD,
        cases={"CASEJD1": CaseDetails.CASE_MJ_AND_FELONY_CONVICTION})
    expunger_result = Expunger.run(record)

    mj_charge = record.charges[0]
    felony_charge = record.charges[1]

    assert isinstance(mj_charge.charge_type, MarijuanaUnder21)
    assert isinstance(felony_charge.charge_type, FelonyClassA)

    assert expunger_result["CASEJD1-1"] == TimeEligibility(
        status=EligibilityStatus.ELIGIBLE,
        reason="Eligible now",
        date_will_be_eligible=date(1998, 3, 3) + relativedelta(years=10),
    )
    assert expunger_result["CASEJD1-2"] == TimeEligibility(
        status=EligibilityStatus.INELIGIBLE,
        reason="Never. Type ineligible charges are always time ineligible.",
        date_will_be_eligible=date.max(),
    )
コード例 #10
0
def test_edit_some_fields_on_case():
    record, questions = RecordCreator.build_record(
        search("two_cases_two_charges_each"),
        "username",
        "password",
        (),
        {
            "X0002": {
                "action": "edit",
                "summary": {
                    "location": "ocean",
                    "balance_due": "100",
                    "date": "1/1/1001",
                }
            }
        },
    )
    assert len(record.cases) == 2
    assert record.cases[0].summary.location == "earth"
    assert record.cases[1].summary.location == "ocean"
    assert record.cases[1].summary.balance_due_in_cents == 10000
    assert record.cases[1].summary.date == date(1001, 1, 1)
コード例 #11
0
def test_add_new_charge():
    record, questions = RecordCreator.build_record(
        search("single_case_two_charges"),
        "username",
        "password",
        (),
        {
            "X0001": {
                "action": "edit",
                "charges": {
                    "X0001-3": {
                        "charge_type": "Misdemeanor",
                        "date": "1/1/2001",
                        "disposition": {
                            "date": "2/1/2020",
                            "ruling": "Convicted"
                        },
                    }
                },
            }
        },
    )
    assert isinstance(record.cases[0].charges[2].charge_type, Misdemeanor)
    assert record.cases[0].charges[2].date == date(2001, 1, 1)
コード例 #12
0
from expungeservice.models.charge_types.felony_class_c import FelonyClassC
from expungeservice.models.record import Record
from expungeservice.models.disposition import Disposition, DispositionStatus, DispositionCreator
from expungeservice.models.expungement_result import ChargeEligibilityStatus, EligibilityStatus
from expungeservice.record_creator import RecordCreator

case_1 = OeciCase(
    CaseSummary(
        name="John Doe",
        birth_year=1980,
        case_number="X0001",
        district_attorney_number="555",
        sid="OR12345678",
        citation_number="X0001",
        location="earth",
        date=date(2001, 1, 1),
        violation_type="Something",
        current_status="CLOSED",
        case_detail_link="alink",
        balance_due_in_cents=0,
        edit_status=EditStatus.UNCHANGED,
    ),
    (
        OeciCharge(
            ambiguous_charge_id="X0001-1",
            name="petty theft",
            statute="100.000",
            level="Misdemeanor",
            date=date(2000, 1, 1),
            disposition=Disposition(
                date=date(2001, 1, 1),
コード例 #13
0
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)
コード例 #14
0
from expungeservice.models.charge_types.parking_ticket import ParkingTicket

from tests.factories.charge_factory import ChargeFactory
from tests.factories.case_factory import CaseSummaryFactory
from tests.models.test_charge import Dispositions


def test_parking_ticket_conviction():
    case = CaseSummaryFactory.create(
        type_status=["Municipal Parking", "Closed"])
    charge = ChargeFactory.create(
        case_number=case.case_number,
        name="Unknown",
        statute="109",
        level="Violation Unclassified",
        date=date(1901, 1, 1),
        disposition=Dispositions.CONVICTED,
        violation_type=case.violation_type,
    )

    assert isinstance(charge.charge_type, ParkingTicket)
    assert not charge.charge_type.blocks_other_charges
    assert charge.type_eligibility.status is EligibilityStatus.INELIGIBLE
    assert charge.type_eligibility.reason == "Ineligible under 137.225(7)(a)"


def test_parking_ticket_dismissal():
    case = CaseSummaryFactory.create(
        type_status=["Municipal Parking", "Closed"])
    charge = ChargeFactory.create(
        case_number=case.case_number,
コード例 #15
0
from expungeservice.models.case import OeciCase, CaseSummary
from expungeservice.models.charge import OeciCharge
from expungeservice.models.charge_types.misdemeanor import Misdemeanor
from expungeservice.models.record import Record
from expungeservice.models.disposition import Disposition, DispositionStatus, DispositionCreator
from expungeservice.record_creator import RecordCreator

case_1 = OeciCase(
    CaseSummary(
        name="John Doe",
        birth_year=1980,
        case_number="X0001",
        citation_number="X0001",
        location="earth",
        date=date(2001, 1, 1),
        violation_type="Something",
        current_status="CLOSED",
        case_detail_link="alink",
        balance_due_in_cents=0,
    ),
    (
        OeciCharge(
            ambiguous_charge_id="X0001-1",
            name="manufacturing",
            statute="100.000",
            level="Felony Class B",
            date=date(2000, 1, 1),
            disposition=Disposition(
                date=date(2001, 1, 1),
                ruling="Convicted",