예제 #1
0
파일: Project.py 프로젝트: mmccarty/nell
    def get_unsanctioned_users_blackout_times(self, start, end):
        universe = (start, end)
        all_blackout_ranges = [[(start, end)]]
        # for all un-sanctioned observers
        one_day = timedelta(days=1)
        for o in self.investigator_set \
                     .exclude(user__sanctioned=True) \
                     .exclude(observer=False):
            # Get reservation times
            reservation_sets =  \
                Reservation.objects.filter(user=o) \
                                   .exclude(start_date__gte=end) \
                                   .exclude(end_date__lte=start)
            # add a day to end_date (check-out day) because we
            # assume they are available all that day just like
            # they are available all day on check-in day
            onsite_ranges = [(rs.start_date, rs.end_date + one_day)
                             for rs in reservation_sets]

            # Get black-out ranges
            blackout_ranges = []
            for b in o.user.blackout_set.all():
                blackout_ranges.extend(b.generateDates(start, end))

            # Get available ranges
            available_ranges = AnalogSet.diffs(onsite_ranges, blackout_ranges)

            # Get this observer's blackout times
            all_blackout_ranges.append(
                AnalogSet.diffs([universe], available_ranges))
        return AnalogSet.intersects(all_blackout_ranges)