def testFindAlertLevels(self): wa = WindowAlerts.WindowAlerts() now = datetime(2009, 1, 1) # we 37/144 = 25% of scheduble time blacked out # so we should raise a level 1 alert ns = wa.findAlertLevels(now) self.assertEquals(1, len(ns)) self.assertEquals(self.window, ns[0][0]) self.assertEquals(1, ns[0][2]) # if we introduce more blacked out time, we should # see this elevate to a level 2 alert blackout = create_blackout(project = self.project, start = datetime(2009, 4, 8), end = datetime(2009, 4, 11), repeat = 'Once') ns = wa.findAlertLevels(now) self.assertEquals(1, len(ns)) self.assertEquals(self.window, ns[0][0]) self.assertEquals(2, ns[0][2]) # level two!
def create_blackout(self): b = create_blackout(user = self.u, start = datetime(2009, 1, 1), end = datetime(2009, 12, 31), repeat = 'Once', description = "This is a test blackout.") return b
def create_blackout_for_project(self): b = create_blackout(project = self.p, start = datetime(2009, 1, 1), end = datetime(2009, 12, 31), repeat = 'Once', description = "This is a test blackout for a project.") return b
def testGetWindowTimes(self): # test wa = WindowAlerts.WindowAlerts() now = datetime(2009, 1, 1) times = wa.getWindowTimes(now) # expected result sch = [(datetime(2009, 4, 6), self.window.end_datetime()) ] bss = [(datetime(2009, 4, 6), datetime(2009, 4, 7, 13, 0))] schHrs = TimeAgent.timedelta2minutes(sch[0][1] - sch[0][0])/60.0 bssHrs = TimeAgent.timedelta2minutes(bss[0][1] - bss[0][0])/60.0 exp = [(self.window , (schHrs , bssHrs , sch , [bss]))] self.assertEquals(exp[0][0], times[0][0]) self.assertEquals(exp[0][1], times[0][1]) # add some blacked out time - 3 days bsStart = datetime(2009, 4, 8) bsEnd = datetime(2009, 4, 11) blackout = create_blackout(project = self.project, start = bsStart, end = bsEnd, repeat = 'Once') bss.insert(0, (bsStart, bsEnd)) bssHrs += 3*24 times = wa.getWindowTimes(now) exp = [(self.window , (schHrs , bssHrs , sch , [bss]))] self.assertEquals(exp[0][0], times[0][0]) self.assertEquals(exp[0][1], times[0][1]) # move the current time forward now = datetime(2009, 4, 9, 12, 15, 0) times = wa.getWindowTimes(now) sch = [(now, self.window.end_datetime()) ] bss = [(now, bsEnd)] schHrs = TimeAgent.timedelta2minutes(sch[0][1] - sch[0][0])/60.0 bssHrs = TimeAgent.timedelta2minutes(bss[0][1] - bss[0][0])/60.0 exp = [(self.window , (schHrs , bssHrs , sch , [bss]))] self.assertEquals(exp[0][0], times[0][0]) self.assertEquals(exp[0][1], times[0][1])
def setUp(self): super(TestWindowAlerts, self).setUp() # setup a project with: # * a user with blackouts # * a windowed session # * a number of windows # make the calendar look like this: # windows: # 4/5 - 4/12 5/5 - 5/12 # default periods: # 4/10 # user 1 blackouts: # 4/1 - 4/3 # 4/1 - 4/7 # 4/2 - 4/4 # user 1 blackouts: # 4/1 - 4/3 # 4/1 - 4/7 # blacked out time: # 4/1 - 4/7 self.project = Project() self.project_adapter = ProjectHttpAdapter(self.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" } self.project_adapter.update_from_post(pdata) # Create the first user (on project) self.user1 = User(sanctioned = True) self.user1.save() self.user1.addRole("Observer") self.investigator1 = Investigator(project = self.project , user = self.user1 , observer = True) self.investigator1.save() # Create the second user (on project) self.user2 = User(sanctioned = True) self.user2.save() self.user2.addRole("Observer") self.investigator2 = Investigator(project = self.project , user = self.user2 , observer = True) self.investigator2.save() # Create Investigator1's 3 blackouts. blackout11 = create_blackout(user = self.user1, repeat = 'Once', start = datetime(2009, 4, 1, 11), end = datetime(2009, 4, 3, 11)) blackout12 = create_blackout(user = self.user1, repeat = 'Once', start = datetime(2009, 4, 1, 18), end = datetime(2009, 4, 7, 18)) blackout13 = create_blackout(user = self.user1, repeat = 'Once', start = datetime(2009, 4, 2, 12), end = datetime(2009, 4, 7, 20)) # Create Investigator2's 2 blackouts. blackout21 = create_blackout(user = self.user2, repeat = 'Once', start = datetime(2009, 4, 1, 11), end = datetime(2009, 4, 3, 11)) blackout22 = create_blackout(user = self.user2, repeat = 'Once', start = datetime(2009, 4, 1, 18), end = datetime(2009, 4, 7, 13)) # make a session self.sesshun = create_sesshun() self.sesshun.session_type = \ Session_Type.objects.get(type = "windowed") self.sesshun.project = self.project # '1070' available 4/6 - 4/16 SessionHttpAdapter(self.sesshun).save_receivers('1070') self.sesshun.save() # make the first window self.window = Window(session = self.sesshun #, start_date = date(2009, 4, 5) #, duration = 7 , total_time = 4.0 , complete = False) self.window.save() wr = WindowRange(window = self.window , start_date = date(2009, 4, 5) , duration = 7) wr.save() # make a period for it fdata = {'session' : self.sesshun.id , 'date' : '2009-04-10' , 'time' : '10:00' , 'duration' : 4.0 , 'backup' : False} self.period = Period() self.period_adapter = PeriodHttpAdapter(self.period) self.period_adapter.init_from_post(fdata, 'UTC') # link the period and window self.period.window = self.window self.period.save() self.window.default_period = self.period self.window.save() # setup a receiver schedule # 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) end = datetime(2009, 6, 1, 0) 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
def setUp(self): super(TestElectiveAlerts, self).setUp() # setup a project with: # * two users with blackouts # * two elective sessions # * limited receiver availability # make the calendar look like this: # electives: # 1: 4/2,4/3,4/7,4/9 & 2: 4/8,4/14,4/20 # user 1 blackouts: # 4/1 - 4/3 # 4/5 - 4/7 # user 2 blackouts: # 4/1 - 4/4 # 4/3 - 4/8 self.project = Project() self.project_adapter = ProjectHttpAdapter(self.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", } self.project_adapter.update_from_post(pdata) # Create the first user (on project) self.user1 = User(sanctioned=True) self.user1.save() self.investigator1 = Investigator(project=self.project, user=self.user1, observer=True) self.investigator1.save() # Create the second user (on project) self.user2 = User(sanctioned=True) self.user2.save() self.investigator2 = Investigator(project=self.project, user=self.user2, observer=True) self.investigator2.save() # Create Investigator1's blackouts. blackout11 = create_blackout( user=self.user1, repeat="Once", start=datetime(2009, 4, 1, 11), end=datetime(2009, 4, 4, 20) ) blackout12 = create_blackout( user=self.user1, repeat="Once", start=datetime(2009, 4, 5, 18), end=datetime(2009, 4, 8, 9) ) blackout13 = create_blackout( user=self.user1, repeat="Once", start=datetime(2009, 4, 9, 2), end=datetime(2009, 4, 17, 9) ) # Create Investigator2's blackouts. blackout21 = create_blackout( user=self.user2, repeat="Once", start=datetime(2009, 4, 1, 11), end=datetime(2009, 4, 5, 11) ) blackout22 = create_blackout( user=self.user2, repeat="Once", start=datetime(2009, 4, 6, 18), end=datetime(2009, 4, 8, 10) ) blackout23 = create_blackout( user=self.user2, repeat="Once", start=datetime(2009, 4, 13, 18), end=datetime(2009, 4, 25, 13) ) # make a session self.sesshun = create_sesshun() self.sesshun.session_type = Session_Type.objects.get(type="elective") self.sesshun.project = self.project # '1070' available 4/6 - 4/16 SessionHttpAdapter(self.sesshun).save_receivers("1070") self.sesshun.save() # make the first elective self.elective1 = Elective(session=self.sesshun, complete=False) self.elective1.save() # make periods for it (10:15-14:15) dates = ["2009-04-02", "2009-04-03", "2009-04-07", "2009-04-09"] for date in dates: fdata = {"session": self.sesshun.id, "date": date, "time": "10:00", "duration": 4.0, "backup": False} period = Period() period_adapter = PeriodHttpAdapter(period) period_adapter.init_from_post(fdata, "UTC") # link the period and elective period.elective = self.elective1 period.save() # make the second elective self.elective2 = Elective(session=self.sesshun, complete=False) self.elective2.save() # make periods for it (09:30-13:30) dates = ["2009-04-08", "2009-04-14", "2009-04-20"] for date in dates: fdata = {"session": self.sesshun.id, "date": date, "time": "09:30", "duration": 4.5, "backup": False} period = Period() period_adapter = PeriodHttpAdapter(period) period_adapter.init_from_post(fdata, "UTC") # link the period and elective period.elective = self.elective2 period.save() # setup a receiver schedule # 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) end = datetime(2009, 6, 1, 0) 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
def test_event(self): start = datetime(2011, 8, 1) end = datetime(2011, 9, 1) # what a pain in the ass: need to convert times to floats fmt = "%Y-%m-%d %H-%M-%S" startStr = start.strftime(fmt) endStr = end.strftime(fmt) data = { 'start' : time.mktime(time.strptime(startStr, fmt)) , 'end' : time.mktime(time.strptime(endStr, fmt)) } response = self.get('/project/%s/events' % self.p.pcode, data) self.failUnlessEqual(response.status_code, 200) exp = [{"className": "semester", "start": "2012-02-01T00:00:00", "id": 1, "title": "Start of 12A"} , {"className": "semester", "start": "2012-08-01T00:00:00", "id": 2, "title": "Start of 12B"}] result = eval(response.content) self.assertEquals(result, exp) # now add a user w/ reservations and blackouts # (oops, it only grabs UPCOMING reservations, so we # can't test the reservations!!!) dana = User(first_name = "Dana" , last_name = "Balser" , pst_id = 18 ) dana.save() i = Investigator(project = self.p , user = dana ) i.save() b = create_blackout(user = dana, start = start + timedelta(days = 2), end = start + timedelta(days = 7), repeat = 'Once') # then a period pa = Period_Accounting(scheduled = 3.0) pa.save() p = Period(session = self.s , start = start + timedelta(days = 3) , duration = 3.0 , state = Period_State.get_state('S') , accounting = pa ) p.save() # now see what we get response = self.get('/project/%s/events' % self.p.pcode, data) self.failUnlessEqual(response.status_code, 200) exp = [{"className": "blackout", "start": "2011-08-03T00:00:00+00:00", "end": "2011-08-07T23:45:00+00:00", "title": "Dana Balser: blackout"} , {"className": "period", "start": "2011-08-04T00:00:00+00:00", "end": "2011-08-04T03:00:00", "title": "Observing Low Frequency With No RFI"} , {"className": "semester", "start": "2012-02-01T00:00:00", "title": "Start of 12A"} , {"className": "semester", "start": "2012-08-01T00:00:00", "title": "Start of 12B"} ] result = eval(response.content) # now, since we don't have control of reservations, if there is a reservation, remove it filteredResult = [r for r in result if not r.has_key('className') or r['className'] != 'reservation'] # we have to remove the id as well, since there's no guarantee what this will be for r in filteredResult: r.pop('id') self.assertEquals(len(filteredResult), len(exp)) for r in filteredResult: self.assertTrue(r in exp)