def test_getWindowTimeBlackedOut(self): bHrs = self.w.getWindowTimeBlackedOut() self.assertEquals(0.0, bHrs) # make blackout that overlaps this window # start = datetime(2009, 6, 1) # dur = 7 # days blackout = create_blackout(project = self.w.session.project, start = datetime(2009, 6, 3), end = datetime(2009, 6, 4), repeat = 'Once') # and another that doesn't blackout = create_blackout(project = self.w.session.project, start = datetime(2009, 6, 8, 12), end = datetime(2009, 6, 9, 12), repeat = 'Once') bHrs = self.w.getWindowTimeBlackedOut() self.assertEquals(24.0, bHrs) # now extend this window and make it non-contigious # and see how the new blackouts *dont* picked up. wr = WindowRange(window = self.w , start_date = datetime(2009, 6, 10) , duration = 2) wr.save() # the second window range misses the second blackout out # But it needs to be fresh from the DB w = Window.objects.get(id = self.w.id) bHrs = w.getWindowTimeBlackedOut() self.assertEquals(24.0, bHrs)
def test_getBlackedOutSchedulablePeriods(self): now = datetime(2009, 6, 1, 12, 15) u = User(first_name = "Test" , last_name = "User" , sanctioned = True ) u.save() blackout = create_blackout(user = u, repeat = 'Once', start = datetime(2009, 6, 8, 11), end = datetime(2009, 6, 10, 8)) project = self.elec.session.project investigator = Investigator(project = project , user = u , observer = True) investigator.save() # test observer black out self.assertEqual([self.period2] , self.elec.getBlackedOutSchedulablePeriods(now)) blackout = create_blackout(project = project, timezone = 'UTC', start = datetime(2009, 6, 14), end = datetime(2009, 6, 16), repeat = 'Once') # test project black out self.assertEqual([self.period2, self.period3] , self.elec.getBlackedOutSchedulablePeriods(now))
def test_get_blackout_times3(self): # Create Investigator1's 3 blackouts. blackout11 = create_blackout(user = self.user1, repeat = 'Once', start = datetime(2009, 1, 1, 11), end = datetime(2009, 1, 3, 11)) blackout12 = create_blackout(user = self.user1, repeat = 'Once', start = datetime(2009, 1, 1, 18), end = datetime(2009, 1, 4, 18)) blackout13 = create_blackout(user = self.user1, repeat = 'Once', start = datetime(2009, 1, 2, 12), end = datetime(2009, 1, 4, 20)) # Investigator 2 has no blackouts - She's available all the time. today = datetime(2009, 1, 1) later = today + timedelta(days = 30) r = self.project.get_blackout_times(today, later) self.assertEquals([], r) # Clean up blackout13.delete() blackout12.delete() blackout11.delete()
def test_get_blackout_times2(self): # Create Investigator1's 3 blackouts. self.investigator1.observer = False self.investigator1.save() blackout11 = create_blackout(user = self.user1, repeat = 'Once', start = datetime(2009, 1, 1, 11), end = datetime(2009, 1, 3, 11)) blackout12 = create_blackout(user = self.user1, repeat = 'Once', start = datetime(2009, 1, 1, 18), end = datetime(2009, 1, 4, 18)) blackout13 = create_blackout(user = self.user1, repeat = 'Once', start = datetime(2009, 1, 2, 12), end = datetime(2009, 1, 4, 20)) # Create Investigator2's 2 blackouts. self.investigator2.observer = False self.investigator2.save() blackout21 = create_blackout(user = self.user2, repeat = 'Once', start = datetime(2009, 1, 1, 11), end = datetime(2009, 1, 3, 11)) blackout22 = create_blackout(user = self.user2, repeat = 'Once', start = datetime(2009, 1, 1, 18), end = datetime(2009, 1, 4, 13)) today = datetime(2009, 1, 1) later = today + timedelta(days = 30) r = self.project.get_blackout_times(today, later) self.assertEquals([], r) r = self.project.get_unsanctioned_users_blackout_times(today, later) self.assertEquals([(today, later)], r) # Clean up blackout22.delete() blackout21.delete() blackout13.delete() blackout12.delete() blackout11.delete() self.investigator2.observer = True self.investigator2.save() self.investigator1.observer = True self.investigator1.save()
def test_get_blackout_times4(self): # Create Investigator1's 3 blackouts. blackout11 = create_blackout(user = self.user1, repeat = 'Once', start = datetime(2009, 1, 1, 11), end = datetime(2009, 1, 3, 11)) blackout12 = create_blackout(user = self.user1, repeat = 'Once', start = datetime(2009, 1, 1, 18), end = datetime(2009, 1, 4, 18)) blackout13 = create_blackout(user = self.user1, repeat = 'Once', start = datetime(2009, 1, 2, 12), end = datetime(2009, 1, 4, 20)) # Create Investigator2's 2 blackouts. blackout21 = create_blackout(user = self.user2, repeat = 'Once', start = datetime(2009, 2, 1, 11), end = datetime(2009, 2, 3, 11)) blackout22 = create_blackout(user = self.user2, repeat = 'Once', start = datetime(2009, 3, 1, 18), end = datetime(2009, 3, 4, 13)) today = datetime(2009, 1, 1) later = today + timedelta(days = 30) r = self.project.get_blackout_times(today, later) self.assertEquals([], r) # Coordinated blackouts. # Clean up blackout22.delete() blackout21.delete() blackout13.delete() blackout12.delete() blackout11.delete()
def setUp(self): super(TestBlackout, self).setUp() # create some user blackouts self.u = User(first_name = "Test" , last_name = "User" ) self.u.save() self.blackout1 = create_blackout(user = self.u, repeat = "Once", start = datetime(2009, 1, 1, 11), end = datetime(2009, 1, 3, 11)) self.blackout2 = create_blackout(user = self.u, repeat = 'Weekly', start = datetime(2009, 1, 4, 11), end = datetime(2009, 1, 4, 13), until = datetime(2009, 5, 4, 11)) # create some project blackouts semester = Semester.objects.get(semester = "08C") ptype = Project_Type.objects.get(type = "science") self.pcode = "GBT08C-01" self.project = Project(semester = semester , project_type = ptype , pcode = self.pcode ) self.project.save() self.blackout3 = create_blackout(project = self.project, timezone = 'UTC', repeat = 'Once', start = datetime(2008, 10, 1, 11), end = datetime(2008, 10, 3, 11))
def test_ut_dst(self): blackout = create_blackout(user = self.u, repeat = 'Weekly', start = datetime(2011, 1, 1, 11), end = datetime(2011, 1, 4, 13), until = datetime(2011, 12, 4, 11), timezone = 'UTC') # This is a UTC blackout. Every start time and end time # generated should equal the start and end times above, 11:00 # and 13:00. dates = blackout.generateDates(blackout.getStartDate(), blackout.getUntil()) start_time = blackout.getStartDate().time() end_time = blackout.getEndDate().time() for i in dates: self.assertEquals(i[0].time(), start_time) self.assertEquals(i[1].time(), end_time)
def test_get_time_not_schedulable(self): "Test a number of overlapping bad things" # First bad thing: a receiver schedule that leaves out our rx # Schedule = 4/01/2009: 450, 600, 800 # 4/06/2009: 600, 800, 1070 # 4/11/2009: 800, 1070, 1_2 # 4/16/2009: 1070, 1_2, 2_3 # 4/21/2009: 1_2, 2_3, 4_6 # 4/26/2009: 2_3, 4_6, 8_10 # 5/01/2009: 4_6, 8_10, 12_18 # 5/06/2009: 8_10, 12_18, 18_26 # 5/11/2009: 12_18, 18_26, 26_40 start = datetime(2009, 4, 1, 0) # April 1 end = datetime(2009, 6, 1, 0) # June 1 rcvr_id = 3 for i in range(9): start_date = start + timedelta(5*i) for j in range(1, 4): rcvr_id = rcvr_id + 1 rs = Receiver_Schedule() rs.start_date = start_date rs.receiver = Receiver.objects.get(id = rcvr_id) rs.save() rcvr_id = rcvr_id - 2 # Now add some receivers to this session SessionHttpAdapter(self.sesshun).save_receivers('L | (X & S)') blackouts = self.sesshun.get_time_not_schedulable(start, end) # No available receivers at these times: exp = [(datetime(2009, 4, 1), datetime(2009, 4, 11)) , (datetime(2009, 5, 1), end) ] expected = set(exp) self.assertEquals(exp, blackouts) # Now add a project w/ prescheduled times. otherproject = Project() pdata = {"semester" : "09A" , "type" : "science" , "total_time" : "10.0" , "PSC_time" : "10.0" , "sem_time" : "10.0" , "grade" : "4.0" , "notes" : "notes" , "schd_notes" : "scheduler's notes" } adapter = ProjectHttpAdapter(otherproject) adapter.update_from_post(pdata) othersesshun = create_sesshun() othersesshun.project = otherproject othersesshun.save() fdata = {'session' : othersesshun.id , 'date' : '2009-04-20' , 'time' : '13:00' , 'duration' : 1.0 , 'backup' : False} otherperiod = Period() adapter = PeriodHttpAdapter(otherperiod) adapter.init_from_post(fdata, 'UTC') otherperiod.state = Period_State.objects.filter(abbreviation = 'S')[0] otherperiod.save() #exp.append((datetime(2009, 4, 20, 13, 0), datetime(2009, 4, 20, 14, 0))) exp = [(datetime(2009, 4, 1), datetime(2009, 4, 11)) , (datetime(2009, 4, 20, 13), datetime(2009, 4, 20, 14)) , (datetime(2009, 5, 1), end) ] blackouts = self.sesshun.get_time_not_schedulable(start, end) self.assertEquals(exp, blackouts) # how much time is that? hrsNotSchedulable = sum([TimeAgent.timedelta2minutes(b[1] - b[0])/60.0\ for b in blackouts]) self.assertEquals(985.0, hrsNotSchedulable) # how does this work when limiting the range? newEnd = datetime(2009, 4, 3) blackouts = self.sesshun.get_time_not_schedulable(start, newEnd) self.assertEquals([(start, newEnd)], blackouts) # extend this with a Project Blackout blackout = create_blackout(project = self.sesshun.project, start = datetime(2009, 4, 18, 12), end = datetime(2009, 4, 23, 12), repeat = 'Once') exp = [(datetime(2009, 4, 1), datetime(2009, 4, 11)) , (datetime(2009, 4, 18, 12), datetime(2009, 4, 23, 12)) , (datetime(2009, 5, 1), end) ] blackouts = self.sesshun.get_time_not_schedulable(start, end) self.assertEquals(exp, blackouts) # test the time available blacked out calculations # Calculate the expected result: # it turns out that the project blackout overlaps with all # schedulable time, except for one hour on 4/20 hrsBlackedOut = (TimeAgent.timedelta2minutes(blackout.getEndDate() - blackout.getStartDate()) / 60.0) - 1.0 totalTime = TimeAgent.timedelta2minutes(end - start) / 60.0 hrsSchedulable = totalTime - hrsNotSchedulable s, b, ss, bb = self.sesshun.getBlackedOutSchedulableTime(start, end) self.assertEquals(hrsSchedulable, s) self.assertEquals(hrsBlackedOut, b) # test it some more, but in different ranges start = datetime(2009, 5, 1) s, b, ss, bb = self.sesshun.getBlackedOutSchedulableTime(start, end) self.assertEquals(0.0, b) start = datetime(2009, 4, 22) end = datetime(2009, 4, 26) totalTime = TimeAgent.timedelta2minutes(end - start) / 60.0 s, b, ss, bb = self.sesshun.getBlackedOutSchedulableTime(start, end) self.assertEquals(totalTime, s) self.assertEquals(36.0, b) # cleanup self.sesshun.receiver_group_set.all().delete()
def test_get_blackout_times1(self): # Create Investigator1's 3 blackouts. blackout11 = create_blackout(user = self.user1, repeat = 'Once', start = datetime(2009, 1, 1, 11), end = datetime(2009, 1, 3, 11)) blackout12 = create_blackout(user = self.user1, repeat = 'Once', start = datetime(2009, 1, 1, 18), end = datetime(2009, 1, 4, 18)) blackout13 = create_blackout(user = self.user1, repeat = 'Once', start = datetime(2009, 1, 2, 12), end = datetime(2009, 1, 4, 20)) # Create Investigator2's 2 blackouts. blackout21 = create_blackout(user = self.user2, repeat = 'Once', start = datetime(2009, 1, 1, 11), end = datetime(2009, 1, 3, 11)) blackout22 = create_blackout(user = self.user2, repeat = 'Once', start = datetime(2009, 1, 1, 18), end = datetime(2009, 1, 4, 13)) # Create Investigator 3's blackouts. blackout31 = create_blackout(user = self.user3, repeat = 'Once', start = datetime(2008, 12, 31, 11), end = datetime(2009, 1, 1, 9)) blackout32 = create_blackout(user = self.user3, repeat = 'Once', start = datetime(2009, 1, 2, 16), end = datetime(2009, 1, 3, 12)) # stay out of the blackouts range expected = [] today = datetime(2008, 1, 1) later = today + timedelta(days = 30) r = self.project.get_blackout_times(today, later) self.assertEquals(expected, r) # Now we can finally do our test. expected = [ (datetime(2009, 1, 1, 11), datetime(2009, 1, 4, 13)) ] today = datetime(2009, 1, 1) later = today + timedelta(days = 30) r = self.project.get_blackout_times(today, later) self.assertEquals(expected, r) # Now complicate things - add project blackouts pBlackout1 = create_blackout(project = self.project, repeat = 'Once', start = datetime(2009, 1, 4, 0), end = datetime(2009, 1, 5, 0)) pBlackout2 = create_blackout(project = self.project, repeat = 'Once', start = datetime(2009, 1, 6, 0), end = datetime(2009, 1, 8, 0)) # we should see the present result extended by the first # project blackout, in addition to the second blackout expected = [ (datetime(2009, 1, 6, 0), datetime(2009, 1, 8, 0)) , (datetime(2009, 1, 1, 11), datetime(2009, 1, 5, 0)) ] r = self.project.get_blackout_times(today, later) self.assertEquals(expected, r) # complicate things a bit more - use a weekly proj blackout pBlackout2.initialize(tz = 'UTC', repeat = Repeat.objects.get(repeat = 'Weekly'), start = datetime(2009, 1, 6, 0), end = datetime(2009, 1, 8, 0), until = datetime(2010, 1, 1, 0)) # we should see similar results to before, but now the weeklys expected = [ (datetime(2009, 1, 6, 0), datetime(2009, 1, 8, 0)) , (datetime(2009, 1, 13, 0), datetime(2009, 1, 15, 0)) , (datetime(2009, 1, 20, 0), datetime(2009, 1, 22, 0)) , (datetime(2009, 1, 27, 0), datetime(2009, 1, 29, 0)) , (datetime(2009, 1, 1, 11), datetime(2009, 1, 5, 0)) ] r = self.project.get_blackout_times(today, later) self.assertEquals(expected, r) # but what if the investigators show up on site? res1 = Reservation(user = self.user3 , start_date = datetime(2009, 1, 1, 0) , end_date = datetime(2009, 1, 2, 0) ) res1.save() expected = [(today, datetime(2009, 1, 1, 9)) , (datetime(2009, 1, 2, 16), later)] r = self.project.get_unsanctioned_users_blackout_times(today, later) self.assertEquals(expected, r) expected = [(datetime(2009, 1, 2, 16), datetime(2009, 1, 4, 13))] r = self.project.get_users_blackout_times(today, later) self.assertEquals(expected, r) expected = [ (datetime(2009, 1, 6, 0), datetime(2009, 1, 8, 0)) , (datetime(2009, 1, 13, 0), datetime(2009, 1, 15, 0)) , (datetime(2009, 1, 20, 0), datetime(2009, 1, 22, 0)) , (datetime(2009, 1, 27, 0), datetime(2009, 1, 29, 0)) , (datetime(2009, 1, 2, 16), datetime(2009, 1, 5, 0)) ] r = self.project.get_blackout_times(today, later) self.assertEquals(expected, r) # Q: what is the behavior when blackouts straddle range? # A: returned blackouts are NOT truncated newLater = datetime(2009, 1, 4, 12) r = self.project.get_blackout_times(today, newLater) expected = [(datetime(2009, 1, 2, 16), datetime(2009, 1, 5))] self.assertEquals(expected, r) # Clean up res1.delete() blackout32.delete() blackout31.delete() blackout22.delete() blackout21.delete() blackout13.delete() blackout12.delete() blackout11.delete()
def test_pt_dst(self): # dates are given as UTC dates even though the timezone is # given as a local timezone. This is the way the blackout # view works. :/ localstart = datetime(2011, 1, 1, 11) localend = datetime(2011, 1, 4, 13) localuntil = datetime(2011, 12, 4, 11) utcstart = tz_to_tz(localstart, 'US/Pacific', 'UTC', naive = True) utcend = tz_to_tz(localend, 'US/Pacific', 'UTC', True) utcuntil = tz_to_tz(localuntil, 'US/Pacific', 'UTC', True) spring, fall = dst_boundaries('US/Pacific', utcstart, utcuntil) my_bo = create_blackout(user = self.u, repeat = 'Weekly', start = utcstart, end = utcend, until = utcuntil, timezone = 'US/Pacific') # generate 'UTC' sequence of blackout dates for standard time # until spring transition. dates = my_bo.generateDates(utcstart, spring, local_timezone = False) self.assertNotEquals(len(dates), 0) # All the dates except the last one are in standard time. for i in range(0, len(dates) - 1): self.assertEquals(dates[i][0].time(), utcstart.time()) self.assertEquals(dates[i][1].time(), utcend.time()) # the last one straddles DST, so end should be an hour earlier in UTC. self.assertEquals(dates[-1][0].time(), utcstart.time()) self.assertEquals(dates[-1][1].time(), (utcend - timedelta(hours = 1)).time()) # generate 'UTC' sequence of blackout dates for spring DST # transition until fall transition. This sequence will # include 2 transition blackouts over both DST transitions: one_hour = timedelta(hours = 1) dates = my_bo.generateDates(spring, fall, local_timezone = False) self.assertNotEquals(len(dates), 0) self.assertEquals(dates[0][0].time(), utcstart.time()) self.assertEquals(dates[0][1].time(), (utcend - one_hour).time()) for i in range(1, len(dates) - 1): self.assertEquals(dates[i][0].time(), (utcstart - one_hour).time()) self.assertEquals(dates[i][1].time(), (utcend - one_hour).time()) self.assertEquals(dates[-1][0].time(), (utcstart - one_hour).time()) self.assertEquals(dates[-1][1].time(), utcend.time()) # generate 'UTC' sequence of blackout dates from fall # transition until the 'until' time. Back to standard time. # The first blackout in the range will be a transition # blackout. dates = my_bo.generateDates(fall, utcuntil, local_timezone = False) self.assertNotEquals(len(dates), 0) self.assertEquals(dates[0][0].time(), (utcstart - one_hour).time()) self.assertEquals(dates[0][1].time(), utcend.time()) for i in range(1, len(dates)): self.assertEquals(dates[i][0].time(), utcstart.time()) self.assertEquals(dates[i][1].time(), utcend.time()) # generate local timezone sequence of blackout dates for the # entire range. Despite the complexity of the underlying UTC # representation, the local times should all be the same. dates = my_bo.generateDates(utcstart, utcuntil, local_timezone = True) self.assertNotEquals(len(dates), 0) for i in dates: self.assertEquals(i[0].time(), localstart.time()) self.assertEquals(i[1].time(), localend.time())