aircox/aircox_streamer/controllers/streamers.py
2023-10-11 10:53:42 +02:00

61 lines
1.7 KiB
Python

from django.utils import timezone as tz
from aircox.models import Station
from .streamer import Streamer
__all__ = ("Streamers",)
class Streamers:
"""Keep multiple streamers in memory, allow fetching informations."""
streamers = None
"""Stations by station id."""
streamer_class = Streamer
timeout = None
"""Timedelta to next update."""
next_date = None
"""Next update datetime."""
def __init__(self, timeout=None, streamer_class=streamer_class):
self.timeout = timeout or tz.timedelta(seconds=2)
def reset(self, stations=Station.objects.active()):
# FIXME: cf. TODO in aircox.controllers about model updates
stations = stations.all()
self.streamers = {station.pk: self.streamer_class(station) for station in stations}
def fetch(self):
"""Call streamers fetch if timed-out."""
if self.streamers is None:
self.reset()
now = tz.now()
if self.next_date is not None and now < self.next_date:
return
for streamer in self.streamers.values():
streamer.fetch()
self.next_date = now + self.timeout
def get(self, key, default=None):
return self.streamers.get(key, default)
def values(self):
return self.streamers.values()
def __len__(self):
return self.streamers and len(self.streamers) or 0
def __getitem__(self, key):
return self.streamers[key]
def __contains__(self, key):
"""Key can be a Station or a Station id."""
if isinstance(key, Station):
return key.pk in self.streamers
return key in self.streamers
def __iter__(self):
return self.streamers.values() if self.streamers else iter(tuple())