def testWhenEver(self):
     event = RecurringEventPage(slug="XYZ",
                                title="Xylophone yacht zombies",
                                repeat=Recurrence(dtstart=dt.date(
                                    1989, 1, 1),
                                                  freq=WEEKLY,
                                                  byweekday=[FR]),
                                time_from=dt.time(19),
                                holidays=self.calendar.holidays)
     self.calendar.add_child(instance=event)
     closedHols = ClosedForHolidaysPage(owner=self.user,
                                        overrides=event,
                                        all_holidays=False,
                                        cancellation_title="XYZ Cancelled",
                                        holidays=self.calendar.holidays)
     closedHols.closed_for = [
         ClosedFor(name="Good Friday"),
         ClosedFor(name="Easter Monday")
     ]
     event.add_child(instance=closedHols)
     closedHols.save_revision().publish()
     self.assertEqual(closedHols.when,
                      "Closed on Good Friday and Easter Monday")
     self.assertIs(event._occursOn(dt.date(1989, 3, 24)), False)
class Test(TestCase):
    def setUp(self):
        self.home = Page.objects.get(slug='home')
        self.user = User.objects.create_user('i', '*****@*****.**', 's3(r3t')
        self.calendar = CalendarPage(owner=self.user,
                                     slug="events",
                                     title="Events")
        self.home.add_child(instance=self.calendar)
        self.calendar.save_revision().publish()
        self.event = RecurringEventPage(slug="test-meeting",
                                        title="Test Meeting",
                                        repeat=Recurrence(
                                            dtstart=dt.date(1989, 1, 1),
                                            freq=WEEKLY,
                                            byweekday=[MO, WE, FR]),
                                        time_from=dt.time(13),
                                        time_to=dt.time(15, 30),
                                        holidays=self.calendar.holidays)
        self.calendar.add_child(instance=self.event)
        self.closedHols = ClosedForHolidaysPage(
            owner=self.user,
            overrides=self.event,
            all_holidays=True,
            holidays=self.calendar.holidays)
        self.event.add_child(instance=self.closedHols)
        self.closedHols.save_revision().publish()

    def testCanCreateOnlyOne(self):
        self.assertFalse(ClosedForHolidaysPage.can_create_at(self.event))

    def testInit(self):
        self.assertEqual(self.closedHols.all_holidays, True)
        self.assertEqual(self.closedHols.title, "Closed for holidays")
        self.assertEqual(self.closedHols.local_title, "Closed for holidays")
        self.assertEqual(self.closedHols.slug, "closed-for-holidays")

    def testGetEventsByDay(self):
        events = RecurringEventPage.events.hols(self.calendar.holidays)      \
                                   .byDay(dt.date(1989,1,1), dt.date(1989,1,31))
        self.assertEqual(len(events), 31)
        evod = events[0]
        self.assertEqual(evod.date, dt.date(1989, 1, 1))
        self.assertEqual(evod.holiday, "New Year's Day")
        self.assertEqual(len(evod.days_events), 0)
        self.assertEqual(len(evod.continuing_events), 0)

    @freeze_timetz("1990-11-11 16:29:00")
    def testEventFutureExceptions(self):
        request = RequestFactory().get("/test")
        request.user = self.user
        request.session = {}
        exceptions = self.event._futureExceptions(request)
        self.assertEqual(len(exceptions), 1)
        c4h = exceptions[0]
        self.assertEqual(c4h.title, "Closed for holidays")
        self.assertEqual(c4h._future_datetime_from,
                         datetimetz(1990, 11, 16, 13, 0))

    def testEventOccursOn(self):
        self.assertIs(self.event._occursOn(dt.date(1989, 1, 1)), False)
        self.assertIs(self.event._occursOn(dt.date(1989, 1, 2)), False)
        self.assertIs(self.event._occursOn(dt.date(1989, 1, 6)), True)
        self.assertIs(self.event._occursOn(dt.date(1989, 1, 16)), False)

    @freeze_timetz("2022-12-24")
    def testEventNextDate(self):
        self.assertEqual(self.event.next_date, dt.date(2022, 12, 28))

    @freeze_timetz("2023-01-31")
    def testEventPastDatetime(self):
        self.assertEqual(self.event._past_datetime_from,
                         datetimetz(2023, 1, 27, 13, 0))

    @freeze_timetz("1990-10-11 16:29:00")
    def testGetUpcomingEvents(self):
        event = RecurringEventPage(slug="RST",
                                   title="Ruritania secret taxidermy",
                                   repeat=Recurrence(dtstart=dt.date(
                                       1980, 1, 1),
                                                     freq=MONTHLY,
                                                     byweekday=[MO(1)]),
                                   time_from=dt.time(20))
        self.calendar.add_child(instance=event)
        closedHols = ClosedForHolidaysPage(
            owner=self.user,
            overrides=event,
            all_holidays=False,
            cancellation_title="Closed for the holiday")
        closedHols.closed_for = [
            ClosedFor(name="Wellington Anniversary Day"),
            ClosedFor(name="Auckland Anniversary Day"),
            ClosedFor(name="Nelson Anniversary Day"),
            ClosedFor(name="Taranaki Anniversary Day"),
            ClosedFor(name="Otago Anniversary Day"),
            ClosedFor(name="Southland Anniversary Day"),
            ClosedFor(name="South Canterbury Anniversary Day"),
            ClosedFor(name="Hawke's Bay Anniversary Day"),
            ClosedFor(name="Marlborough Anniversary Day"),
            ClosedFor(name="Canterbury Anniversary Day"),
            ClosedFor(name="Chatham Islands Anniversary Day"),
            ClosedFor(name="Westland Anniversary Day")
        ]
        event.add_child(instance=closedHols)
        closedHols.save_revision().publish()
        events = ClosedForHolidaysPage.events.hols(self.calendar.holidays)   \
                                      .exclude(cancellation_title="")        \
                                      .upcoming().this().descendant_of(event)
        self.assertEqual(len(events), 1)
        title, page, url = events[0]
        self.assertEqual(title, "Closed for the holiday")
        self.assertEqual(page._future_datetime_from,
                         datetimetz(1990, 12, 3, 20, 0))
        self.assertEqual(url, "/events/RST/closed-for-holidays/")

    @freeze_timetz("1990-10-11 16:29:00")
    def testGetPastEvents(self):
        events = ClosedForHolidaysPage.events.hols(self.calendar.holidays)   \
                                      .past().this()
        self.assertEqual(len(events), 1)
        title, page, url = events[0]
        self.assertEqual(title, "")
        self.assertEqual(page._past_datetime_from,
                         datetimetz(1990, 9, 24, 13, 0))
        self.assertEqual(url, "/events/test-meeting/closed-for-holidays/")

    @freeze_timetz("1990-10-11 16:29:00")
    def testWombatGetEventsByDay(self):
        event = RecurringEventPage(slug="UVW",
                                   title="Underwater viking wombats",
                                   repeat=Recurrence(dtstart=dt.date(
                                       1989, 1, 1),
                                                     freq=MONTHLY,
                                                     byweekday=[MO(1)]),
                                   time_from=dt.time(19))
        self.calendar.add_child(instance=event)
        closedHols = ClosedForHolidaysPage(owner=self.user,
                                           overrides=event,
                                           all_holidays=False,
                                           cancellation_title="UVW Cancelled")
        closedHols.closed_for = [
            ClosedFor(name="New Year's Day"),
            ClosedFor(name="Day after New Year's Day"),
            ClosedFor(name="Good Friday"),
            ClosedFor(name="Easter Monday"),
            ClosedFor(name="Christmas Day"),
            ClosedFor(name="Boxing Day")
        ]
        event.add_child(instance=closedHols)
        closedHols.save_revision().publish()
        events = RecurringEventPage.events.hols(self.calendar.holidays)      \
                                   .byDay(dt.date(1989,1,1), dt.date(1989,1,31))
        self.assertEqual(len(events), 31)
        evod = events[1]
        self.assertEqual(evod.date, dt.date(1989, 1, 2))
        self.assertEqual(evod.holiday, "Day after New Year's Day")
        self.assertEqual(len(evod.days_events), 1)
        self.assertEqual(len(evod.continuing_events), 0)
        title, page, url = evod.all_events[0]
        self.assertEqual(title, "UVW Cancelled")
        self.assertEqual(page.title, "Closed for holidays")
        self.assertEqual(page.at, "7pm")
        self.assertEqual(url, "/events/UVW/closed-for-holidays/")

    def testClosedForDates(self):
        dates = list(islice(self.closedHols._closed_for_dates, 10))
        self.assertEqual(dates, [
            dt.date(1989, 1, 2),
            dt.date(1989, 1, 16),
            dt.date(1989, 1, 23),
            dt.date(1989, 1, 30),
            dt.date(1989, 2, 6),
            dt.date(1989, 3, 13),
            dt.date(1989, 3, 20),
            dt.date(1989, 3, 24),
            dt.date(1989, 3, 27),
            dt.date(1989, 6, 5)
        ])

    def testGetMyDates(self):
        event = RecurringEventPage(slug="UVW",
                                   title="Underwater viking wombats",
                                   repeat=Recurrence(dtstart=dt.date(
                                       1989, 1, 1),
                                                     freq=MONTHLY,
                                                     byweekday=[MO(1)]),
                                   time_from=dt.time(19))
        self.calendar.add_child(instance=event)
        closedHols = ClosedForHolidaysPage(owner=self.user,
                                           overrides=event,
                                           all_holidays=False)
        event.add_child(instance=closedHols)
        closedHols.save_revision().publish()
        dates = list(islice(closedHols._getMyDates(), 10))
        self.assertEqual(dates, [])
        closedHols.holidays = self.calendar.holidays
        dates = list(islice(closedHols._getMyDates(), 10))
        self.assertEqual(dates, [])
        closedHols.closed_for = [ClosedFor(name="Good Friday")]
        # Good Friday is never going to fall on a Monday
        dates = list(islice(closedHols._getMyDates(), 10))
        self.assertEqual(dates, [])

    def testClosedOn(self):
        event = RecurringEventPage(slug="XYZ",
                                   title="Xylophone yacht zombies",
                                   repeat=Recurrence(dtstart=dt.date(
                                       1989, 1, 1),
                                                     freq=WEEKLY,
                                                     byweekday=[FR]),
                                   time_from=dt.time(19),
                                   holidays=self.calendar.holidays)
        self.calendar.add_child(instance=event)
        closedHols = ClosedForHolidaysPage(owner=self.user,
                                           overrides=event,
                                           all_holidays=False,
                                           cancellation_title="XYZ Cancelled")
        event.add_child(instance=closedHols)
        closedHols.save_revision().publish()
        self.assertEqual(closedHols._closedOn(dt.date(1989, 3, 24)), False)
        closedHols.holidays = self.calendar.holidays
        self.assertEqual(closedHols._closedOn(dt.date(1989, 3, 24)), False)

    def testStatus(self):
        self.assertEqual(self.closedHols.status, "cancelled")
        self.assertEqual(self.closedHols.status_text, "Closed for holidays.")

    def testWhen(self):
        self.assertEqual(self.closedHols.when, "Closed on all holidays")

    def testWhenEver(self):
        event = RecurringEventPage(slug="XYZ",
                                   title="Xylophone yacht zombies",
                                   repeat=Recurrence(dtstart=dt.date(
                                       1989, 1, 1),
                                                     freq=WEEKLY,
                                                     byweekday=[FR]),
                                   time_from=dt.time(19),
                                   holidays=self.calendar.holidays)
        self.calendar.add_child(instance=event)
        closedHols = ClosedForHolidaysPage(owner=self.user,
                                           overrides=event,
                                           all_holidays=False,
                                           cancellation_title="XYZ Cancelled",
                                           holidays=self.calendar.holidays)
        closedHols.closed_for = [
            ClosedFor(name="Good Friday"),
            ClosedFor(name="Easter Monday")
        ]
        event.add_child(instance=closedHols)
        closedHols.save_revision().publish()
        self.assertEqual(closedHols.when,
                         "Closed on Good Friday and Easter Monday")
        self.assertIs(event._occursOn(dt.date(1989, 3, 24)), False)

    # def testActualHolidaysClosed(self):
    #     event = RecurringEventPage(slug      = "Z1",
    #                                title     = "ZetaOne",
    #                                repeat    = Recurrence(dtstart=dt.date(2020,1,1),
    #                                                       freq=DAILY),
    #                                time_from = dt.time(19),
    #                                holidays = self.calendar.holidays)
    #     self.calendar.add_child(instance=event)
    #     closedHols = ClosedForHolidaysPage(owner = self.user,
    #                                        overrides = event,
    #                                        all_holidays = False,
    #                                        cancellation_title = "Z1 Cancelled",
    #                                        holidays = self.calendar.holidays)
    #     closedHols.closed_for = [ ClosedFor(name="New Year's Day"),
    #                               ClosedFor(name="New Year's Day (Observed)"),
    #                               ClosedFor(name="Labour Day"),
    #                               ClosedFor(name="Christmas Day"),
    #                               ClosedFor(name="Christmas Day (Observed)") ]
    #     event.add_child(instance=closedHols)
    #     closedHols.save_revision().publish()
    #     self.assertCountEqual(closedHols._actual_closed_for_names,
    #                           ["New Year's Day",
    #                            "New Year's Day (Observed)",
    #                            "Labour Day",
    #                            "Christmas Day",
    #                            "Christmas Day (Observed)"])

    def testAt(self):
        self.assertEqual(self.closedHols.at.strip(), "1pm")

    @freeze_timetz("1989-02-15")
    def testCurrentDt(self):
        # Taranaki Anniversary Day
        self.assertEqual(self.closedHols._current_datetime_from,
                         datetimetz(1989, 3, 13, 13, 0))

    @freeze_timetz("1989-02-15")
    def testFutureDt(self):
        # Taranaki Anniversary Day
        self.assertEqual(self.closedHols._future_datetime_from,
                         datetimetz(1989, 3, 13, 13, 0))

    @freeze_timetz("1989-02-15")
    def testPastDt(self):
        # Waitangi Day
        self.assertEqual(self.closedHols._past_datetime_from,
                         datetimetz(1989, 2, 6, 13, 0))

    @freeze_timetz("1989-02-15")
    def testFutureDtNoHolidays(self):
        self.closedHols.holidays = None
        self.assertEqual(self.closedHols._future_datetime_from,
                         ClosedForHolidaysPage.MAX_DATETIME)

    @freeze_timetz("1989-02-15")
    def testPastDtNoHolidays(self):
        self.closedHols.holidays = None
        self.assertEqual(self.closedHols._past_datetime_from,
                         ClosedForHolidaysPage.MIN_DATETIME)

    @freeze_timetz("1989-02-15")
    def testFutureDtCancelled(self):
        # a cancellation page trumps the holiday
        cancellation = CancellationPage(owner=self.user,
                                        overrides=self.event,
                                        except_date=dt.date(1989, 3, 13))
        self.event.add_child(instance=cancellation)
        self.assertEqual(self.closedHols._future_datetime_from,
                         datetimetz(1989, 3, 20, 13, 0))

    @freeze_timetz("1989-02-15")
    def testPastDtCancelled(self):
        # a cancellation page trumps the holiday
        cancellation = CancellationPage(owner=self.user,
                                        overrides=self.event,
                                        except_date=dt.date(1989, 2, 6))
        self.event.add_child(instance=cancellation)
        self.assertEqual(self.closedHols._past_datetime_from,
                         datetimetz(1989, 1, 30, 13, 0))

    @freeze_timetz("1989-02-15")
    def testPastDtShut(self):
        # a shutdown page trumps the holiday
        shutdown = ExtCancellationPage(owner=self.user,
                                       overrides=self.event,
                                       cancelled_from_date=dt.date(
                                           1989, 1, 29),
                                       cancelled_to_date=dt.date(1989, 2, 10))
        self.event.add_child(instance=shutdown)
        self.assertEqual(self.closedHols._past_datetime_from,
                         datetimetz(1989, 1, 23, 13, 0))

    @freeze_timetz("1989-02-15")
    def testFutureDtShut(self):
        # a shutdown page trumps the holiday
        shutdown = ExtCancellationPage(owner=self.user,
                                       overrides=self.event,
                                       cancelled_from_date=dt.date(
                                           1989, 3, 12),
                                       cancelled_to_date=dt.date(1989, 3, 20))
        self.event.add_child(instance=shutdown)
        self.assertEqual(self.closedHols._future_datetime_from,
                         datetimetz(1989, 3, 24, 13, 0))

    @freeze_timetz("1989-02-15")
    def testFutureDtShutUntilFurtherNotice(self):
        # a shutdown page trumps the holiday
        shutdown = ExtCancellationPage(owner=self.user,
                                       overrides=self.event,
                                       cancelled_from_date=dt.date(
                                           1989, 3, 12))
        self.event.add_child(instance=shutdown)
        self.assertIsNone(self.closedHols._future_datetime_from)

    @freeze_timetz("1989-02-15")
    def testFarFutureDt(self):
        event = RecurringEventPage(slug="UVW",
                                   title="Underwater viking wombats",
                                   repeat=Recurrence(dtstart=dt.date(
                                       1989, 1, 1),
                                                     freq=MONTHLY,
                                                     bymonthday=23),
                                   time_from=dt.time(19))
        self.calendar.add_child(instance=event)
        closedHols = ClosedForHolidaysPage(owner=self.user,
                                           overrides=event,
                                           all_holidays=False)
        event.add_child(instance=closedHols)
        closedHols.save_revision().publish()
        dates = list(islice(closedHols._getMyDates(), 10))
        self.assertEqual(dates, [])
        closedHols.holidays = self.calendar.holidays
        dates = list(islice(closedHols._getMyDates(), 10))
        self.assertEqual(dates, [])
        closedHols.closed_for = [ClosedFor(name="Good Friday")]
        # Good Friday falls on 2038-04-23 but that is too far to calculate
        self.assertEqual(closedHols._future_datetime_from,
                         datetimetz(9999, 12, 29, 19, 0))

    def testGroup(self):
        self.assertIsNone(self.closedHols.group)

    def testOverridesRepeat(self):
        self.assertEqual(self.closedHols.overrides_repeat, self.event.repeat)

    def testGetContext(self):
        request = RequestFactory().get("/test")
        context = self.closedHols.get_context(request)
        self.assertIn('overrides', context)

    def testClosedForStr(self):
        xmas = ClosedFor(name="☧mas")
        self.assertEqual(str(xmas), "☧mas")
Exemplo n.º 3
0
class Test(TestCase):
    def setUp(self):
        Site.objects.update(hostname="joy.test")
        self.user = User.objects.create_user('i', '*****@*****.**', 's3cr3t')
        self.calendar = CalendarPage(owner = self.user,
                                     slug  = "events",
                                     title = "Events")
        Page.objects.get(slug='home').add_child(instance=self.calendar)
        self.calendar.save()
        self.calendar.save_revision().publish()
        self.event = RecurringEventPage(owner = self.user,
                                        slug  = "lug-meetup",
                                        title = "Linux Users Group Meetup",
                                        repeat = Recurrence(dtstart=dt.date(2017,8,5),
                                                            freq=MONTHLY,
                                                            byweekday=[TU(1)]),
                                        time_from = dt.time(18,30),
                                        time_to   = dt.time(20),
                                        location  = "6 Mackay St, Greymouth (upstairs)")
        self.calendar.add_child(instance=self.event)
        self.event.save_revision().publish()

    def testGetEventsByDay(self):
        events = RecurringEventPage.events.byDay(dt.date(2017,8,1),
                                                 dt.date(2017,10,31))
        self.assertEqual(len(events), 92)
        evod = events[35]
        self.assertEqual(evod.date, dt.date(2017,9,5))
        self.assertEqual(len(evod.all_events), 1)
        self.assertEqual(len(evod.days_events), 1)
        self.assertEqual(len(evod.continuing_events), 0)

    def testStatus(self):
        pastEvent = RecurringEventPage(owner = self.user,
                                       slug  = "past",
                                       title = "Past Event",
                                       repeat = Recurrence(dtstart=dt.date(2008,2,1),
                                                           until=dt.date(2008,5,4),
                                                           freq=WEEKLY,
                                                           byweekday=[SA,SU]))
        self.calendar.add_child(instance=pastEvent)
        self.assertEqual(pastEvent.status, "finished")
        self.assertEqual(pastEvent.status_text, "These events have finished.")
        now = timezone.localtime()
        earlier = now - dt.timedelta(hours=1)
        if earlier.date() != now.date():
            earlier = datetimetz(now.date(), dt.time.min)
        nowEvent = RecurringEventPage(owner = self.user,
                                      slug  = "now",
                                      title = "Now Event",
                                      repeat = Recurrence(dtstart=dt.date(2010,1,1),
                                                          freq=DAILY),
                                      time_from = earlier.time(),
                                      time_to   = dt.time.max)
        self.calendar.add_child(instance=nowEvent)
        self.assertEqual(nowEvent.status, "started")
        self.assertEqual(nowEvent.status_text, "This event has started.")
        today = timezone.localdate()
        notToday = [weekday for weekday in EVERYWEEKDAY if weekday.weekday != today.weekday()]
        pastAndFutureEvent = RecurringEventPage(owner = self.user,
                                                slug  = "not-today",
                                                title = "Any day but today",
                                                repeat = Recurrence(dtstart=dt.date(2009,8,7),
                                                                    freq=WEEKLY,
                                                                    byweekday=notToday))
        self.calendar.add_child(instance=pastAndFutureEvent)
        self.assertIsNone(pastAndFutureEvent.status)
        self.assertEqual(pastAndFutureEvent.status_text, "")

    @freeze_timetz("2008-05-04 09:01")
    def testJustFinishedStatus(self):
        event = RecurringEventPage(owner = self.user,
                                   slug  = "breakfast1",
                                   title = "Breakfast-in-bed",
                                   repeat = Recurrence(dtstart=dt.date(2008,2,1),
                                                       until=dt.date(2008,5,9),
                                                       freq=WEEKLY,
                                                       byweekday=[SA,SU]),
                                      time_from = dt.time(8),
                                      time_to   = dt.time(9))
        self.calendar.add_child(instance=event)
        self.assertEqual(event.status, "finished")

    @freeze_timetz("2008-05-04 07:00")
    def testLastOccurenceCancelledStatus(self):
        event = RecurringEventPage(owner = self.user,
                                   slug  = "breakfast2",
                                   title = "Breakfast-in-bed",
                                   repeat = Recurrence(dtstart=dt.date(2008,2,1),
                                                       until=dt.date(2008,5,9),
                                                       freq=WEEKLY,
                                                       byweekday=[SA,SU]),
                                   time_from = dt.time(8),
                                   time_to   = dt.time(9))
        self.calendar.add_child(instance=event)
        cancellation = CancellationPage(owner = self.user,
                                        overrides = event,
                                        except_date = dt.date(2008, 5, 4),
                                        cancellation_title   = "Fire in the kitchen",
                                        cancellation_details = "The bacon fat is burning")
        event.add_child(instance=cancellation)
        self.assertEqual(event.status, "finished")

    @freeze_timetz("2008-05-04 12:00")
    def testPostponementOccurenceLast(self):
        request = RequestFactory().get("/test")
        request.user = self.user
        request.session = {}
        event = RecurringEventPage(owner = self.user,
                                   slug  = "breakfast3",
                                   title = "Breakfast-in-bed",
                                   repeat = Recurrence(dtstart=dt.date(2008,2,1),
                                                       until=dt.date(2008,5,9),
                                                       freq=WEEKLY,
                                                       byweekday=[SA,SU]),
                                   time_from = dt.time(8),
                                   time_to   = dt.time(9))
        self.calendar.add_child(instance=event)
        postponement = PostponementPage(owner = self.user,
                                        overrides = event,
                                        except_date = dt.date(2008, 5, 3),
                                        postponement_title = "Breakfast in Bed owed from May",
                                        date      = dt.date(2008, 5, 24),
                                        time_from = dt.time(8),
                                        time_to   = dt.time(9))
        event.add_child(instance=postponement)
        self.assertIsNone(event.status)
        self.assertEqual(event._nextOn(request),
                         '<a class="inline-link" href="/events/breakfast3/2008-05-03-postponement/">Saturday 24th of May at 8am</a>')

    def testWhen(self):
        self.assertEqual(self.event.when, "The first Tuesday of the month at 6:30pm to 8pm")

    def testAt(self):
        self.assertEqual(self.event.at.strip(), "6:30pm")

    def testCurrentDt(self):
        lugDt = self.event._current_datetime_from
        self.assertEqual(lugDt.time(), dt.time(18,30))
        self.assertEqual(lugDt.date().weekday(), 1)
        self.assertLess(lugDt.date().day, 8)
        movieNight = RecurringEventPage(owner = self.user,
                                        slug  = "movies",
                                        title = "Movies",
                                        repeat = Recurrence(dtstart=dt.date(2005,2,1),
                                                            freq=WEEKLY,
                                                            byweekday=[TH,]),
                                        time_from = dt.time(20,15),
                                        time_to   = dt.time(21,30))
        self.calendar.add_child(instance=movieNight)
        now = timezone.localtime()
        myday = now.date()
        startTime = dt.time(20,15)
        if now.time() > startTime:
            myday += dt.timedelta(days=1)
        thursday = myday + dt.timedelta(days=(3-myday.weekday())%7)
        self.assertEqual(movieNight._current_datetime_from,
                         datetimetz(thursday, startTime))

    def testFutureDt(self):
        lugDt = self.event._future_datetime_from
        self.assertEqual(lugDt.time(), dt.time(18,30))
        self.assertEqual(lugDt.date().weekday(), 1)
        self.assertLess(lugDt.date().day, 8)
        movieNight = RecurringEventPage(owner = self.user,
                                        slug  = "movies",
                                        title = "Movies",
                                        repeat = Recurrence(dtstart=dt.date(2005,2,1),
                                                            freq=WEEKLY,
                                                            byweekday=[TH,]),
                                        time_from = dt.time(20,15),
                                        time_to   = dt.time(21,30))
        self.calendar.add_child(instance=movieNight)
        now = timezone.localtime()
        myday = now.date()
        startTime = dt.time(20,15)
        if now.time() > startTime:
            myday += dt.timedelta(days=1)
        thursday = myday + dt.timedelta(days=(3-myday.weekday())%7)
        self.assertEqual(movieNight._future_datetime_from,
                         datetimetz(thursday, startTime))

    def testPastDt(self):
        lugDt = self.event._past_datetime_from
        self.assertEqual(lugDt.time(), dt.time(18,30))
        self.assertEqual(lugDt.date().weekday(), 1)
        self.assertLess(lugDt.date().day, 8)
        movieNight = RecurringEventPage(owner = self.user,
                                        slug  = "movies",
                                        title = "Movies",
                                        repeat = Recurrence(dtstart=dt.date(2005,2,1),
                                                            freq=WEEKLY,
                                                            byweekday=[TH,]),
                                        time_from = dt.time(20,15),
                                        time_to   = dt.time(21,30))
        self.calendar.add_child(instance=movieNight)
        now = timezone.localtime()
        myday = now.date()
        startTime = dt.time(20,15)
        if now.time() < startTime:
            myday -= dt.timedelta(days=1)
        thursday = myday - dt.timedelta(days=(myday.weekday()-3)%7)
        self.assertEqual(movieNight._past_datetime_from,
                         datetimetz(thursday, startTime))

    def testGroup(self):
        self.assertIsNone(self.event.group)

    def testOccursOn(self):
        self.assertIs(self.event._occursOn(dt.date(2018,3,6)), True)
        self.assertIs(self.event._occursOn(dt.date(2018,3,13)), False)
class Test(TestCase):
    @freeze_timetz("2020-03-18")
    def setUp(self):
        self.home = Page.objects.get(slug='home')
        self.user = User.objects.create_user('i', '*****@*****.**', 's3(r3t')
        self.calendar = CalendarPage(owner=self.user,
                                     slug="events",
                                     title="Events")
        self.home.add_child(instance=self.calendar)
        self.calendar.save_revision().publish()
        self.event = RecurringEventPage(slug="test-meeting",
                                        title="Test Meeting",
                                        repeat=Recurrence(
                                            dtstart=dt.date(2010, 1, 1),
                                            freq=WEEKLY,
                                            byweekday=[MO, WE, FR]),
                                        time_from=dt.time(13),
                                        time_to=dt.time(14, 30))
        self.calendar.add_child(instance=self.event)
        self.shutdown = ExtCancellationPage(
            owner=self.user,
            overrides=self.event,
            cancelled_from_date=dt.date(2020, 3, 20),
            cancelled_to_date=dt.date(2020, 6, 1),
            cancellation_title="No Meeting during Shutdown")
        self.event.add_child(instance=self.shutdown)
        self.shutdown.save_revision().publish()

    @freeze_timetz("2021-01-04")
    def testInit(self):
        self.assertEqual(
            self.shutdown.title,
            "Cancellation from Friday 20th of March to Monday 1st of June")
        self.assertEqual(
            self.shutdown.local_title,
            "Cancellation from Friday 20th of March 2020 to Monday 1st of June 2020"
        )
        self.assertEqual(self.shutdown.slug,
                         "2020-03-20-2020-06-01-cancellation")

    def testGetEventsByDay(self):
        shutdown0 = ExtCancellationPage(owner=self.user,
                                        overrides=self.event,
                                        cancelled_from_date=dt.date(
                                            2020, 3, 2),
                                        cancelled_to_date=dt.date(2020, 3, 6))
        self.event.add_child(instance=shutdown0)
        shutdown0.save_revision().publish()
        events = RecurringEventPage.events.byDay(dt.date(2020, 3, 1),
                                                 dt.date(2020, 3, 31))
        self.assertEqual(len(events), 31)
        evod = events[1]
        self.assertEqual(evod.date, dt.date(2020, 3, 2))
        self.assertEqual(len(evod.days_events), 0)
        self.assertEqual(len(evod.continuing_events), 0)
        evod = events[8]
        self.assertEqual(evod.date, dt.date(2020, 3, 9))
        self.assertEqual(len(evod.days_events), 1)
        self.assertEqual(len(evod.continuing_events), 0)
        title, page, url = evod.days_events[0]
        self.assertEqual(title, "Test Meeting")
        evod = events[19]
        self.assertEqual(evod.date, dt.date(2020, 3, 20))
        self.assertEqual(len(evod.days_events), 1)
        self.assertEqual(len(evod.continuing_events), 0)
        title, page, url = evod.days_events[0]
        self.assertEqual(title, "No Meeting during Shutdown")
        self.assertIs(type(page), ExtCancellationPage)

    @freeze_timetz("2020-04-04")
    def testEventFutureExceptions(self):
        request = RequestFactory().get("/test")
        request.user = self.user
        request.session = {}
        exceptions = self.event._futureExceptions(request)
        self.assertEqual(len(exceptions), 1)
        shutdown = exceptions[0]
        self.assertEqual(
            shutdown.title,
            "Cancellation from Friday 20th of March to Monday 1st of June")
        self.assertEqual(shutdown.cancellation_title,
                         "No Meeting during Shutdown")
        self.assertEqual(shutdown._future_datetime_from,
                         datetimetz(2020, 4, 6, 13))

    @freeze_timetz("2020-08-31")
    def testPast(self):
        self.assertEqual(list(ExtCancellationPage.events.past()),
                         [self.shutdown])
        self.assertEqual(ExtCancellationPage.events.past().count(), 1)
        self.assertEqual(ExtCancellationPage.events.future().count(), 0)

    @freeze_timetz("2020-05-04")
    def testFuture(self):
        self.assertEqual(list(ExtCancellationPage.events.future()),
                         [self.shutdown])
        self.assertEqual(ExtCancellationPage.events.past().count(), 1)
        self.assertEqual(ExtCancellationPage.events.future().count(), 1)

    @freeze_timetz("2020-06-01 14:00:00")
    def testCurrent(self):
        self.assertEqual(list(ExtCancellationPage.events.current()),
                         [self.shutdown])
        self.assertEqual(ExtCancellationPage.events.past().count(), 1)
        self.assertEqual(ExtCancellationPage.events.current().count(), 1)
        self.assertEqual(ExtCancellationPage.events.future().count(), 0)

    def testEventOccursOn(self):
        self.assertIs(self.event._occursOn(dt.date(2020, 5, 11)), False)

    @freeze_timetz("2020-05-31")
    def testEventNextDate(self):
        self.assertEqual(self.event.next_date, dt.date(2020, 6, 3))

    @freeze_timetz("2020-06-01")
    def testEventPastDatetime(self):
        self.assertEqual(self.event._past_datetime_from,
                         datetimetz(2020, 3, 18, 13, 0))

    @freeze_timetz("2020-06-01")
    def testEventFutureDatetime(self):
        shutdown = ExtCancellationPage(owner=self.user,
                                       overrides=self.event,
                                       cancelled_from_date=dt.date(
                                           2020, 5, 13))
        self.event.add_child(instance=shutdown)
        shutdown.save_revision().publish()
        self.assertIsNone(self.event._future_datetime_from)

    @freeze_timetz("2020-06-16")
    def testGetUpcomingEvents(self):
        event = RecurringEventPage(slug="lemon",
                                   title="Lemonade Stand",
                                   repeat=Recurrence(dtstart=dt.date(
                                       2021, 1, 1),
                                                     freq=WEEKLY,
                                                     byweekday=[FR]),
                                   time_from=dt.time(11),
                                   time_to=dt.time(13))
        self.calendar.add_child(instance=event)
        shutdown = ExtCancellationPage(owner=self.user,
                                       overrides=event,
                                       cancelled_from_date=dt.date(
                                           2021, 2, 13),
                                       cancellation_title="Gone fishing")
        event.add_child(instance=shutdown)
        shutdown.save_revision().publish()
        events = ExtCancellationPage.events.exclude(cancellation_title="")   \
                                      .upcoming().this()                     \
                                      .descendant_of(event)
        self.assertEqual(len(events), 1)
        title, page, url = events[0]
        self.assertEqual(title, "Gone fishing")
        self.assertEqual(page._future_datetime_from,
                         datetimetz(2021, 2, 19, 11, 0))
        self.assertEqual(url, "/events/lemon/2021-02-13--cancellation/")

    @freeze_timetz("2020-06-16")
    def testGetPastEvents(self):
        events = ExtCancellationPage.events.past().this()
        self.assertEqual(len(events), 1)
        title, page, url = events[0]
        self.assertEqual(title, "No Meeting during Shutdown")
        self.assertEqual(page._past_datetime_from,
                         datetimetz(2020, 6, 1, 13, 0))
        self.assertEqual(
            url, "/events/test-meeting/2020-03-20-2020-06-01-cancellation/")

    def testGetMyDates(self):
        dates = list(self.shutdown._getMyDates())
        self.assertEqual(dates, [
            dt.date(2020, 3, 20),
            dt.date(2020, 3, 23),
            dt.date(2020, 3, 25),
            dt.date(2020, 3, 27),
            dt.date(2020, 3, 30),
            dt.date(2020, 4, 1),
            dt.date(2020, 4, 3),
            dt.date(2020, 4, 6),
            dt.date(2020, 4, 8),
            dt.date(2020, 4, 10),
            dt.date(2020, 4, 13),
            dt.date(2020, 4, 15),
            dt.date(2020, 4, 17),
            dt.date(2020, 4, 20),
            dt.date(2020, 4, 22),
            dt.date(2020, 4, 24),
            dt.date(2020, 4, 27),
            dt.date(2020, 4, 29),
            dt.date(2020, 5, 1),
            dt.date(2020, 5, 4),
            dt.date(2020, 5, 6),
            dt.date(2020, 5, 8),
            dt.date(2020, 5, 11),
            dt.date(2020, 5, 13),
            dt.date(2020, 5, 15),
            dt.date(2020, 5, 18),
            dt.date(2020, 5, 20),
            dt.date(2020, 5, 22),
            dt.date(2020, 5, 25),
            dt.date(2020, 5, 27),
            dt.date(2020, 5, 29),
            dt.date(2020, 6, 1)
        ])

    def testGetMyRawDates(self):
        dates = list(
            self.shutdown._getMyRawDates(dt.date(2020, 5, 30),
                                         dt.date(2020, 6, 10)))
        self.assertEqual(
            dates,
            [dt.date(2020, 5, 30),
             dt.date(2020, 5, 31),
             dt.date(2020, 6, 1)])

    def testClosedOn(self):
        shutdown2 = ExtCancellationPage(owner=self.user,
                                        overrides=self.event,
                                        cancelled_from_date=dt.date(
                                            2020, 9, 2))
        self.event.add_child(instance=shutdown2)
        shutdown2.save_revision().publish()
        self.assertIs(shutdown2._closedOn(dt.date(2020, 9, 21)), True)
        self.assertIs(self.shutdown._closedOn(dt.date(2020, 3, 24)), True)
        self.assertIs(self.shutdown._closedOn(dt.date(2020, 6, 22)), False)

    def testStatus(self):
        self.assertEqual(self.shutdown.status, "cancelled")
        self.assertEqual(self.shutdown.status_text,
                         "This event has been cancelled.")

    @freeze_timetz("2020-03-25 14:00")
    def testWhen(self):
        self.assertEqual(
            self.shutdown.when,
            "Cancelled from Friday 20th of March to Monday 1st of June")

    @freeze_timetz("2020-03-25 14:00")
    def testWhenEver(self):
        event = RecurringEventPage(slug="OpQ",
                                   title="Orangepurple Quagga",
                                   repeat=Recurrence(dtstart=dt.date(
                                       2020, 1, 1),
                                                     freq=MONTHLY,
                                                     byweekday=[FR(-1)]),
                                   time_from=dt.time(19))
        self.calendar.add_child(instance=event)
        shutdown = ExtCancellationPage(owner=self.user,
                                       overrides=event,
                                       cancelled_from_date=dt.date(2020, 4, 1))
        event.add_child(instance=shutdown)
        shutdown.save_revision().publish()
        self.assertEqual(
            shutdown.when,
            "Cancelled from Wednesday 1st of April until further notice")

    def testAt(self):
        self.assertEqual(self.shutdown.at.strip(), "1pm")

    @freeze_timetz("2020-03-25 14:00")
    def testCurrentDt(self):
        self.assertEqual(self.shutdown._current_datetime_from,
                         datetimetz(2020, 3, 25, 13, 0))

    @freeze_timetz("2020-03-25 14:00")
    def testFutureDt(self):
        self.assertEqual(self.shutdown._future_datetime_from,
                         datetimetz(2020, 3, 27, 13, 0))

    @freeze_timetz("2020-03-25 14:00")
    def testPastDt(self):
        self.assertEqual(self.shutdown._past_datetime_from,
                         datetimetz(2020, 3, 25, 13, 0))

    def testUnexplainedCancellation(self):
        shutdown = ExtCancellationPage(
            owner=self.user,
            overrides=self.event,
            cancelled_from_date=dt.date(2019, 2, 8),
            cancellation_title="Restructure Pending",
            cancellation_details="Keep it quiet")
        self.event.add_child(instance=shutdown)
        PASSWORD = PageViewRestriction.PASSWORD
        restriction = PageViewRestriction.objects.create(
            restriction_type=PASSWORD, password="******", page=shutdown)
        restriction.save()
        events = RecurringEventPage.events.byDay(dt.date(2019, 2, 1),
                                                 dt.date(2019, 2, 28))
        self.assertEqual(len(events), 28)
        evod = events[7]
        self.assertEqual(evod.date, dt.date(2019, 2, 8))
        self.assertEqual(len(evod.days_events), 0)
        self.assertEqual(len(evod.continuing_events), 0)

    def testGroup(self):
        self.assertIsNone(self.shutdown.group)

    def testOverridesRepeat(self):
        self.assertEqual(self.shutdown.overrides_repeat, self.event.repeat)

    def testGetContext(self):
        request = RequestFactory().get("/test")
        context = self.shutdown.get_context(request)
        self.assertIn('overrides', context)
Exemplo n.º 5
0
class Test(TestCase):
    def setUp(self):
        self.home = Page.objects.get(slug='home')
        self.user = User.objects.create_user('i', '*****@*****.**', 's3(r3t')
        self.calendar = CalendarPage(owner=self.user,
                                     slug="events",
                                     title="Events")
        self.home.add_child(instance=self.calendar)
        self.calendar.save_revision().publish()
        self.event = RecurringEventPage(slug="test-meeting",
                                        title="Test Meeting",
                                        repeat=Recurrence(
                                            dtstart=dt.date(1989, 1, 1),
                                            freq=WEEKLY,
                                            byweekday=[MO, WE, FR]),
                                        time_from=dt.time(13),
                                        time_to=dt.time(15, 30))
        self.calendar.add_child(instance=self.event)
        self.cancellation = CancellationPage(
            owner=self.user,
            overrides=self.event,
            except_date=dt.date(1989, 2, 1),
            cancellation_title="Meeting Cancelled",
            cancellation_details="Cancelled due to lack of interest")
        self.event.add_child(instance=self.cancellation)
        self.cancellation.save_revision().publish()

    def testGetEventsByDay(self):
        hiddenCancellation = CancellationPage(owner=self.user,
                                              overrides=self.event,
                                              except_date=dt.date(1989, 2, 13))
        self.event.add_child(instance=hiddenCancellation)
        events = RecurringEventPage.events.byDay(dt.date(1989, 2, 1),
                                                 dt.date(1989, 2, 28))
        self.assertEqual(len(events), 28)
        evod1 = events[0]
        self.assertEqual(evod1.date, dt.date(1989, 2, 1))
        self.assertEqual(len(evod1.days_events), 1)
        self.assertEqual(len(evod1.continuing_events), 0)
        title, page, url = evod1.days_events[0]
        self.assertEqual(title, "Meeting Cancelled")
        self.assertIs(type(page), CancellationPage)
        evod2 = events[12]
        self.assertEqual(evod2.date, dt.date(1989, 2, 13))
        self.assertEqual(len(evod2.days_events), 0)
        self.assertEqual(len(evod2.continuing_events), 0)

    def testOccursOn(self):
        self.assertIs(self.event._occursOn(dt.date(1989, 2, 1)), False)
        self.assertIs(self.event._occursOn(dt.date(1989, 2, 3)), True)

    def testUnexplainedCancellation(self):
        self._cancel_1999_02_08()

        events = RecurringEventPage.events.byDay(dt.date(1999, 2, 1),
                                                 dt.date(1999, 2, 28))
        self.assertEqual(len(events), 28)
        evod = events[7]
        self.assertEqual(evod.date, dt.date(1999, 2, 8))
        self.assertEqual(len(evod.days_events), 0)
        self.assertEqual(len(evod.continuing_events), 0)

    def testUnexplainedCancellationExplained(self):
        restriction = self._cancel_1999_02_08()

        request = RequestFactory().get("/test")
        request.user = self.user
        KEY = PageViewRestriction.passed_view_restrictions_session_key
        request.session = {KEY: [restriction.id]}
        events = RecurringEventPage.events(request, self.calendar.holidays)  \
                                   .byDay(dt.date(1999,2,1), dt.date(1999,2,28))
        self.assertEqual(len(events), 28)
        evod = events[7]
        self.assertEqual(evod.date, dt.date(1999, 2, 8))
        self.assertEqual(len(evod.days_events), 1)
        self.assertEqual(len(evod.continuing_events), 0)
        title, page, url = evod.days_events[0]
        self.assertEqual(title, "Restructure Pending")
        self.assertIs(type(page), CancellationPage)

    def _cancel_1999_02_08(self):
        cancellation = CancellationPage(
            owner=self.user,
            overrides=self.event,
            except_date=dt.date(1999, 2, 8),
            cancellation_title="Restructure Pending",
            cancellation_details="Keep it quiet")
        self.event.add_child(instance=cancellation)
        PASSWORD = PageViewRestriction.PASSWORD
        restriction = PageViewRestriction.objects.create(
            restriction_type=PASSWORD, password="******", page=cancellation)
        restriction.save()
        return restriction

    def testStatus(self):
        self.assertEqual(self.cancellation.status, "cancelled")
        self.assertEqual(self.cancellation.status_text,
                         "This event has been cancelled.")
        now = dt.datetime.now()
        myday = now.date() + dt.timedelta(1)
        friday = myday + dt.timedelta(days=(4 - myday.weekday()) % 7)
        futureCan = CancellationPage(owner=self.user,
                                     overrides=self.event,
                                     except_date=friday,
                                     cancellation_title="",
                                     cancellation_details="")
        self.event.add_child(instance=futureCan)
        self.assertEqual(futureCan.status, "cancelled")
        self.assertEqual(futureCan.status_text,
                         "This event has been cancelled.")

    def testWhen(self):
        self.assertEqual(self.cancellation.when,
                         "Wednesday 1st of February 1989 at 1pm to 3:30pm")

    def testWhenEver(self):
        event = RecurringEventPage(slug="XYZ",
                                   title="Xylophone yacht zombies",
                                   repeat=Recurrence(dtstart=dt.date(
                                       1989, 1, 1),
                                                     freq=WEEKLY,
                                                     byweekday=[FR]),
                                   time_from=dt.time(19))
        self.calendar.add_child(instance=event)
        cancellation = CancellationPage(owner=self.user,
                                        overrides=event,
                                        except_date=dt.date(1989, 3, 10),
                                        cancellation_title="Cancelled")
        event.add_child(instance=cancellation)
        cancellation.save_revision().publish()
        self.assertEqual(cancellation.when, "Friday 10th of March 1989 at 7pm")

    def testAt(self):
        self.assertEqual(self.cancellation.at.strip(), "1pm")

    def testCurrentDt(self):
        self.assertIsNone(self.cancellation._current_datetime_from)

    def testFutureDt(self):
        self.assertIsNone(self.cancellation._future_datetime_from)

    def testPastDt(self):
        self.assertEqual(self.cancellation._past_datetime_from,
                         datetimetz(1989, 2, 1, 13, 0))

    def testNeverOccursOn(self):
        cancellation = CancellationPage(owner=self.user,
                                        overrides=self.event,
                                        except_date=dt.date(1989, 2, 7),
                                        cancellation_title="Tuesday",
                                        cancellation_details="Banner")
        self.event.add_child(instance=cancellation)
        self.assertIsNone(cancellation._current_datetime_from)
        self.assertIsNone(cancellation._future_datetime_from)
        self.assertIsNone(cancellation._past_datetime_from)

    def testGroup(self):
        self.assertIsNone(self.cancellation.group)

    def testOverridesRepeat(self):
        self.assertEqual(self.cancellation.overrides_repeat, self.event.repeat)

    def testGetContext(self):
        request = RequestFactory().get("/test")
        context = self.cancellation.get_context(request)
        self.assertIn('overrides', context)