def create_dismissed_charge( cls, case_number=1, name="Theft of services", statute="164.125", level="Misdemeanor Class A", date=date_class(1901, 1, 1), violation_type="Offense Misdemeanor", ) -> Charge: cls.charge_count += 1 disposition = DispositionCreator.create(date=date_class.today(), ruling="Dismissed") kwargs = { "case_number": case_number, "name": name, "statute": statute, "level": level, "date": date.strftime("%m/%d/%Y"), "disposition": disposition, "violation_type": violation_type, } charges = ChargeCreator.create(cls.charge_count, **kwargs)[0] assert len(charges) == 1 return charges[0]
def create_dismissed_charge( case=CaseFactory.create(), name="Theft of services", statute="164.125", level="Misdemeanor Class A", date=date_class(1901, 1, 1), ):
def __init__(self, *args, **kwargs) -> None: if len(args) == 3: self.date = date_class(*args) self.relative = relativedelta() else: self.date = kwargs["date"] self.relative = kwargs["relative"] if kwargs.get( "relative") else relativedelta()
def create( case=CaseFactory.create(), name="Theft of services", statute="164.125", level="Misdemeanor Class A", date=date_class(1901, 1, 1), disposition=None, ):
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_class(2001, 3, 3)) }
def test_probation_revoked_affects_time_eligibility( record_with_revoked_probation): record = record_with_revoked_probation expunger = Expunger(record) assert expunger.run() assert record.cases[0].charges[ 0].expungement_result.time_eligibility.date_will_be_eligible == date_class( 2020, 11, 9)
def test_probation_revoked_affects_time_eligibility( record_with_revoked_probation): record = record_with_revoked_probation expunger = Expunger(record) expunger_result = expunger.run() assert len(expunger_result) == 6 assert expunger_result[record.cases[0].charges[ 0].ambiguous_charge_id].date_will_be_eligible == date_class( 2020, 11, 9)
def default_dict(disposition=None): return { "case": CaseFactory.create(), "name": "Theft of services", "statute": "164.125", "level": "Misdemeanor Class A", "date": date_class(1901, 1, 1), "disposition": disposition, }
def test_expunger_for_record_with_mj_under_21(record_with_mj_under_21): assert isinstance(record_with_mj_under_21.charges[0], 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_class(1999, 3, 3)) }
def test_parking_ticket_dismissal(): charge_dict = { "case": CaseFactory.create(type_status=["Municipal Parking", "Closed"]), "name": "Unknown", "statute": "109", "level": "Violation Unclassified", "date": date_class(1901, 1, 1), "disposition": Dispositions.DISMISSED, } charge = ChargeFactory.create(**charge_dict) assert isinstance(charge, ParkingTicket) assert not charge.blocks_other_charges() assert charge.expungement_result.type_eligibility.status is EligibilityStatus.INELIGIBLE assert charge.expungement_result.type_eligibility.reason == "Ineligible by omission from statute"
def test_parking_ticket_unrecognized_disposition(): charge_dict = { "case": CaseFactory.create(type_status=["Municipal Parking", "Closed"]), "name": "Unknown", "statute": "109", "level": "Violation Unclassified", "date": date_class(1901, 1, 1), "disposition": Dispositions.UNRECOGNIZED_DISPOSITION, } charge = ChargeFactory.create(**charge_dict) assert isinstance(charge, ParkingTicket) assert not charge.blocks_other_charges() assert charge.expungement_result.type_eligibility.status is EligibilityStatus.INELIGIBLE assert ( charge.expungement_result.type_eligibility.reason == "Always ineligible under 137.225(7)(a) (for convictions) or by omission from statute (for dismissals)" )
def _build_ambiguous_charge(cls, case_number, date, disposition, level, name, statute, violation_type): cls.charge_count += 1 if disposition and not date: updated_date = disposition.date elif date: updated_date = date else: updated_date = date_class(1901, 1, 1) kwargs = { "case_number": case_number, "name": name, "statute": statute, "level": level, "date": updated_date, "disposition": disposition, "violation_type": violation_type, } charges = ChargeCreator.create(str(cls.charge_count), **kwargs)[0] return charges
class DateWithFuture: FUTURE = date_class(5000, 1, 1) def __init__(self, *args, **kwargs) -> None: if len(args) == 3: self.date = date_class(*args) self.relative = relativedelta() else: self.date = kwargs["date"] self.relative = kwargs["relative"] if kwargs.get( "relative") else relativedelta() @staticmethod def future(): return DateWithFuture(date=DateWithFuture.FUTURE, relative=relativedelta(days=1)) @staticmethod def fromtimestamp(t): return DateWithFuture(date=date_class.fromtimestamp(t)) @staticmethod def today(): return DateWithFuture(date=date_class.today()) @staticmethod def fromordinal(n): return DateWithFuture(date=date_class.fromordinal(n)) @staticmethod def fromdatetime(d): return DateWithFuture(date=datetime.date(d)) @staticmethod def max(): return DateWithFuture(9999, 12, 31) @staticmethod def min(): return DateWithFuture(1, 1, 1) @property def year(self): return self.date.year @property def month(self): return self.date.month @property def day(self): return self.date.day def strftime(self, fmt): if self.relative: years = f"{self.relative.years} year(s) " if self.relative.years else "" months = f"{self.relative.months} month(s) " if self.relative.months else "" days = f"{self.relative.days - 1} day(s) " if self.relative.days - 1 > 0 else "" return years + months + days + " From Conviction Of Open Charge" else: return self.date.strftime(fmt) def __add__(self, other): if isinstance(other, relativedelta): if self.relative: return DateWithFuture(date=DateWithFuture.FUTURE, relative=self.relative + other) else: return DateWithFuture(date=self.date + other) return NotImplemented def __sub__(self, other): if isinstance(other, relativedelta): if self.relative: return DateWithFuture(date=DateWithFuture.FUTURE, relative=self.relative - other) else: return DateWithFuture(date=self.date - other) return NotImplemented def __eq__(self, other): if isinstance(other, DateWithFuture): if self.date == other.date: today = date_class.today() return today + self.relative == today + other.relative else: return self.date == other.date return NotImplemented def __lt__(self, other): if isinstance(other, DateWithFuture): if self.date == other.date == DateWithFuture.FUTURE: today = date_class.today() return today + self.relative < today + other.relative elif self.date == DateWithFuture.FUTURE: return other.date == date_class.max elif other.date == DateWithFuture.FUTURE: return self.date != date_class.max else: return self.date < other.date return NotImplemented def __repr__(self): return f"DateWithFuture{repr((self.date, self.relative))}" def __hash__(self): return hash((self.date, self.relative))
class DateWithFuture: FUTURE = date_class(5000, 1, 1) def __init__(self, *args, **kwargs) -> None: if len(args) == 3: self.date = date_class(*args) self.relative = relativedelta() else: self.date = kwargs["date"] self.relative = kwargs["relative"] if kwargs.get( "relative") else relativedelta() @staticmethod def future(): return DateWithFuture(date=DateWithFuture.FUTURE, relative=relativedelta(days=1)) @staticmethod def fromtimestamp(t): return DateWithFuture(date=date_class.fromtimestamp(t)) @staticmethod def today(): return DateWithFuture(date=date_class.today()) @staticmethod def fromordinal(n): return DateWithFuture(date=date_class.fromordinal(n)) @staticmethod def fromdatetime(d): return DateWithFuture(date=datetime.date(d)) @staticmethod def max(): return DateWithFuture(9999, 12, 31) @staticmethod def min(): return DateWithFuture(1, 1, 1) @property def year(self): return self.date.year @property def month(self): return self.date.month @property def day(self): return self.date.day def strftime(self, fmt): if self.relative: years = DateWithFuture._build_strftime_part( self.relative.years, "year") months = DateWithFuture._build_strftime_part( self.relative.months, "month") days = DateWithFuture._build_strftime_part(self.relative.days - 1, "day") return years + months + days + " from conviction of open charge" else: return self.date.strftime(fmt) @staticmethod def _build_strftime_part(number: int, name: str): if number == 1: return f"{number} {name}" elif number > 0: return f"{number} {name}s" else: return "" def __add__(self, other): if isinstance(other, relativedelta): if self.relative: return DateWithFuture(date=DateWithFuture.FUTURE, relative=self.relative + other) else: return DateWithFuture(date=self.date + other) return NotImplemented def __sub__(self, other): if isinstance(other, relativedelta): if self.relative: return DateWithFuture(date=DateWithFuture.FUTURE, relative=self.relative - other) else: return DateWithFuture(date=self.date - other) return NotImplemented def __eq__(self, other): if isinstance(other, DateWithFuture): if self.date == other.date: today = date_class.today() return today + self.relative == today + other.relative else: return self.date == other.date return NotImplemented def __lt__(self, other): if isinstance(other, DateWithFuture): if self.date == other.date == DateWithFuture.FUTURE: today = date_class.today() return today + self.relative < today + other.relative elif self.date == DateWithFuture.FUTURE: return other.date == date_class.max elif other.date == DateWithFuture.FUTURE: return self.date != date_class.max else: return self.date < other.date return NotImplemented def __repr__(self): return f"DateWithFuture(date={repr(self.date)}, relative={repr(self.relative)})" def __hash__(self): return hash((self.date, self.relative))
from expungeservice.models.expungement_result import EligibilityStatus from expungeservice.models.charge_types.contempt_of_court import ContemptOfCourt from tests.factories.charge_factory import ChargeFactory from tests.factories.case_factory import CaseFactory from tests.models.test_charge import Dispositions def test_contempt_of_court_dismissed(): case = CaseFactory.create(type_status=["Contempt of Court", "Closed"]) charge = ChargeFactory.create( case_number=case.case_number, name="contempt of court", statute="33", level="N/A", date=date_class(1901, 1, 1), disposition=Dispositions.DISMISSED, violation_type=case.violation_type, ) assert isinstance(charge, ContemptOfCourt) assert charge.type_eligibility.status is EligibilityStatus.INELIGIBLE assert charge.type_eligibility.reason == "Ineligible by omission from statute" def test_contempt_of_court_convicted(): case = CaseFactory.create(type_status=["Civil Offense", "Closed"]) charge = ChargeFactory.create( case_number=case.case_number, name="contempt of court", statute="33065",