from __future__ import annotations
from typing import Union as _Union
__all__ = ["WardID"]
[docs]class WardID:
"""A simple class that identifies a Ward (or Wards),
or a connection between Wards. This could be used,
e.g. to specify ward moves
"""
[docs] def __init__(self, home: _Union[WardID, str, int] = None,
commute: _Union[WardID, str, int] = None,
all_commute: bool = False):
"""Construct a WardID that identifies the 'home' ward, and (optionally)
the 'commute' ward if this is a ward-link (used to identify
workers)
If "all_commute" is true then this identifies all connections
that have 'home' as the home ward.
"""
if isinstance(home, WardID):
home = home._home
if isinstance(commute, WardID):
commute = commute._home
if home is None:
if commute is not None:
raise ValueError("You cannot specify a commute without a home")
self._home = None
self._commute = None
return
self._home = home
self._commute = commute
self._all_commute = bool(all_commute)
if self._all_commute:
if self._commute is not None:
raise ValueError("You cannot specify all_commute and a "
"single commute ward.")
[docs] def __eq__(self, other):
return self._home == other._home and \
self._commute == other._commute and \
self._all_commute == other._all_commute
[docs] def is_null(self):
"""Return whether or not this is null"""
return self._home is None and self._commute is None
[docs] def is_ward(self):
"""Return whether or not this specifies a single ward"""
return self._home is not None and self._commute is None and \
not self._all_commute
[docs] def is_ward_connection(self):
"""Return whether or not this is a ward connection
(has both a home and commute ward)
"""
return self._home is not None and self._commute is not None and \
not self._all_commute
[docs] def is_all_commute(self):
"""Return whether or not this refers to all commuter connections
to a ward
"""
return self._home is not None and self._all_commute
[docs] def __str__(self):
if self.is_null():
return "WardID::null"
elif self.is_all_commute():
return f"{self._home}=>all_commute"
elif self.is_ward():
return str(self._home)
else:
return f"{self._home}=>{self._commute}"
[docs] def __repr__(self):
return self.__str__()
[docs] def home(self):
""" Return the home ward"""
return self._home
[docs] def commute(self):
"""Return the commute ward is this is a ward connection"""
return self._commute