示例#1
0
    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)
示例#2
0
    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))
示例#3
0
    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()
示例#4
0
    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()
示例#5
0
    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()
示例#6
0
    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))
示例#7
0
    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)
示例#8
0
    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()
示例#9
0
    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()
示例#10
0
    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())