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)