88if TYPE_CHECKING :
99 from .engine import DataEngine
1010
11- from .entities import EntityList , EntityMap , ReadOnlyEntityView , is_charter , is_private
11+ from .entities import (
12+ Campus ,
13+ District ,
14+ EntityList ,
15+ EntityMap ,
16+ ReadOnlyEntityView ,
17+ is_charter ,
18+ is_private ,
19+ )
1220from .geometry import point_xy
1321from .grades import coerce_grade_bounds , coerce_grade_spans
1422
@@ -455,45 +463,42 @@ def _overlaps(obj: Any) -> bool:
455463 def _op_campuses_in (self , op : tuple ):
456464 campuses : List [Any ] = []
457465 for item in self ._items :
458- if getattr (item . __class__ , "__name__" , "" ) == " District" :
466+ if isinstance (item , District ) :
459467 campuses .extend (self ._repo .campuses_in (item ))
460- elif getattr (item . __class__ , "__name__" , "" ) == " Campus" :
468+ elif isinstance (item , Campus ) :
461469 campuses .append (item )
462470 self ._items = campuses
463471 return self
464472
465473 def _op_private_campuses_in (self , op : tuple ):
466474 max_m = float (op [1 ]) if len (op ) >= 2 and op [1 ] is not None else None
467475
476+ allowed_cache : Dict [uuid .UUID , set [uuid .UUID ]] = {}
477+
478+ def _allowed_ids_for_district (district : District ) -> set [uuid .UUID ]:
479+ did = district .id
480+ allowed = allowed_cache .get (did )
481+ if allowed is None :
482+ allowed = {
483+ c .id for c in self ._repo .private_campuses_in (district , max_miles = max_m )
484+ }
485+ allowed_cache [did ] = allowed
486+ return allowed
487+
468488 campuses : List [Any ] = []
469489 for item in self ._items :
470- if getattr (item .__class__ , "__name__" , "" ) == "District" :
471- campuses .extend (self ._repo .private_campuses_in (item , max_miles = max_m ))
472- elif getattr (item .__class__ , "__name__" , "" ) == "Campus" and is_private (
473- item
474- ):
475- campuses .append (item )
476-
477- if max_m is not None and campuses :
478- allowed_cache : Dict [uuid .UUID , set [uuid .UUID ]] = {}
479- filtered : List [Any ] = []
480- for campus in campuses :
481- district = campus .district
482- if district is None :
483- continue
484- did = district .id
485- allowed = allowed_cache .get (did )
486- if allowed is None :
487- allowed = {
488- c .id
489- for c in self ._repo .private_campuses_in (
490- district , max_miles = max_m
491- )
492- }
493- allowed_cache [did ] = allowed
494- if campus .id in allowed :
495- filtered .append (campus )
496- campuses = filtered
490+ if isinstance (item , District ):
491+ districts_private = self ._repo .private_campuses_in (item , max_miles = max_m )
492+ campuses .extend (districts_private )
493+ elif isinstance (item , Campus ) and is_private (item ):
494+ if max_m is None :
495+ campuses .append (item )
496+ else :
497+ district = item .district
498+ if district is None :
499+ continue
500+ if item .id in _allowed_ids_for_district (district ):
501+ campuses .append (item )
497502
498503 self ._items = campuses
499504 return self
@@ -607,9 +612,9 @@ def _op_nearest_charter_same_type(self, op: tuple):
607612 k = int (op [1 ]) if len (op ) >= 2 else 1
608613 campuses : List [Any ] = []
609614 for item in self ._items :
610- if getattr (item . __class__ , "__name__" , "" ) == " Campus" :
615+ if isinstance (item , Campus ) :
611616 campuses .append (item )
612- elif getattr (item . __class__ , "__name__" , "" ) == " District" :
617+ elif isinstance (item , District ) :
613618 campuses .extend (self ._repo .campuses_in (item ))
614619 if not campuses :
615620 self ._items = []
@@ -625,9 +630,9 @@ def _op_nearest_charter_same_type(self, op: tuple):
625630 def _op_nearest_charter_transfer_destination (self , op : tuple ):
626631 campuses : List [Any ] = []
627632 for item in self ._items :
628- if getattr (item . __class__ , "__name__" , "" ) == " Campus" :
633+ if isinstance (item , Campus ) :
629634 campuses .append (item )
630- elif getattr (item . __class__ , "__name__" , "" ) == " District" :
635+ elif isinstance (item , District ) :
631636 campuses .extend (self ._repo .campuses_in (item ))
632637 if not campuses :
633638 self ._items = []
@@ -653,7 +658,7 @@ def _op_transfers_out(self, op: tuple):
653658 campuses = [
654659 it
655660 for it in self ._items
656- if getattr (it . __class__ , "__name__" , "" ) == " Campus"
661+ if isinstance (it , Campus )
657662 ]
658663 rows = []
659664 for c in campuses :
@@ -674,7 +679,7 @@ def _op_transfers_in(self, op: tuple):
674679 campuses = [
675680 it
676681 for it in self ._items
677- if getattr (it . __class__ , "__name__" , "" ) == " Campus"
682+ if isinstance (it , Campus )
678683 ]
679684 rows = []
680685 for c in campuses :
0 commit comments