Example #1
0
    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
Example #2
0
def test_interval_set_with_empty_intervals_is_empty():
    res = IntervalSet((i.open(1, 1), i.open(15, 15),))
    assert res.empty()
Example #3
0
def test_interval_set_with_empty_intervals_is_empty():
    res = IntervalSet((
        i.open(1, 1),
        i.open(15, 15),
    ))
    assert res.empty()