Spaces:
Sleeping
Sleeping
File size: 5,616 Bytes
4d0ffdd f6c65ef 4d0ffdd f6c65ef 4d0ffdd f6c65ef 4d0ffdd f6c65ef 4d0ffdd f6c65ef 4d0ffdd f6c65ef 4d0ffdd f6c65ef 4d0ffdd f6c65ef 4d0ffdd f6c65ef 4d0ffdd f6c65ef 4d0ffdd f6c65ef 4d0ffdd f6c65ef 4d0ffdd f6c65ef 4d0ffdd f6c65ef 4d0ffdd f6c65ef 4d0ffdd f6c65ef 4d0ffdd f6c65ef 4d0ffdd f6c65ef 4d0ffdd f6c65ef 4d0ffdd f6c65ef 4d0ffdd f6c65ef 4d0ffdd f6c65ef 4d0ffdd f6c65ef 4d0ffdd f6c65ef 4d0ffdd f6c65ef 4d0ffdd f6c65ef 4d0ffdd f6c65ef 4d0ffdd f6c65ef 4d0ffdd f6c65ef 4d0ffdd f6c65ef 4d0ffdd |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 |
"""Judge entity and workload management.
This module defines the Judge class which represents a judicial officer
presiding over hearings in a courtroom.
"""
from dataclasses import dataclass, field
from datetime import date
from typing import Dict, List, Optional, Set
@dataclass
class Judge:
"""Represents a judge with workload tracking.
Attributes:
judge_id: Unique identifier
name: Judge's name
courtroom_id: Assigned courtroom (optional)
preferred_case_types: Case types this judge specializes in
cases_heard: Count of cases heard
hearings_presided: Count of hearings presided
workload_history: Daily workload tracking
"""
judge_id: str
name: str
courtroom_id: Optional[int] = None
preferred_case_types: Set[str] = field(default_factory=set)
cases_heard: int = 0
hearings_presided: int = 0
workload_history: List[Dict] = field(default_factory=list)
def assign_courtroom(self, courtroom_id: int) -> None:
"""Assign judge to a courtroom.
Args:
courtroom_id: Courtroom identifier
"""
self.courtroom_id = courtroom_id
def add_preferred_types(self, *case_types: str) -> None:
"""Add case types to judge's preferences.
Args:
*case_types: One or more case type strings
"""
self.preferred_case_types.update(case_types)
def record_hearing(self, hearing_date: date, case_id: str, case_type: str) -> None:
"""Record a hearing presided over.
Args:
hearing_date: Date of hearing
case_id: Case identifier
case_type: Type of case
"""
self.hearings_presided += 1
def record_daily_workload(self, hearing_date: date, cases_heard: int,
cases_adjourned: int) -> None:
"""Record workload for a specific day.
Args:
hearing_date: Date of hearings
cases_heard: Number of cases actually heard
cases_adjourned: Number of cases adjourned
"""
self.workload_history.append({
"date": hearing_date,
"cases_heard": cases_heard,
"cases_adjourned": cases_adjourned,
"total_scheduled": cases_heard + cases_adjourned,
})
self.cases_heard += cases_heard
def get_average_daily_workload(self) -> float:
"""Calculate average cases heard per day.
Returns:
Average number of cases per day
"""
if not self.workload_history:
return 0.0
total = sum(day["cases_heard"] for day in self.workload_history)
return total / len(self.workload_history)
def get_adjournment_rate(self) -> float:
"""Calculate judge's adjournment rate.
Returns:
Proportion of cases adjourned (0.0 to 1.0)
"""
if not self.workload_history:
return 0.0
total_adjourned = sum(day["cases_adjourned"] for day in self.workload_history)
total_scheduled = sum(day["total_scheduled"] for day in self.workload_history)
return total_adjourned / total_scheduled if total_scheduled > 0 else 0.0
def get_workload_summary(self, start_date: date, end_date: date) -> Dict:
"""Get workload summary for a date range.
Args:
start_date: Start of range
end_date: End of range
Returns:
Dict with workload statistics
"""
days_in_range = [day for day in self.workload_history
if start_date <= day["date"] <= end_date]
if not days_in_range:
return {
"judge_id": self.judge_id,
"days_worked": 0,
"total_cases_heard": 0,
"avg_cases_per_day": 0.0,
"adjournment_rate": 0.0,
}
total_heard = sum(day["cases_heard"] for day in days_in_range)
total_adjourned = sum(day["cases_adjourned"] for day in days_in_range)
total_scheduled = total_heard + total_adjourned
return {
"judge_id": self.judge_id,
"days_worked": len(days_in_range),
"total_cases_heard": total_heard,
"total_cases_adjourned": total_adjourned,
"avg_cases_per_day": total_heard / len(days_in_range),
"adjournment_rate": total_adjourned / total_scheduled if total_scheduled > 0 else 0.0,
}
def is_specialized_in(self, case_type: str) -> bool:
"""Check if judge specializes in a case type.
Args:
case_type: Case type to check
Returns:
True if in preferred types or no preferences set
"""
if not self.preferred_case_types:
return True # No preferences means handles all types
return case_type in self.preferred_case_types
def __repr__(self) -> str:
return (f"Judge(id={self.judge_id}, courtroom={self.courtroom_id}, "
f"hearings={self.hearings_presided})")
def to_dict(self) -> dict:
"""Convert judge to dictionary for serialization."""
return {
"judge_id": self.judge_id,
"name": self.name,
"courtroom_id": self.courtroom_id,
"preferred_case_types": list(self.preferred_case_types),
"cases_heard": self.cases_heard,
"hearings_presided": self.hearings_presided,
"avg_daily_workload": self.get_average_daily_workload(),
"adjournment_rate": self.get_adjournment_rate(),
}
|