def get_availability(self: ConcreteEntity, range_begin: date, range_end: date) -> IntervalSet: available = IntervalSet([]) unavailable = IntervalSet([]) # Determine availability and unavailability according to entity's settings: for pos_tp in self.timepattern_set.filter( disposition=TimePattern.DISPOSITION_AVAILABLE).all(): available += pos_tp.as_interval_set(range_begin, range_end) if available.empty(): # If no positive timepatterns have been specified then we'll say that the pos part is infinite. # This makes it easy to specify things like "always available" and "always available except Fridays." # For the purpose of this method, "infite" translates to range_begin to range_end. make_ts = lambda d: dt2ts( pytz.utc.localize(datetime(d.year, d.month, d.day))) range_begin_ts = make_ts(range_begin) # type: TimeStamp range_end_ts = make_ts(range_end) # type: TimeStamp available.add(closed(range_begin_ts, range_end_ts)) for neg_tp in self.timepattern_set.filter( disposition=TimePattern.DISPOSITION_UNAVAILABLE).all(): unavailable += neg_tp.as_interval_set(range_begin, range_end) # Determine additional unavailability due to entity being involved in a scheduled class: for involvement in self.scheduled_class_involvements: # type: EntityInScheduledClass if involvement.entitys_status == EntityInScheduledClass.STATUS_G2G: pass # TODO return available - unavailable
def test_interval_set_with_empty_intervals_is_empty(): res = IntervalSet((i.open(1, 1), i.open(15, 15),)) assert res.empty()
def test_interval_set_with_empty_intervals_is_empty(): res = IntervalSet(( i.open(1, 1), i.open(15, 15), )) assert res.empty()