Ejemplo n.º 1
0
class TestMultiday(TestCase):
    def setUp(self):
        site = Site.objects.get(is_default_site=True)
        site.hostname = "joy.test"
        site.save()
        self.home = Page.objects.get(slug='home')
        self.user = User.objects.create_user('i', '*****@*****.**', 's3cr3t')
        self.calendar = CalendarPage(owner=self.user,
                                     slug="events",
                                     title="Events")
        self.home.add_child(instance=self.calendar)
        self.calendar.save_revision().publish()

    def testFromPage(self):
        page = MultidayEventPage(owner=self.user,
                                 slug="niuekulele2018",
                                 title="Niuekulele Ukulele Music Festival",
                                 date_from=dt.date(2018, 3, 16),
                                 date_to=dt.date(2018, 3, 20),
                                 tz=pytz.timezone("Pacific/Niue"))
        self.calendar.add_child(instance=page)
        page.save_revision().publish()
        vev = VEventFactory().makeFromPage(page)
        self.assertIs(type(vev), MultidayVEvent)
        tz = pytz.timezone("Pacific/Niue")
        self.assertEqual(vev['DTSTART'].dt,
                         tz.localize(dt.datetime(2018, 3, 16, 0, 0)))
        self.assertEqual(
            vev['DTEND'].dt,
            tz.localize(dt.datetime(2018, 3, 20, 23, 59, 59, 999999)))
Ejemplo n.º 2
0
class TestMultiday(TestCase):
    def setUp(self):
        site = Site.objects.get(is_default_site=True)
        site.hostname = "joy.test"
        site.save()
        self.home = Page.objects.get(slug='home')
        self.user = User.objects.create_user('i', '*****@*****.**', 's3cr3t')
        self.calendar = CalendarPage(owner=self.user,
                                     slug="events",
                                     title="Events")
        self.home.add_child(instance=self.calendar)
        self.calendar.save_revision().publish()

    def testFromPage(self):
        page = MultidayEventPage(owner=self.user,
                                 slug="kainiue-food-festival",
                                 title="KaiNiue Food Festival",
                                 date_from=dt.date(2018, 11, 2),
                                 date_to=dt.date(2018, 11, 5),
                                 tz=pytz.timezone("Pacific/Niue"))
        self.calendar.add_child(instance=page)
        page.save_revision().publish()
        gev = MultidayGEvent.fromPage(page)
        self.assertEqual(gev['dates'], "20181102T000000/20181105T235959")
        self.assertEqual(gev['ctz'], "Pacific/Niue")
Ejemplo n.º 3
0
class TestSimple(TestCase):
    def setUp(self):
        site = Site.objects.get(is_default_site=True)
        site.hostname = "joy.test"
        site.save()
        self.home = Page.objects.get(slug='home')
        self.user = User.objects.create_user('i', '*****@*****.**', 's3cr3t')
        self.calendar = CalendarPage(owner=self.user,
                                     slug="events",
                                     title="Events")
        self.home.add_child(instance=self.calendar)
        self.calendar.save_revision().publish()

    def testFromPage(self):
        page = SimpleEventPage(owner=self.user,
                               slug="pet-show",
                               title="Pet Show",
                               date=dt.date(1987, 6, 5),
                               time_from=dt.time(11),
                               time_to=dt.time(17, 30),
                               tz=pytz.timezone("Australia/Sydney"))
        self.calendar.add_child(instance=page)
        page.save_revision().publish()
        vev = VEventFactory().makeFromPage(page)
        self.assertIs(type(vev), SimpleVEvent)
        tz = pytz.timezone("Australia/Sydney")
        self.assertEqual(vev['DTSTART'].dt,
                         tz.localize(dt.datetime(1987, 6, 5, 11, 0)))
Ejemplo n.º 4
0
class Test40Day(TestCase):
    def setUp(self):
        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 = MultidayRecurringEventPage(
            owner=self.user,
            slug="ice-festival",
            title="Ice Festival",
            repeat=Recurrence(dtstart=dt.date(2000, 12, 25),
                              until=dt.date(2020, 1, 31),
                              freq=YEARLY,
                              bymonth=12,
                              byweekday=MO(4)),
            num_days=40)
        self.calendar.add_child(instance=self.event)
        self.event.save_revision().publish()

    def testGetEventsByDay(self):
        events = MultidayRecurringEventPage.events.byDay(
            dt.date(2020, 1, 1), dt.date(2020, 1, 31))
        self.assertEqual(len(events), 31)
        evod = events[0]
        self.assertEqual(evod.date, dt.date(2020, 1, 1))
        self.assertEqual(len(evod.days_events), 0)
        self.assertEqual(len(evod.continuing_events), 1)
        thisEvent = evod.continuing_events[0]
        self.assertEqual(thisEvent.title, "Ice Festival")
        evod = events[10]
        self.assertEqual(evod.date, dt.date(2020, 1, 11))
        self.assertEqual(len(evod.continuing_events), 1)
        thisEvent = evod.continuing_events[0]
        self.assertEqual(thisEvent.title, "Ice Festival")

    def testStatus(self):
        with freeze_timetz("2019-12-20 13:00:00"):
            self.assertEqual(self.event.status_text, "")
        with freeze_timetz("2020-01-02 13:00:00"):
            self.assertEqual(self.event.status_text, "This event has started.")
        with freeze_timetz("2020-02-03 17:00:00"):
            self.assertEqual(self.event.status_text,
                             "These events have finished.")

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

    @freeze_timetz("2035-04-03 10:00:00")
    def testNextDate(self):
        self.assertEqual(self.event.next_date, None)

    @freeze_timetz("2035-04-03 10:00:00")
    def testPrevDate(self):
        self.assertEqual(self.event.prev_date, dt.date(2019, 12, 23))
Ejemplo n.º 5
0
class TestTZ(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, 30),
                                        time_to=dt.time(16),
                                        tz=pytz.timezone("US/Eastern"))
        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()

    @timezone.override("Australia/Sydney")
    @freeze_timetz("1989-02-02T06:00:00+11:00")
    def testCurrentLocalDt(self):
        when = self.cancellation._current_datetime_from
        self.assertEqual(when.tzinfo.zone, "Australia/Sydney")
        self.assertEqual(when.time(), dt.time(5, 30))
        self.assertEqual(when.date(), dt.date(1989, 2, 2))

    @timezone.override("Australia/Sydney")
    @freeze_timetz("1989-02-02T06:00:00+11:00")
    def testFutureLocalDt(self):
        when = self.cancellation._future_datetime_from
        self.assertIsNone(when)

    @timezone.override("Australia/Sydney")
    def testPastLocalDt(self):
        when = self.cancellation._past_datetime_from
        self.assertEqual(when.tzinfo.zone, "Australia/Sydney")
        self.assertEqual(when.time(), dt.time(5, 30))
        self.assertEqual(when.date(), dt.date(1989, 2, 2))

    @timezone.override("Australia/Sydney")
    @freeze_timetz("1989-10-01T21:00:00+11:00")
    def testCopyFieldsFromParent(self):
        self.assertEqual(self.event.next_date, dt.date(1989, 10, 3))
        cancellation = CancellationPage(owner=self.user)
        cancellation._copyFieldsFromParent(self.event)
        self.assertEqual(cancellation.overrides, self.event)
        self.assertEqual(cancellation.except_date, dt.date(1989, 10, 2))
Ejemplo n.º 6
0
class TestTZ(TestCase):
    def setUp(self):
        self.home = Page.objects.get(slug='home')
        self.user = User.objects.create_user('i', '*****@*****.**', 's3cr3t')
        self.calendar = CalendarPage(owner=self.user,
                                     slug="events",
                                     title="Events")
        self.home.add_child(instance=self.calendar)
        self.calendar.save_revision().publish()
        self.event = MultidayEventPage(
            owner=self.user,
            slug="niuekulele2018",
            title="Niuekulele Ukulele Music Festival",
            date_from=dt.date(2018, 3, 16),
            date_to=dt.date(2018, 3, 20),
            tz=pytz.timezone("Pacific/Niue"))
        self.calendar.add_child(instance=self.event)
        self.event.save_revision().publish()

    def testGetEventsByLocalDay(self):
        events = MultidayEventPage.events.byDay(dt.date(2018, 3, 1),
                                                dt.date(2018, 3, 31))
        self.assertEqual(len(events), 31)
        evod1 = events[16]
        self.assertEqual(evod1.date, dt.date(2018, 3, 17))
        self.assertEqual(len(evod1.days_events), 1)
        self.assertEqual(len(evod1.continuing_events), 0)
        evod5 = events[20]
        self.assertEqual(evod5.date, dt.date(2018, 3, 21))
        self.assertEqual(len(evod5.days_events), 0)
        self.assertEqual(len(evod5.continuing_events), 1)
        self.assertEqual(evod1.all_events[0], evod5.all_events[0])
        self.assertEqual(evod1.all_events[0].page, evod5.all_events[0].page)

    @freeze_time("2018-04-01")
    def testLocalWhen(self):
        self.assertEqual(self.event.when,
                         "Friday 16th of March to Wednesday 21st of March")

    def testLocalAt(self):
        self.assertEqual(self.event.at, "")

    @timezone.override("America/Los_Angeles")
    def testCurrentLocalDt(self):
        self.assertIsNone(self.event._current_datetime_from)

    @timezone.override("America/Los_Angeles")
    def testFutureLocalDt(self):
        self.assertIsNone(self.event._future_datetime_from)

    @timezone.override("Pacific/Auckland")
    def testPastLocalDt(self):
        when = self.event._past_datetime_from
        self.assertEqual(when.tzinfo.zone, "Pacific/Auckland")
        self.assertEqual(when.time(), dt.time.max)
        self.assertEqual(when.date(), dt.date(2018, 3, 17))
Ejemplo n.º 7
0
 def setUp(self):
     self.user = User.objects.create_user('i', '*****@*****.**', 's3(r3t')
     calendar = CalendarPage(owner  = self.user,
                             slug  = "events",
                             title = "Events")
     Page.objects.get(slug='home').add_child(instance=calendar)
     calendar.save_revision().publish()
     event = SimpleEventPage(owner = self.user,
                             slug  = "tree-planting",
                             title = "Tree Planting",
                             date      = dt.date(2011,6,5),
                             time_from = dt.time(9,30),
                             time_to   = dt.time(11,0))
     calendar.add_child(instance=event)
     event.save_revision().publish()
Ejemplo n.º 8
0
 def setUp(self):
     translation.activate('fr')
     self.user = User.objects.create_superuser('i', '*****@*****.**', 's3(r3t')
     calendar = CalendarPage(owner=self.user,
                             slug="calendrier",
                             title="Calendrier")
     Page.objects.get(slug='home').add_child(instance=calendar)
     calendar.save_revision().publish()
     event = SimpleEventPage(owner=self.user,
                             slug="plantation-d-arbres",
                             title="Plantation d'arbres",
                             date=dt.date(2011, 6, 5),
                             time_from=dt.time(9, 30),
                             time_to=dt.time(11, 0))
     calendar.add_child(instance=event)
     event.save_revision().publish()
Ejemplo n.º 9
0
class TestRecurring(TestCase):
    def setUp(self):
        site = Site.objects.get(is_default_site=True)
        site.hostname = "joy.test"
        site.save()
        self.home = Page.objects.get(slug='home')
        self.user = User.objects.create_user('i', '*****@*****.**', 's3cr3t')
        self.calendar = CalendarPage(owner=self.user,
                                     slug="events",
                                     title="Events")
        self.home.add_child(instance=self.calendar)
        self.calendar.save_revision().publish()

    def testFromPage(self):
        page = RecurringEventPage(owner=self.user,
                                  slug="lunch-and-code",
                                  title="Lunch and Code",
                                  details="What we'll do really depends on "
                                  "what the group feels is useful, "
                                  "some ideas are:\n"
                                  "- Providing feedback on past, or "
                                  "in progress, projects\n"
                                  "- Pair programming\n"
                                  "- Coding\n",
                                  repeat=Recurrence(dtstart=dt.date(
                                      2017, 3, 15),
                                                    freq=MONTHLY,
                                                    byweekday=[FR(-1)]),
                                  time_from=dt.time(12),
                                  time_to=dt.time(13),
                                  tz=pytz.timezone("Pacific/Auckland"),
                                  location="70 Molesworth Street, Wellington")
        self.calendar.add_child(instance=page)
        page.save_revision().publish()
        gev = RecurringGEvent.fromPage(page)
        self.assertEqual(
            gev.url, "http://www.google.com/calendar/event?"
            "action=TEMPLATE&"
            "text=Lunch+and+Code&"
            "details=What+we%27ll+do+really+depends+on+what+the+"
            "group+feels+is+useful%2C+some+ideas+are%3A%0A"
            "-+Providing+feedback+on+past%2C+or+in+progress%2C+projects%0A"
            "-+Pair+programming%0A-+Coding%0A&"
            "location=70+Molesworth+Street%2C+Wellington&"
            "dates=20170331T120000%2F20170331T130000&"
            "ctz=Pacific%2FAuckland&"
            "recur=RRULE%3AFREQ%3DMONTHLY%3BWKST%3DSU%3BBYDAY%3D-1FR")
Ejemplo n.º 10
0
class TestExport(TestCase):
    def setUp(self):
        Site.objects.update(hostname="joy.test")
        self.home = Page.objects.get(slug='home')
        self.user = User.objects.create_user('i', '*****@*****.**', 's3(R3t')
        self.requestFactory = RequestFactory()
        self.calendar = CalendarPage(owner=self.user,
                                     slug="events",
                                     title="Events")
        self.home.add_child(instance=self.calendar)
        self.calendar.save_revision().publish()
        self.dicerun = SimpleEventPage(owner=self.user,
                                       slug="mercy-dice-run",
                                       title="Mercy Dice Run",
                                       date=dt.date(2020, 3, 16),
                                       location="Newtown")
        self.calendar.add_child(instance=self.dicerun)
        self.dicerun.save_revision().publish()
        event = SimpleEventPage(owner=self.user,
                                slug="workshop",
                                title="Workshop",
                                date=dt.date(2020, 3, 22))
        self.calendar.add_child(instance=event)
        event.save_revision().publish()
        self.handler = RssHandler()

    def _getRequest(self, path="/"):
        request = self.requestFactory.get(path)
        request.user = self.user
        request.site = self.home.get_site()
        request.session = {}
        request._messages = FallbackStorage(request)
        request.POST = request.POST.copy()
        request.POST['action-publish'] = "action-publish"
        return request

    def testServeCalendar(self):
        response = self.handler.serve(self.calendar,
                                      self._getRequest("/events/"))
        self.assertEqual(response.status_code, 200)
        self.assertEqual(response.get('Content-Type'),
                         "application/xml; charset=utf-8")
Ejemplo n.º 11
0
class TestPageFormDeutsche(TestCase):
    Form = ExtraInfoPage.get_edit_handler().get_form_class()

    def setUp(self):
        translation.activate('de')
        self.home = Page.objects.get(slug='home')
        self.user = User.objects.create_user('i', '*****@*****.**', 's3(r3t')
        self.calendar = CalendarPage(owner = self.user,
                                     slug  = "ereignisse",
                                     title = "Ereignisse")
        self.home.add_child(instance=self.calendar)
        self.calendar.save_revision().publish()
        self.event = RecurringEventPage(slug      = "meeting",
                                        title     = "Testen Sie Meeting",
                                        repeat    = Recurrence(dtstart=dt.date(1988,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.info = ExtraInfoPage(owner = self.user,
                                  overrides = self.event,
                                  except_date = dt.date(1999,1,5),
                                  extra_title = "Freitag",
                                  extra_information = "Besonderer Freitag")
        self.event.add_child(instance=self.info)
        self.info.save_revision().publish()

    def tearDown(self):
        translation.deactivate()

    def testExceptionAlreadyExists(self):
        page = ExtraInfoPage(owner=self.user)
        form = self.Form({'overrides':         self.event,
                          'except_date':       "1999-01-05",
                          'extra_title':       "Es ist Freitag",
                          'extra_information': rich_text("Besonderer spezieller Freitag")},
                          instance=page,
                          parent_page=self.event)
        self.assertFalse(form.is_valid())
        self.assertDictEqual(form.errors,
                             {'except_date': ['Dieses Datum enthält bereits zusätzliche information']})
Ejemplo n.º 12
0
class TestPageForm(TestCase):
    Form = ExtraInfoPage.get_edit_handler().get_form_class()

    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(1988,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.info = ExtraInfoPage(owner = self.user,
                                  overrides = self.event,
                                  except_date = dt.date(1999,1,5),
                                  extra_title = "Fri-day",
                                  extra_information = "Special Friday")
        self.event.add_child(instance=self.info)
        self.info.save_revision().publish()

    def testExceptionAlreadyExists(self):
        page = ExtraInfoPage(owner=self.user)
        form = self.Form({'overrides':         self.event,
                          'except_date':       "1999-01-05",
                          'extra_title':       "It's Friday",
                          'extra_information': rich_text("Special Special Friday")},
                          instance=page,
                          parent_page=self.event)
        self.assertFalse(form.is_valid())
        self.assertDictEqual(form.errors,
                             {'except_date': ['That date already has extra information']})
Ejemplo n.º 13
0
class TestSimple(TestCase):
    def setUp(self):
        self.home = Page.objects.get(slug='home')
        self.user = User.objects.create_user('i', '*****@*****.**', 's3cr3t')
        self.calendar = CalendarPage(owner=self.user,
                                     slug="events",
                                     title="Events")
        self.home.add_child(instance=self.calendar)
        self.calendar.save_revision().publish()

    def testFromPage(self):
        page = SimpleEventPage(owner=self.user,
                               slug="baseball-game",
                               title="Baseball Game",
                               date=dt.date(2014, 7, 30),
                               time_from=dt.time(13),
                               time_to=dt.time(16),
                               tz=pytz.timezone("America/Los_Angeles"))
        self.calendar.add_child(instance=page)
        page.save_revision().publish()
        gev = SimpleGEvent.fromPage(page)
        self.assertEqual(gev['dates'], "20140730T130000/20140730T160000")
        self.assertEqual(gev['ctz'], "America/Los_Angeles")
Ejemplo n.º 14
0
class TestMultidayRecurring(TestCase):
    def setUp(self):
        site = Site.objects.get(is_default_site=True)
        site.hostname = "joy.test"
        site.save()
        self.home = Page.objects.get(slug='home')
        self.user = User.objects.create_user('i', '*****@*****.**', 's3cr3t')
        self.calendar = CalendarPage(owner=self.user,
                                     slug="events",
                                     title="Events")
        self.home.add_child(instance=self.calendar)
        self.calendar.save_revision().publish()

    @freeze_time("2017-08-15")
    def testFromPage(self):
        page = MultidayRecurringEventPage(owner=self.user,
                                          slug="bought-from-rubber-man",
                                          title="Bought from a Rubber Man",
                                          repeat=Recurrence(dtstart=dt.date(
                                              2019, 4, 2),
                                                            freq=WEEKLY,
                                                            byweekday=[TU]),
                                          num_days=3,
                                          time_from=dt.time(16),
                                          time_to=dt.time(18),
                                          tz=pytz.timezone("Pacific/Auckland"))
        self.calendar.add_child(instance=page)
        page.save_revision().publish()
        vev = VEventFactory().makeFromPage(page)
        self.assertIs(type(vev), MultidayRecurringVEvent)
        tz = pytz.timezone("Pacific/Auckland")
        self.assertEqual(vev['DTSTART'].dt,
                         tz.localize(dt.datetime(2019, 4, 2, 16, 0)))
        self.assertEqual(vev['DTEND'].dt,
                         tz.localize(dt.datetime(2019, 4, 4, 18, 0)))
        self.assertEqual(vev['RRULE']['FREQ'], ["WEEKLY"])
        self.assertEqual(vev['RRULE']['BYDAY'], ["TU"])
Ejemplo n.º 15
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(1988,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.info = ExtraInfoPage(owner = self.user,
                                  overrides = self.event,
                                  except_date = dt.date(1988,11,11),
                                  extra_title = "System Demo",
                                  extra_information = "<h3>System Demo</h3>")
        self.event.add_child(instance=self.info)
        self.info.save_revision().publish()

    def testGetEventsByDay(self):
        events = RecurringEventPage.events.byDay(dt.date(1988,11,1),
                                                 dt.date(1988,11,30))
        self.assertEqual(len(events), 30)
        evod = events[10]
        self.assertEqual(evod.date, dt.date(1988,11,11))
        self.assertEqual(len(evod.all_events), 1)
        self.assertEqual(len(evod.days_events), 1)
        self.assertEqual(len(evod.continuing_events), 0)
        title, page, url = evod.days_events[0]
        self.assertEqual(title, "System Demo")
        self.assertIs(type(page), ExtraInfoPage)

    def testStatus(self):
        self.assertEqual(self.info.status, "finished")
        self.assertEqual(self.info.status_text, "This event has finished.")
        now = timezone.localtime()
        myday = now.date() + dt.timedelta(days=1)
        friday = myday + dt.timedelta(days=(4-myday.weekday())%7)
        futureInfo = ExtraInfoPage(owner = self.user,
                                   overrides = self.event,
                                   except_date = friday,
                                   extra_title = "It's Friday",
                                   extra_information = "Special")
        self.event.add_child(instance=futureInfo)
        self.assertIsNone(futureInfo.status)
        self.assertEqual(futureInfo.status_text, "")

    @freeze_timetz("1988-11-11 14:00:00")
    def testStatusStarted(self):
        self.assertEqual(self.info.status, "started")
        self.assertEqual(self.info.status_text, "This event has started.")

    def testWhen(self):
        self.assertEqual(self.info.when, "Friday 11th of November 1988 at 1pm to 3:30pm")

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

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

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

    def testPastDt(self):
        self.assertEqual(self.info._past_datetime_from,
                         datetimetz(1988,11,11,13,0))

    def testNeverOccursOn(self):
        info = ExtraInfoPage(owner = self.user,
                             overrides = self.event,
                             except_date = dt.date(1988,3,1),
                             extra_title = "Tuesday",
                             extra_information = "Standard")
        self.event.add_child(instance=info)
        self.assertIsNone(info._current_datetime_from)
        self.assertIsNone(info._future_datetime_from)
        self.assertIsNone(info._past_datetime_from)

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

    def testOverridesRepeat(self):
        self.assertEqual(self.info.overrides_repeat, self.event.repeat)
Ejemplo n.º 16
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).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)
Ejemplo n.º 17
0
class TestRecurring(TestCase):
    def setUp(self):
        site = Site.objects.get(is_default_site=True)
        site.hostname = "joy.test"
        site.save()
        self.home = Page.objects.get(slug='home')
        self.user = User.objects.create_user('i', '*****@*****.**', 's3cr3t')
        self.calendar = CalendarPage(owner=self.user,
                                     slug="events",
                                     title="Events")
        self.home.add_child(instance=self.calendar)
        self.calendar.save_revision().publish()

    @freeze_time("2017-08-15")
    def testFromPage(self):
        page = RecurringEventPage(
            owner=self.user,
            slug="code-for-boston",
            title="Code for Boston",
            repeat=Recurrence(dtstart=dt.date(2017, 1, 1),
                              freq=WEEKLY,
                              byweekday=[TU],
                              until=dt.date(2017, 12, 26)),
            time_from=dt.time(19),
            time_to=dt.time(21, 30),
            tz=pytz.timezone("US/Eastern"),
            location="4th Floor, 1 Broadway, Cambridge, MA")
        self.calendar.add_child(instance=page)
        page.save_revision().publish()
        vev = VEventFactory().makeFromPage(page)
        self.assertIs(type(vev), RecurringVEvent)
        vev.set('UID', "this-is-not-a-unique-identifier")
        codeForBoston = b"\r\n".join([
            b"BEGIN:VEVENT", b"SUMMARY:Code for Boston",
            b"DTSTART;TZID=US/Eastern:20170103T190000",
            b"DTEND;TZID=US/Eastern:20170103T213000",
            b"DTSTAMP:20170815T000000Z",
            b"UID:this-is-not-a-unique-identifier", b"SEQUENCE:1",
            b"RRULE:FREQ=WEEKLY;UNTIL=20171227T045959Z;BYDAY=TU;WKST=SU",
            b"CREATED:20170815T000000Z", b"DESCRIPTION:",
            b"LAST-MODIFIED:20170815T000000Z",
            b"LOCATION:4th Floor\\, 1 Broadway\\, Cambridge\\, MA",
            b"URL:http://joy.test/events/code-for-boston/", b"END:VEVENT", b""
        ])
        self.assertEqual(vev.to_ical(), codeForBoston)

    @freeze_time("2018-05-10")
    def testExdate(self):
        page = RecurringEventPage(owner=self.user,
                                  slug="sleep",
                                  title="Sleep In",
                                  repeat=Recurrence(dtstart=dt.date(
                                      2018, 5, 1),
                                                    freq=MONTHLY,
                                                    byweekday=[SA(+2)]),
                                  time_from=dt.time(7),
                                  time_to=dt.time(10, 30),
                                  tz=pytz.timezone("Pacific/Auckland"),
                                  details="<p>zzzZZZZZZZZZ</p>",
                                  location="Bed")
        self.calendar.add_child(instance=page)
        page.save_revision().publish()
        except1 = CancellationPage(
            owner=self.user,
            slug="2018-06-09-cancellation",
            title="Cancellation for Saturday 9th of June",
            overrides=page,
            except_date=dt.date(2018, 6, 9))
        page.add_child(instance=except1)
        except1.save_revision().publish()
        except2 = CancellationPage(
            owner=self.user,
            slug="2018-07-14-cancellation",
            title="Cancellation for Saturday 14th of July",
            overrides=page,
            except_date=dt.date(2018, 7, 14))
        page.add_child(instance=except2)
        except2.save_revision().publish()
        vev = VEventFactory().makeFromPage(except1)
        self.assertIs(type(vev), RecurringVEvent)
        vev.set('UID', "this-is-not-a-unique-identifier")
        tz = pytz.timezone("Pacific/Auckland")
        exDates = [exDate.dt for exDate in vev['EXDATE'].dts]
        self.assertEqual(exDates, [
            tz.localize(dt.datetime(2018, 6, 9, 7)),
            tz.localize(dt.datetime(2018, 7, 14, 7))
        ])
        sleepIn = b"\r\n".join([
            b"BEGIN:VEVENT", b"SUMMARY:Sleep In",
            b"DTSTART;TZID=Pacific/Auckland:20180512T070000",
            b"DTEND;TZID=Pacific/Auckland:20180512T103000",
            b"DTSTAMP:20180510T000000Z",
            b"UID:this-is-not-a-unique-identifier", b"SEQUENCE:1",
            b"RRULE:FREQ=MONTHLY;BYDAY=+2SA;WKST=SU",
            b"EXDATE;TZID=Pacific/Auckland:20180609T070000,20180714T070000",
            b"CREATED:20180510T000000Z", b"DESCRIPTION:<p>zzzZZZZZZZZZ</p>",
            b"LAST-MODIFIED:20180510T000000Z", b"LOCATION:Bed",
            b"URL:http://joy.test/events/sleep/", b"END:VEVENT", b""
        ])
        self.assertEqual(vev.to_ical(), sleepIn)

    @freeze_time("2017-05-15")
    def testExtraInfo(self):
        page = RecurringEventPage(
            owner=self.user,
            slug="code-for-boston",
            title="Code for Boston",
            repeat=Recurrence(dtstart=dt.date(2017, 1, 1),
                              freq=WEEKLY,
                              byweekday=[TU],
                              until=dt.date(2017, 12, 26)),
            time_from=dt.time(19),
            time_to=dt.time(21, 30),
            tz=pytz.timezone("US/Eastern"),
            location="4th Floor, 1 Broadway, Cambridge, MA")
        self.calendar.add_child(instance=page)
        page.save_revision().publish()
        info = ExtraInfoPage(owner=self.user,
                             slug="2017-06-06-extra-info",
                             title="Extra Information for Tuesday 6th of June",
                             overrides=page,
                             except_date=dt.date(2017, 6, 6),
                             extra_title="Handling Time Zones with Python")
        page.add_child(instance=info)
        info.save_revision().publish()
        vev = VEventFactory().makeFromPage(page)
        self.assertIs(type(vev), RecurringVEvent)
        vev.set('UID', "this-is-not-a-unique-identifier")
        codeForBoston = b"\r\n".join([
            b"BEGIN:VEVENT", b"SUMMARY:Code for Boston",
            b"DTSTART;TZID=US/Eastern:20170103T190000",
            b"DTEND;TZID=US/Eastern:20170103T213000",
            b"DTSTAMP:20170515T000000Z",
            b"UID:this-is-not-a-unique-identifier", b"SEQUENCE:1",
            b"RRULE:FREQ=WEEKLY;UNTIL=20171227T045959Z;BYDAY=TU;WKST=SU",
            b"CREATED:20170515T000000Z", b"DESCRIPTION:",
            b"LAST-MODIFIED:20170515T000000Z",
            b"LOCATION:4th Floor\\, 1 Broadway\\, Cambridge\\, MA",
            b"URL:http://joy.test/events/code-for-boston/", b"END:VEVENT", b""
        ])
        self.assertEqual(vev.to_ical(), codeForBoston)
        self.assertEqual(len(vev.vchildren), 1)
        vchild = vev.vchildren[0]
        vchild.set('UID', "this-is-not-a-unique-identifier")
        self.assertIs(type(vchild), ExtraInfoVEvent)
        talk = b"\r\n".join([
            b"BEGIN:VEVENT", b"SUMMARY:Handling Time Zones with Python",
            b"DTSTART;TZID=US/Eastern:20170606T190000",
            b"DTEND;TZID=US/Eastern:20170606T213000",
            b"DTSTAMP:20170515T000000Z",
            b"UID:this-is-not-a-unique-identifier",
            b"RECURRENCE-ID;TZID=US/Eastern:20170606T190000", b"SEQUENCE:1",
            b"CREATED:20170515T000000Z", b"DESCRIPTION:",
            b"LAST-MODIFIED:20170515T000000Z",
            b"LOCATION:4th Floor\\, 1 Broadway\\, Cambridge\\, MA",
            b"URL:http://joy.test/events/code-for-boston/2017-06-06-extra-info/",
            b"END:VEVENT", b""
        ])
        self.assertEqual(vchild.to_ical(), talk)

    @freeze_time("2017-05-15")
    def testPostponement(self):
        page = RecurringEventPage(
            owner=self.user,
            slug="code-for-boston",
            title="Code for Boston",
            repeat=Recurrence(dtstart=dt.date(2017, 1, 1),
                              freq=WEEKLY,
                              byweekday=[TU],
                              until=dt.date(2017, 12, 26)),
            time_from=dt.time(19),
            time_to=dt.time(21, 30),
            tz=pytz.timezone("US/Eastern"),
            location="4th Floor, 1 Broadway, Cambridge, MA")
        self.calendar.add_child(instance=page)
        page.save_revision().publish()
        post = PostponementPage(owner=self.user,
                                slug="2017-06-13-postponement",
                                title="Postponement for Tuesday 13th of June",
                                postponement_title="Code for Boston (on Weds)",
                                overrides=page,
                                except_date=dt.date(2017, 6, 13),
                                date=dt.date(2017, 6, 14))
        page.add_child(instance=post)
        post.save_revision().publish()
        vev = VEventFactory().makeFromPage(page)
        self.assertIs(type(vev), RecurringVEvent)
        self.assertEqual(len(vev.vchildren), 1)
        vchild = vev.vchildren[0]
        vchild.set('UID', "this-is-not-a-unique-identifier")
        self.assertIs(type(vchild), PostponementVEvent)
        talk = b"\r\n".join([
            b"BEGIN:VEVENT", b"SUMMARY:Code for Boston (on Weds)",
            b"DTSTART;TZID=US/Eastern:20170614T000000",
            b"DTEND;TZID=US/Eastern:20170614T235959",
            b"DTSTAMP:20170515T000000Z",
            b"UID:this-is-not-a-unique-identifier",
            b"RECURRENCE-ID;TZID=US/Eastern:20170613T190000", b"SEQUENCE:1",
            b"CREATED:20170515T000000Z", b"DESCRIPTION:",
            b"LAST-MODIFIED:20170515T000000Z", b"LOCATION:",
            b"URL:http://joy.test/events/code-for-boston/2017-06-13-postponement/",
            b"END:VEVENT", b""
        ])
        self.assertEqual(vchild.to_ical(), talk)

    @freeze_time("2017-05-15")
    def testCancellation(self):
        # NOTE:
        # Cancellations are represented by EXDATE in VEVENT not as their own
        # VEVENT instance.  Yes, this means the cancellation_title and
        # cancellation_details are lost.
        page = RecurringEventPage(owner=self.user,
                                  slug="sleep",
                                  title="Sleep In",
                                  repeat=Recurrence(dtstart=dt.date(
                                      2018, 5, 1),
                                                    freq=MONTHLY,
                                                    byweekday=[SA(+2)]),
                                  time_from=dt.time(7),
                                  time_to=dt.time(10, 30),
                                  tz=pytz.timezone("Pacific/Auckland"),
                                  details="<p>zzzZZZZZZZZZ</p>",
                                  location="Bed")
        self.calendar.add_child(instance=page)
        page.save_revision().publish()
        except1 = CancellationPage(
            owner=self.user,
            slug="2018-06-09-cancellation",
            title="Cancellation for Saturday 9th of June",
            cancellation_title="Get up early",
            overrides=page,
            except_date=dt.date(2018, 6, 9))
        page.add_child(instance=except1)
        except1.save_revision().publish()
        vexcept = CancellationVEvent.fromPage(except1)
        self.assertEqual(vexcept['SUMMARY'], "Get up early")
        self.assertEqual(vexcept['DESCRIPTION'], "")
        self.assertEqual(vexcept.to_ical(), b"\r\n")
Ejemplo n.º 18
0
class TestCancellation(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,
            slug="1989-02-01-cancellation",
            title="Cancellation for Wednesday 1st of February",
            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,
            slug="1989-02-13-cancellation",
            title="Cancellation for Monday 13th of February",
            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 = 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 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,
                                     slug="fri-cancellation",
                                     title="Cancellation for Friday",
                                     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 testAt(self):
        self.assertEqual(self.cancellation.at.strip(), "1pm")
Ejemplo n.º 19
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,
            slug="1989-02-01-cancellation",
            title="Cancellation for Wednesday 1st of February",
            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,
            slug="1989-02-13-cancellation",
            title="Cancellation for Monday 13th of February",
            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 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).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,
            slug="1999-02-08-cancellation",
            title="Cancellation for Monday 8th of February",
            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,
                                     slug="fri-cancellation",
                                     title="Cancellation for Friday",
                                     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 testAt(self):
        self.assertEqual(self.cancellation.at.strip(), "1pm")
Ejemplo n.º 20
0
class TestRecurringVEvent(TestCase):
    def setUp(self):
        site = Site.objects.get(is_default_site=True)
        site.hostname = "joy.test"
        site.save()
        self.home = Page.objects.get(slug='home')
        self.user = User.objects.create_user('i', '*****@*****.**', 's3cr3t')
        self.calendar = CalendarPage(owner=self.user,
                                     slug="events",
                                     title="Events")
        self.home.add_child(instance=self.calendar)
        self.calendar.save_revision().publish()

    @freeze_time("2017-08-15")
    def testFromPage(self):
        page = RecurringEventPage(
            owner=self.user,
            slug="code-for-boston",
            title="Code for Boston",
            repeat=Recurrence(dtstart=dt.date(2017, 1, 1),
                              freq=WEEKLY,
                              byweekday=[TU]),
            time_from=dt.time(19),
            time_to=dt.time(21, 30),
            tz=pytz.timezone("US/Eastern"),
            location="4th Floor, 1 Broadway, Cambridge, MA")
        self.calendar.add_child(instance=page)
        page.save_revision().publish()
        vev = RecurringVEvent.fromPage(page)
        vev.set('UID', "this-is-not-a-unique-identifier")
        codeForBoston = b"\r\n".join([
            b"BEGIN:VEVENT", b"SUMMARY:Code for Boston",
            b"DTSTART;TZID=US/Eastern:20170103T190000",
            b"DTEND;TZID=US/Eastern:20170103T213000",
            b"DTSTAMP:20170815T000000Z",
            b"UID:this-is-not-a-unique-identifier", b"SEQUENCE:1",
            b"RRULE:FREQ=WEEKLY;BYDAY=TU;WKST=SU", b"CREATED:20170815T000000Z",
            b"DESCRIPTION:", b"LAST-MODIFIED:20170815T000000Z",
            b"LOCATION:4th Floor\\, 1 Broadway\\, Cambridge\\, MA",
            b"URL:http://joy.test/events/code-for-boston/", b"END:VEVENT", b""
        ])
        self.assertEqual(vev.to_ical(), codeForBoston)

    @freeze_time("2018-05-10")
    def testExdate(self):
        page = RecurringEventPage(owner=self.user,
                                  slug="sleep",
                                  title="Sleep In",
                                  repeat=Recurrence(dtstart=dt.date(
                                      2018, 5, 1),
                                                    freq=MONTHLY,
                                                    byweekday=[SA(+2)]),
                                  time_from=dt.time(7),
                                  time_to=dt.time(10, 30),
                                  tz=pytz.timezone("Pacific/Auckland"),
                                  details="<p>zzzZZZZZZZZZ</p>",
                                  location="Bed")
        self.calendar.add_child(instance=page)
        page.save_revision().publish()
        except1 = CancellationPage(
            owner=self.user,
            slug="2018-06-09-cancellation",
            title="Cancellation for Saturday 9th of June",
            overrides=page,
            except_date=dt.date(2018, 6, 9))
        page.add_child(instance=except1)
        except1.save_revision().publish()
        except2 = CancellationPage(
            owner=self.user,
            slug="2018-07-14-cancellation",
            title="Cancellation for Saturday 14th of July",
            overrides=page,
            except_date=dt.date(2018, 7, 14))
        page.add_child(instance=except2)
        except2.save_revision().publish()
        vev = RecurringVEvent.fromPage(page)
        vev.set('UID', "this-is-not-a-unique-identifier")
        tz = pytz.timezone("Pacific/Auckland")
        exDates = [exDate.dt for exDate in vev['EXDATE'].dts]
        self.assertEqual(exDates, [
            tz.localize(dt.datetime(2018, 6, 9, 7)),
            tz.localize(dt.datetime(2018, 7, 14, 7))
        ])
        sleepIn = b"\r\n".join([
            b"BEGIN:VEVENT", b"SUMMARY:Sleep In",
            b"DTSTART;TZID=Pacific/Auckland:20180512T070000",
            b"DTEND;TZID=Pacific/Auckland:20180512T103000",
            b"DTSTAMP:20180510T000000Z",
            b"UID:this-is-not-a-unique-identifier", b"SEQUENCE:1",
            b"RRULE:FREQ=MONTHLY;BYDAY=+2SA;WKST=SU",
            b"EXDATE;TZID=Pacific/Auckland:20180609T070000,20180714T070000",
            b"CREATED:20180510T000000Z", b"DESCRIPTION:<p>zzzZZZZZZZZZ</p>",
            b"LAST-MODIFIED:20180510T000000Z", b"LOCATION:Bed",
            b"URL:http://joy.test/events/sleep/", b"END:VEVENT", b""
        ])
        self.assertEqual(vev.to_ical(), sleepIn)
Ejemplo n.º 21
0
class TestRecurringEvent(TestCase):
    def setUp(self):
        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=WEEKEND))
        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 EVERYDAY 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, "")

    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 testUpcomingDt(self):
        lugDt = self.event._upcoming_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._upcoming_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):
    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 testUpcomingDt(self):
        lugDt = self.event._upcoming_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._upcoming_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 TestTZ(TestCase):
    def setUp(self):
        self.home = Page.objects.get(slug='home')
        self.user = User.objects.create_user('i', '*****@*****.**', 's3cr3t')
        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(
            owner=self.user,
            slug="code-for-boston",
            title="Code for Boston",
            repeat=Recurrence(dtstart=dt.date(2017, 1, 1),
                              freq=WEEKLY,
                              byweekday=[TU]),
            time_from=dt.time(19),
            time_to=dt.time(21, 30),
            tz=pytz.timezone("US/Eastern"),
            location="4th Floor, 1 Broadway, Cambridge, MA")
        self.calendar.add_child(instance=self.event)
        self.event.save_revision().publish()

    def testGetEventsByLocalDay(self):
        events = RecurringEventPage.events.byDay(dt.date(2018, 4, 1),
                                                 dt.date(2018, 4, 30))
        self.assertEqual(len(events), 30)
        evod1 = events[3]
        self.assertEqual(evod1.date, dt.date(2018, 4, 4))
        self.assertEqual(len(evod1.days_events), 1)
        self.assertEqual(len(evod1.continuing_events), 0)

    @freeze_timetz("2017-05-31")
    def testLocalWhen(self):
        with timezone.override("America/Los_Angeles"):
            self.assertEqual(self.event.when, "Tuesdays at 4pm to 6:30pm")
        with timezone.override("Australia/Perth"):
            self.assertEqual(self.event.when, "Wednesdays at 7am to 9:30am")

    @timezone.override("America/Los_Angeles")
    def testLocalAt(self):
        self.assertEqual(self.event.at, "4pm")

    @timezone.override("America/Los_Angeles")
    def testUpcomingLocalDt(self):
        when = self.event._upcoming_datetime_from
        self.assertEqual(when.tzinfo.zone, "America/Los_Angeles")
        self.assertEqual(when.weekday(), calendar.TUESDAY)

    @timezone.override("Pacific/Auckland")
    def testPastLocalDt(self):
        when = self.event._past_datetime_from
        self.assertEqual(when.tzinfo.zone, "Pacific/Auckland")
        self.assertEqual(when.weekday(), calendar.WEDNESDAY)

    @timezone.override("Pacific/Kiritimati")
    def testExtremeTimeZones(self):
        lions = RecurringEventPage(owner=self.user,
                                   slug="pago-pago-lions",
                                   title="Pago Pago Lions Club",
                                   repeat=Recurrence(dtstart=dt.date(
                                       2015, 2, 1),
                                                     freq=MONTHLY,
                                                     byweekday=[TH(1),
                                                                TH(3)]),
                                   time_from=dt.time(23, 0),
                                   tz=pytz.timezone("Pacific/Pago_Pago"),
                                   location="Lions Den, Tafuna, PagoPago",
                                   website="http://www.lionsclubs.org.nz")
        self.calendar.add_child(instance=lions)
        self.assertEqual(
            lions.when, "The Saturday after the first Thursday and "
            "Saturday after the third Thursday of the month at 12am")
Ejemplo n.º 24
0
class Test(TestCase):
    def setUp(self):
        self.home = Page.objects.get(slug='home')
        self.user = User.objects.create_user('i', '*****@*****.**', 's3cr3t')
        self.calendar = CalendarPage(owner=self.user,
                                     slug="events",
                                     title="Events")
        self.home.add_child(instance=self.calendar)
        self.calendar.save_revision().publish()
        self.event = MultidayEventPage(owner=self.user,
                                       slug="allnighter",
                                       title="All Night",
                                       date_from=dt.date(2012, 12, 31),
                                       date_to=dt.date(2013, 1, 1),
                                       time_from=dt.time(23),
                                       time_to=dt.time(3))
        self.calendar.add_child(instance=self.event)
        self.event.save_revision().publish()

    def testGetEventsByDay(self):
        events = MultidayEventPage.events.byDay(dt.date(2012, 12, 1),
                                                dt.date(2012, 12, 31))
        self.assertEqual(len(events), 31)
        evod = events[30]
        self.assertEqual(evod.date, dt.date(2012, 12, 31))
        self.assertEqual(len(evod.all_events), 1)
        self.assertEqual(len(evod.days_events), 1)
        self.assertEqual(len(evod.continuing_events), 0)
        events = MultidayEventPage.events.byDay(dt.date(2013, 1, 1),
                                                dt.date(2013, 1, 31))
        self.assertEqual(len(events), 31)
        evod = events[0]
        self.assertEqual(evod.date, dt.date(2013, 1, 1))
        self.assertEqual(len(evod.all_events), 1)
        self.assertEqual(len(evod.days_events), 0)
        self.assertEqual(len(evod.continuing_events), 1)

    def testStatus(self):
        self.assertEqual(self.event.status, "finished")
        self.assertEqual(self.event.status_text, "This event has finished.")
        today = timezone.localdate()
        yesterday = today - dt.timedelta(1)
        nextWeek = today + dt.timedelta(7 - today.weekday())
        nowEvent = MultidayEventPage(owner=self.user,
                                     slug="now",
                                     title="Now Event",
                                     date_from=yesterday,
                                     date_to=nextWeek)
        self.calendar.add_child(instance=nowEvent)
        self.assertEqual(nowEvent.status, "started")
        self.assertEqual(nowEvent.status_text, "This event has started.")
        tomorrow = today + dt.timedelta(days=1)
        futureEvent = MultidayEventPage(owner=self.user,
                                        slug="tomorrow",
                                        title="Tomorrow's Event",
                                        date_from=tomorrow,
                                        date_to=tomorrow +
                                        dt.timedelta(days=1))
        self.calendar.add_child(instance=futureEvent)
        self.assertIsNone(futureEvent.status)
        self.assertEqual(futureEvent.status_text, "")

    def testWhen(self):
        self.assertEqual(
            self.event.when, "Monday 31st of December 2012 at 11pm to "
            "Tuesday 1st of January 2013 at 3am")

    def testAt(self):
        self.assertEqual(self.event.at, "11pm")

    def testCurrentDt(self):
        self.assertIsNone(self.event._current_datetime_from)
        now = timezone.localtime()
        today = now.date()
        nextWeek = today + dt.timedelta(7 - today.weekday())
        earlier = now - dt.timedelta(hours=1)
        if earlier.date() != now.date():
            earlier = datetimetz(now.date(), dt.time.min)
        nowEvent = MultidayEventPage(owner=self.user,
                                     slug="now",
                                     title="Now Event",
                                     date_from=earlier.date(),
                                     date_to=nextWeek,
                                     time_from=earlier.time(),
                                     time_to=dt.time(1))
        self.calendar.add_child(instance=nowEvent)
        self.assertEqual(nowEvent._current_datetime_from, earlier)
        tomorrow = timezone.localdate() + dt.timedelta(days=1)
        futureEvent = MultidayEventPage(owner=self.user,
                                        slug="tomorrow",
                                        title="Tomorrow's Event",
                                        date_from=tomorrow,
                                        date_to=tomorrow + dt.timedelta(2))
        self.calendar.add_child(instance=futureEvent)
        self.assertEqual(futureEvent._current_datetime_from,
                         datetimetz(tomorrow, dt.time.max))

    def testFutureDt(self):
        self.assertIsNone(self.event._future_datetime_from)
        now = timezone.localtime()
        today = now.date()
        nextWeek = today + dt.timedelta(7 - today.weekday())
        earlier = now - dt.timedelta(hours=1)
        if earlier.date() != now.date():
            earlier = datetimetz(now.date(), dt.time.min)
        nowEvent = MultidayEventPage(owner=self.user,
                                     slug="now",
                                     title="Now Event",
                                     date_from=earlier.date(),
                                     date_to=nextWeek,
                                     time_from=earlier.time(),
                                     time_to=dt.time(1))
        self.calendar.add_child(instance=nowEvent)
        self.assertIsNone(nowEvent._future_datetime_from)
        tomorrow = timezone.localdate() + dt.timedelta(days=1)
        futureEvent = MultidayEventPage(owner=self.user,
                                        slug="tomorrow",
                                        title="Tomorrow's Event",
                                        date_from=tomorrow,
                                        date_to=tomorrow + dt.timedelta(2))
        self.calendar.add_child(instance=futureEvent)
        self.assertEqual(futureEvent._future_datetime_from,
                         datetimetz(tomorrow, dt.time.max))

    def testPastDt(self):
        self.assertEqual(self.event._past_datetime_from,
                         datetimetz(2012, 12, 31, 23, 0))
        now = timezone.localtime()
        today = now.date()
        nextWeek = today + dt.timedelta(7 - today.weekday())
        earlier = now - dt.timedelta(hours=1)
        if earlier.date() != now.date():
            earlier = datetimetz(now.date(), dt.time.min)
        nowEvent = MultidayEventPage(owner=self.user,
                                     slug="now",
                                     title="Now Event",
                                     date_from=earlier.date(),
                                     date_to=nextWeek,
                                     time_from=earlier.time(),
                                     time_to=dt.time(1))
        self.calendar.add_child(instance=nowEvent)
        self.assertEqual(nowEvent._past_datetime_from, earlier)
        tomorrow = timezone.localdate() + dt.timedelta(days=1)
        futureEvent = MultidayEventPage(owner=self.user,
                                        slug="tomorrow",
                                        title="Tomorrow's Event",
                                        date_from=tomorrow,
                                        date_to=tomorrow + dt.timedelta(2))
        self.calendar.add_child(instance=futureEvent)
        self.assertIsNone(futureEvent._past_datetime_from)

    def testGroup(self):
        self.assertIsNone(self.event.group)
Ejemplo n.º 25
0
class TestEntry(TestCase):
    def setUp(self):
        imgFile = get_test_image_file()
        imgFile.name = "people.png"
        self.img = Image.objects.create(title="People", file=imgFile)
        imgName = os.path.splitext(os.path.basename(self.img.file.name))[0]
        self.rendName = "{}.width-350.format-png.png".format(imgName)
        Site.objects.update(hostname="joy.test")
        self.home = Page.objects.get(slug='home')
        self.user = User.objects.create_user('i', '*****@*****.**', 's3(R3t')
        self.requestFactory = RequestFactory()
        self.calendar = CalendarPage(owner=self.user,
                                     slug="events",
                                     title="Events")
        self.home.add_child(instance=self.calendar)
        self.calendar.save_revision().publish()

    def tearDown(self):
        self.img.file.delete(False)
        for rend in self.img.renditions.all():
            rend.file.delete(False)

    def _getRequest(self, path="/"):
        request = self.requestFactory.get(path)
        request.user = self.user
        request.site = self.home.get_site()
        request.session = {}
        request._messages = FallbackStorage(request)
        request.POST = request.POST.copy()
        request.POST['action-publish'] = "action-publish"
        return request

    def testSetCategory(self):
        cat = EventCategory.objects.create(code="A1", name="AlphaOne")
        page = MultidayEventPage(owner=self.user,
                                 slug="road-trip",
                                 title="Road Trip",
                                 date_from=dt.date(2016, 11, 1),
                                 date_to=dt.date(2016, 11, 10),
                                 time_from=dt.time(10),
                                 category=cat)
        self.calendar.add_child(instance=page)
        page.save_revision().publish()
        request = self._getRequest()
        thisEvent = ThisEvent(page.title, page, page.get_url(request))
        entry = EventEntry.fromEvent(thisEvent, request)
        self.assertEqual(entry.category(), [{'term': 'AlphaOne'}])
        rss = entry.rss_entry()
        self.assertEqual(
            etree.tostring(rss),
            b"""<item><title>Road Trip</title><link>http://joy.test/events/road-trip/</link><description>\n\n\n
  &lt;div class="joy-ev-when joy-field"&gt;
    Tuesday 1st of November 2016 at 10am to Thursday 10th of November 2016\n  &lt;/div&gt;\n\n\n\n
&lt;div class="rich-text"&gt;&lt;/div&gt;
</description><guid isPermaLink="true">http://joy.test/events/road-trip/</guid><category>AlphaOne</category></item>"""
        )

    def testSetImage(self):
        page = SimpleEventPage(owner=self.user,
                               slug="meetup",
                               title="Meet Up",
                               image=self.img,
                               date=dt.date(2016, 10, 21),
                               time_from=dt.time(16))
        self.calendar.add_child(instance=page)
        page.save_revision().publish()
        request = self._getRequest()
        thisEvent = ThisEvent(page.title, page, page.get_url(request))
        entry = EventEntry.fromEvent(thisEvent, request)
        self.assertEqual(
            entry.enclosure(), {
                'length': '773',
                'url': 'http://joy.test/media/images/{}'.format(self.rendName),
                'type': 'image/png'
            })

    def testSetDescription(self):
        group = GroupPage(slug="sandmen", title="Sandmen")
        self.home.add_child(instance=group)
        group.save_revision().publish()
        page = MultidayEventPage(owner=self.user,
                                 slug="road-trip",
                                 title="Road Trip",
                                 date_from=dt.date(2016, 11, 1),
                                 date_to=dt.date(2016, 11, 10),
                                 group_page=group)
        self.calendar.add_child(instance=page)
        page.save_revision().publish()
        request = self._getRequest()
        thisEvent = ThisEvent(page.title, page, page.get_url(request))
        entry = EventEntry.fromEvent(thisEvent, request)
        rss = entry.rss_entry()
        self.assertEqual(
            etree.tostring(rss),
            b"""<item><title>Road Trip</title><link>http://joy.test/events/road-trip/</link><description>\n
  &lt;div class="joy-ev-who joy-field"&gt;
    &lt;a class="joy-ev-who__link" href="http://joy.test/sandmen/"&gt;Sandmen&lt;/a&gt;
  &lt;/div&gt;\n\n\n
  &lt;div class="joy-ev-when joy-field"&gt;
    Tuesday 1st of November 2016 to Thursday 10th of November 2016\n  &lt;/div&gt;\n\n\n\n
&lt;div class="rich-text"&gt;&lt;/div&gt;
</description><guid isPermaLink="true">http://joy.test/events/road-trip/</guid></item>"""
        )
Ejemplo n.º 26
0
class TestFeed(TestCase):
    @freeze_time("2016-03-24")
    def setUp(self):
        imgFile = get_test_image_file()
        imgFile.name = "logo.png"
        self.img = Image.objects.create(title="Logo", file=imgFile)
        imgName = os.path.splitext(os.path.basename(self.img.file.name))[0]
        self.rendName = "{}.width-350.format-png.png".format(imgName)
        Site.objects.update(hostname="joy.test")
        self.home = Page.objects.get(slug='home')
        self.user = User.objects.create_user('i', '*****@*****.**', 's3(R3t')
        self.requestFactory = RequestFactory()
        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(owner=self.user,
                                        slug="workshop",
                                        title="Workshop",
                                        image=self.img,
                                        repeat=Recurrence(
                                            dtstart=dt.date(2017, 1, 1),
                                            freq=MONTHLY,
                                            byweekday=[TU(1)],
                                            until=dt.date(2017, 12, 26)))
        self.calendar.add_child(instance=self.event)
        self.event.save_revision().publish()
        self.handler = RssHandler()

    def tearDown(self):
        self.img.file.delete(False)
        for rend in self.img.renditions.all():
            rend.file.delete(False)

    def _getRequest(self, path="/"):
        request = self.requestFactory.get(path)
        request.user = self.user
        request.site = self.home.get_site()
        request.session = {}
        request._messages = FallbackStorage(request)
        request.POST = request.POST.copy()
        request.POST['action-publish'] = "action-publish"
        return request

    @freeze_time("2016-12-02")
    def testServe(self):
        response = self.handler.serve(self.calendar,
                                      self._getRequest("/events/"))
        self.assertEqual(response.status_code, 200)
        self.assertEqual(response.get('Content-Type'),
                         "application/xml; charset=utf-8")
        self.assertIn(b'<?xml version=\'1.0\' encoding=\'UTF-8\'?>',
                      response.content)
        soup = BeautifulSoup(response.content, "xml")
        channel = soup.channel
        self.assertEqual(channel.title.string, "Events")
        self.assertEqual(channel.description.string, "Events")
        self.assertEqual(channel.link.string, "http://joy.test/events/")
        self.assertEqual(channel.generator.string, "ls.joyous")
        self.assertEqual(len(channel("image")), 1)
        image = channel.image
        self.assertEqual(image.url.string,
                         "http://joy.test/static/joyous/img/logo.png")
        self.assertEqual(image.title.string, "Events")
        self.assertEqual(image.link.string, "http://joy.test/events/")
        self.assertEqual(channel.lastBuildDate.string,
                         "Fri, 02 Dec 2016 00:00:00 +0000")
        self.assertEqual(len(channel("item")), 1)
        item = channel.item
        self.assertEqual(item.title.string, "Workshop")
        self.assertEqual(item.link.string, "http://joy.test/events/workshop/")
        self.assertEqual(
            item.enclosure.decode(),
            '<enclosure length="773" type="image/png" '
            'url="http://joy.test/media/images/{}"/>'.format(self.rendName))
        self.assertEqual(
            item.description.decode(), """<description>\n\n\n
  &lt;div class="joy-ev-when joy-field"&gt;
    The first Tuesday of the month (until 26 December 2017)
  &lt;/div&gt;\n
  &lt;div class="joy-ev-next-on joy-field"&gt;
    Next on Tuesday 3rd of January 2017 
  &lt;/div&gt;\n\n\n\n
&lt;div class="rich-text"&gt;&lt;/div&gt;\n</description>""")
        self.assertEqual(item.guid.get("isPermaLink"), "true")
        self.assertEqual(item.guid.string, "http://joy.test/events/workshop/")
        self.assertEqual(item.pubDate.string,
                         "Thu, 24 Mar 2016 00:00:00 +0000")

    def testServeUnsupported(self):
        response = self.handler.serve(self.event,
                                      self._getRequest("/events/workshop"))
        self.assertIsNone(response)

    @freeze_time("2016-03-25")
    def testServeExtraInfo(self):
        info = ExtraInfoPage(owner=self.user,
                             overrides=self.event,
                             except_date=dt.date(2017, 2, 7),
                             extra_title="System Demo",
                             extra_information="<h3>System Demo</h3>")
        self.event.add_child(instance=info)
        info.save_revision().publish()
        response = self.handler.serve(self.calendar,
                                      self._getRequest("/events/"))
        self.assertEqual(response.status_code, 200)
        self.assertEqual(response.get('Content-Type'),
                         "application/xml; charset=utf-8")
        soup = BeautifulSoup(response.content, "xml")
        channel = soup.channel
        self.assertEqual(channel.title.string, "Events")
        self.assertEqual(len(channel("item")), 2)
        item = channel("item")[1]
        self.assertEqual(item.title.string, "System Demo")
        self.assertEqual(
            item.link.string,
            "http://joy.test/events/workshop/2017-02-07-extra-info/")
        self.assertEqual(
            item.enclosure.decode(),
            '<enclosure length="773" type="image/png" '
            'url="http://joy.test/media/images/{}"/>'.format(self.rendName))
        self.assertEqual(
            item.description.decode(), """<description>\n\n\n
  &lt;div class="joy-ev-when joy-field"&gt;
    Tuesday 7th of February 2017
  &lt;/div&gt;\n\n\n\n
&lt;div class="rich-text"&gt;&lt;h3&gt;System Demo&lt;/h3&gt;&lt;/div&gt;
&lt;div class="rich-text"&gt;&lt;/div&gt;\n</description>""")
        self.assertEqual(item.guid.get("isPermaLink"), "true")
        self.assertEqual(
            item.guid.string,
            "http://joy.test/events/workshop/2017-02-07-extra-info/")
        self.assertEqual(item.pubDate.string,
                         "Fri, 25 Mar 2016 00:00:00 +0000")

    @freeze_time("2016-03-26")
    def testServePostponement(self):
        postponement = PostponementPage(
            owner=self.user,
            overrides=self.event,
            except_date=dt.date(2017, 4, 4),
            image=self.img,
            cancellation_title="Workshop Postponed",
            cancellation_details="Workshop will take place next week",
            postponement_title="Workshop",
            date=dt.date(2017, 4, 11),
            details="Interesting stuff")
        self.event.add_child(instance=postponement)
        postponement.save_revision().publish()
        response = self.handler.serve(self.calendar,
                                      self._getRequest("/events/"))
        self.assertEqual(response.status_code, 200)
        soup = BeautifulSoup(response.content, "xml")
        channel = soup.channel
        self.assertEqual(channel.title.string, "Events")
        self.assertEqual(len(channel("item")), 2)
        item = channel("item")[1]
        self.assertEqual(item.title.string, "Workshop")
        self.assertEqual(
            item.link.string,
            "http://joy.test/events/workshop/2017-04-04-postponement/")
        self.assertEqual(
            item.enclosure.decode(),
            '<enclosure length="773" type="image/png" '
            'url="http://joy.test/media/images/{}"/>'.format(self.rendName))
        self.assertEqual(
            item.description.decode(), """<description>\n\n\n
  &lt;div class="joy-ev-when joy-field"&gt;
    Tuesday 11th of April 2017
  &lt;/div&gt;\n
  &lt;div class="joy-ev-from-when joy-field"&gt;
    Postponed from Tuesday 4th of April 2017
  &lt;/div&gt;\n\n\n\n
&lt;div class="rich-text"&gt;Interesting stuff&lt;/div&gt;\n</description>""")
        self.assertEqual(item.guid.get("isPermaLink"), "true")
        self.assertEqual(
            item.guid.string,
            "http://joy.test/events/workshop/2017-04-04-postponement/")
        self.assertEqual(item.pubDate.string,
                         "Sat, 26 Mar 2016 00:00:00 +0000")
Ejemplo n.º 27
0
class TestExport(TestCase):
    def setUp(self):
        Site.objects.update(hostname="joy.test")
        self.home = Page.objects.get(slug='home')
        self.user = User.objects.create_user('i', '*****@*****.**', 's3(R3t')
        self.requestFactory = RequestFactory()
        self.calendar = CalendarPage(owner=self.user,
                                     slug="events",
                                     title="Events")
        self.home.add_child(instance=self.calendar)
        self.calendar.save_revision().publish()
        self.dicerun = SimpleEventPage(owner=self.user,
                                       slug="mercy-dice-run",
                                       title="Mercy Dice Run",
                                       date=dt.date(2020, 3, 16),
                                       location="Newtown")
        self.calendar.add_child(instance=self.dicerun)
        self.dicerun.save_revision().publish()
        event = SimpleEventPage(owner=self.user,
                                slug="workshop",
                                title="Workshop",
                                date=dt.date(2020, 3, 22))
        self.calendar.add_child(instance=event)
        event.save_revision().publish()
        self.handler = ICalHandler()

    def _getRequest(self, path="/"):
        request = self.requestFactory.get(path)
        request.user = self.user
        request.site = self.home.get_site()
        request.session = {}
        request._messages = FallbackStorage(request)
        request.POST = request.POST.copy()
        request.POST['action-publish'] = "action-publish"
        return request

    def testServeCalendar(self):
        response = self.handler.serve(self.calendar,
                                      self._getRequest("/events/"))
        self.assertEqual(response.status_code, 200)
        self.assertEqual(response.get('Content-Type'), "text/calendar")
        self.assertEqual(response.get('Content-Disposition'),
                         "attachment; filename=events.ics")
        self.assertEqual(response.content.count(b"BEGIN:VEVENT"), 2)

    def testServeEvent(self):
        response = self.handler.serve(
            self.dicerun, self._getRequest("/events/mercy-dice-run/"))
        self.assertEqual(response.status_code, 200)
        self.assertEqual(response.get('Content-Type'), "text/calendar")
        self.assertEqual(response.get('Content-Disposition'),
                         "attachment; filename=mercy-dice-run.ics")
        self.assertEqual(response.content.count(b"BEGIN:VEVENT"), 1)
        self.assertIn(b"SUMMARY:Mercy Dice Run", response.content)
        self.assertIn(b"DTSTART;TZID=Asia/Tokyo:20200316T000000",
                      response.content)
        self.assertIn(b"DTEND;TZID=Asia/Tokyo:20200316T235959",
                      response.content)
        self.assertIn(b"LOCATION:Newtown", response.content)
        self.assertIn(b"URL:http://joy.test/events/mercy-dice-run",
                      response.content)

    def testServePage(self):
        response = self.handler.serve(self.home, self._getRequest("/"))
        self.assertIsNone(response)
class Test(TestCase):
    def setUp(self):
        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 = MultidayRecurringEventPage(
                               owner = self.user,
                               slug  = "team-retreat",
                               title = "Team Retreat",
                               repeat = Recurrence(dtstart=dt.date(2000,1,1),
                                                   freq=YEARLY,
                                                   bymonth=8,
                                                   byweekday=FR(1)),
                               num_days  = 3,
                               time_from = dt.time(18),
                               time_to   = dt.time(16,30))
        self.calendar.add_child(instance=self.event)
        self.event.save_revision().publish()

    def testGetEventsByDay(self):
        events = MultidayRecurringEventPage.events.byDay(dt.date(2017,8,1),
                                                         dt.date(2017,8,31))
        self.assertEqual(len(events), 31)
        evod = events[3]
        self.assertEqual(evod.date, dt.date(2017,8,4))
        self.assertEqual(len(evod.days_events), 1)
        self.assertEqual(len(evod.continuing_events), 0)
        evod = events[4]
        self.assertEqual(evod.date, dt.date(2017,8,5))
        self.assertEqual(len(evod.days_events), 0)
        self.assertEqual(len(evod.continuing_events), 1)
        evod = events[5]
        self.assertEqual(evod.date, dt.date(2017,8,6))
        self.assertEqual(len(evod.days_events), 0)
        self.assertEqual(len(evod.continuing_events), 1)

    def testStatus(self):
        with freeze_timetz("2014-08-01 17:00:00"):
            self.assertEqual(self.event.status_text, "")
        with freeze_timetz("2014-08-02 13:00:00"):
            self.assertEqual(self.event.status_text, "This event has started.")
        with freeze_timetz("2014-08-03 15:00:00"):
            self.assertEqual(self.event.status_text, "This event has started.")
        with freeze_timetz("2014-08-03 17:00:00"):
            self.assertEqual(self.event.status_text, "")

    def testNextOn(self):
        request = RequestFactory().get("/test")
        request.user = self.user
        request.session = {}
        oldEvent = MultidayRecurringEventPage(
                               owner = self.user,
                               slug  = "same-old-thing",
                               title = "Same Ol'",
                               repeat = Recurrence(dtstart=dt.date(1971,1,1),
                                                   until=dt.date(1982,1,1),
                                                   freq=WEEKLY,
                                                   byweekday=SA(1)),
                               num_days  = 2)
        self.calendar.add_child(instance=oldEvent)
        oldEvent.save_revision().publish()
        with freeze_timetz("1974-08-01 17:00:00"):
            self.assertEqual(oldEvent.next_date, dt.date(1974, 8, 3))
            self.assertEqual(oldEvent._nextOn(request), "Saturday 3rd of August ")
        with freeze_timetz("1982-01-01 17:00:00"):
            self.assertIsNone(oldEvent.next_date)
            self.assertEqual(oldEvent._nextOn(request), None)

    def testWhen(self):
        self.assertEqual(self.event.when,
                         "The first Friday of August for 3 days "
                         "starting at 6pm finishing at 4:30pm")

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

    @freeze_timetz("2035-04-03 10:00:00")
    def testPrevDate(self):
        self.assertEqual(self.event.prev_date, dt.date(2034, 8, 4))

    @freeze_timetz("2018-04-03 10:00:00")
    def testFutureExceptions(self):
        request = RequestFactory().get("/test")
        request.user = self.user
        request.session = {}
        info2018 = ExtraInfoPage(owner = self.user,
                                 overrides = self.event,
                                 except_date = dt.date(2018, 8, 3),
                                 extra_title = "Team Retreat 2018",
                                 extra_information = "Weekend at Bernie's")
        self.event.add_child(instance=info2018)
        exceptions = self.event._futureExceptions(request)
        self.assertEqual(len(exceptions), 1)
        info = exceptions[0]
        self.assertEqual(info.slug, "2018-08-03-extra-info")
        self.assertEqual(info.extra_title, "Team Retreat 2018")

    @freeze_timetz("2018-08-04 02:00:00")
    def testPastExcludeExtraInfo(self):
        info2018 = ExtraInfoPage(owner = self.user,
                                 overrides = self.event,
                                 except_date = dt.date(2018, 8, 3),
                                 extra_title = "Team Retreat 2018",
                                 extra_information = "Weekend at Bernie's")
        self.event.add_child(instance=info2018)
        before = self.event._past_datetime_from
        self.assertEqual(before, datetimetz(2017, 8, 4, 18))
Ejemplo n.º 29
0
class TestVCalendar(TestCase):
    def setUp(self):
        site = Site.objects.get(is_default_site=True)
        site.hostname = "joy.test"
        site.save()
        self.home = Page.objects.get(slug='home')
        self.user = User.objects.create_user('i', '*****@*****.**', 's3cr3t')
        self.requestFactory = RequestFactory()
        self.calendar = CalendarPage(owner=self.user,
                                     slug="events",
                                     title="Events")
        self.home.add_child(instance=self.calendar)
        self.calendar.save_revision().publish()

    def _getRequest(self, path="/"):
        request = self.requestFactory.get(path)
        request.user = self.user
        request.site = self.home.get_site()
        request.session = {}
        request._messages = FallbackStorage(request)
        request.POST = request.POST.copy()
        request.POST['action-publish'] = "action-publish"
        return request

    @freeze_time("2018-05-12")
    def testFromCalendarPage(self):
        page = SimpleEventPage(owner=self.user,
                               slug="bbq",
                               title="BBQ",
                               date=dt.date(2008, 7, 15),
                               time_from=dt.time(17, 30),
                               time_to=dt.time(19),
                               tz=pytz.timezone("Pacific/Auckland"))
        self.calendar.add_child(instance=page)
        page.save_revision().publish()
        vcal = VCalendar.fromPage(self.calendar, self._getRequest("/events/"))
        export = vcal.to_ical()
        props = [
            b"SUMMARY:BBQ",
            b"DTSTART;TZID=Pacific/Auckland:20080715T173000",
            b"DTEND;TZID=Pacific/Auckland:20080715T190000",
            b"DTSTAMP:20180512T000000Z",
            b"UID:",
            b"SEQUENCE:1",
            b"CREATED:20180512T000000Z",
            b"DESCRIPTION:",
            b"LAST-MODIFIED:20180512T000000Z",
            b"LOCATION:",
            b"URL:http://joy.test/events/bbq/",
        ]
        for prop in props:
            with self.subTest(prop=prop.split(b'\r\n', 1)[0]):
                self.assertIn(prop, export)

    @freeze_time("2018-05-12")
    def testFromEventPage(self):
        page = SimpleEventPage(owner=self.user,
                               slug="pet-show",
                               title="Pet Show",
                               date=dt.date(1987, 6, 5),
                               time_from=dt.time(11),
                               time_to=dt.time(17, 30),
                               tz=pytz.timezone("Australia/Sydney"))
        self.calendar.add_child(instance=page)
        page.save_revision().publish()
        vcal = VCalendar.fromPage(page, self._getRequest("/events/pet-show/"))
        export = vcal.to_ical()
        aest = b"\r\n".join([
            b"BEGIN:STANDARD",
            b"DTSTART;VALUE=DATE-TIME:19870315T020000",
            b"TZNAME:AEST",
            b"TZOFFSETFROM:+1100",
            b"TZOFFSETTO:+1000",
            b"END:STANDARD",
        ])
        aedt = b"\r\n".join([
            b"BEGIN:DAYLIGHT",
            b"DTSTART;VALUE=DATE-TIME:19871025T030000",
            b"TZNAME:AEDT",
            b"TZOFFSETFROM:+1000",
            b"TZOFFSETTO:+1100",
            b"END:DAYLIGHT",
        ])
        props = [
            b"SUMMARY:Pet Show",
            b"DTSTART;TZID=Australia/Sydney:19870605T110000",
            b"DTEND;TZID=Australia/Sydney:19870605T173000",
            b"DTSTAMP:20180512T000000Z", b"UID:", b"SEQUENCE:1",
            b"CREATED:20180512T000000Z", b"DESCRIPTION:",
            b"LAST-MODIFIED:20180512T000000Z", b"LOCATION:",
            b"URL:http://joy.test/events/pet-show/", aest, aedt
        ]
        for prop in props:
            with self.subTest(prop=prop.split(b'\r\n', 1)[0]):
                self.assertIn(prop, export)

    def testFromUnsupported(self):
        page = Page(owner=self.user,
                    slug="thoughts",
                    title="My thoughts for today")
        self.home.add_child(instance=page)
        page.save_revision().publish()
        with self.assertRaises(CalendarTypeError):
            VCalendar.fromPage(page, self._getRequest("/thoughts/"))

    def testEmptyCalendar(self):
        vcal = VCalendar(self.calendar)
        idParts = vcal['PRODID'].split("//")
        self.assertEqual(len(idParts), 4)
        self.assertEqual(idParts[0], "-")
        self.assertEqual(idParts[1], "linuxsoftware.nz")
        self.assertEqual(idParts[2], "NONSGML Joyous v0.5")
        self.assertEqual(idParts[3], "EN")
        self.assertEqual(vcal['VERSION'], "2.0")

    def testLoad(self):
        data = b"\r\n".join([
            b"BEGIN:VCALENDAR",
            b"VERSION:2.0",
            b"PRODID:-//Bloor &amp; Spadina - ECPv4.6.13//NONSGML v1.0//EN",
            b"CALSCALE:GREGORIAN",
            b"METHOD:PUBLISH",
            b"X-WR-CALNAME:Bloor &amp; Spadina",
            b"X-ORIGINAL-URL:http://bloorneighbours.ca",
            b"X-WR-CALDESC:Events for Bloor &amp; Spadina",
            b"BEGIN:VEVENT",
            b"DTSTART;TZID=UTC+0:20180407T093000",
            b"DTEND;TZID=UTC+0:20180407T113000",
            b"DTSTAMP:20180402T054745",
            b"CREATED:20180304T225154Z",
            b"LAST-MODIFIED:20180304T225154Z",
            b"UID:[email protected]",
            b"SUMMARY:Mini-Fair & Garage Sale",
            b"DESCRIPTION:",
            b"URL:http://bloorneighbours.ca/event/mini-fair-garage-sale/",
            b"END:VEVENT",
            b"END:VCALENDAR",
        ])
        vcal = VCalendar(self.calendar)
        vcal.load(self._getRequest(), data)
        events = SimpleEventPage.events.child_of(self.calendar)            \
                                       .filter(date=dt.date(2018,4,7)).all()
        self.assertEqual(len(events), 1)
        event = events[0]
        self.assertEqual(event.owner, self.user)
        self.assertEqual(event.slug, "mini-fair-garage-sale")
        self.assertEqual(event.title, "Mini-Fair & Garage Sale")
        self.assertEqual(event.details, "")
        self.assertEqual(event.date, dt.date(2018, 4, 7))
        self.assertEqual(event.time_from, dt.time(9, 30))
        self.assertEqual(event.time_to, dt.time(11, 30))
Ejemplo n.º 30
0
class Test(TestCase):
    def setUp(self):
        Site.objects.update(hostname="joy.test")
        self.home = Page.objects.get(slug='home')
        self.user = User.objects.create_user('i', '*****@*****.**', 's3(R3t')
        self.requestFactory = RequestFactory()
        self.calendar = CalendarPage(owner=self.user,
                                     slug="events",
                                     title="Events")
        self.home.add_child(instance=self.calendar)
        self.calendar.save_revision().publish()
        self.handler = GoogleCalendarHandler()

    def _getRequest(self, path="/"):
        request = self.requestFactory.get(path)
        request.user = self.user
        request.site = self.home.get_site()
        request.session = {}
        request._messages = FallbackStorage(request)
        request.POST = request.POST.copy()
        request.POST['action-publish'] = "action-publish"
        return request

    def testServeSimple(self):
        page = SimpleEventPage(owner=self.user,
                               slug="baseball-game",
                               title="Baseball Game",
                               date=dt.date(2014, 7, 30),
                               time_from=dt.time(13),
                               time_to=dt.time(16),
                               tz=pytz.timezone("America/Los_Angeles"))
        self.calendar.add_child(instance=page)
        page.save_revision().publish()
        response = self.handler.serve(
            page, self._getRequest("/events/baseball-game/"
                                   "?format=google"))
        self.assertEqual(response.status_code, 302)
        self.assertEqual(
            response.url,
            "http://www.google.com/calendar/event?action=TEMPLATE&"
            "text=Baseball+Game&dates=20140730T130000%2F20140730T160000&"
            "ctz=America%2FLos_Angeles")

    def testServeMultiday(self):
        page = MultidayEventPage(owner=self.user,
                                 slug="food-festival",
                                 title="Food Festival",
                                 date_from=dt.date(2018, 11, 2),
                                 date_to=dt.date(2018, 11, 5),
                                 tz=pytz.timezone("Pacific/Niue"))
        self.calendar.add_child(instance=page)
        page.save_revision().publish()
        response = self.handler.serve(
            page, self._getRequest("/events/food-festival/"
                                   "?format=google"))
        self.assertEqual(response.status_code, 302)
        self.assertEqual(
            response.url,
            "http://www.google.com/calendar/event?action=TEMPLATE&"
            "text=Food+Festival&dates=20181102T000000%2F20181105T235959&"
            "ctz=Pacific%2FNiue")

    def testServeRecurring(self):
        page = RecurringEventPage(owner=self.user,
                                  slug="lunch-and-code",
                                  title="Lunch and Code",
                                  repeat=Recurrence(dtstart=dt.date(
                                      2017, 3, 15),
                                                    freq=MONTHLY,
                                                    byweekday=[FR(-1)]),
                                  time_from=dt.time(12),
                                  time_to=dt.time(13),
                                  tz=pytz.timezone("Pacific/Auckland"),
                                  location="70 Molesworth Street, Wellington")
        self.calendar.add_child(instance=page)
        page.save_revision().publish()
        response = self.handler.serve(
            page, self._getRequest("/events/lunch-and-code/"
                                   "?format=google"))
        self.assertEqual(response.status_code, 302)
        self.assertEqual(
            response.url,
            "http://www.google.com/calendar/event?action=TEMPLATE&"
            "text=Lunch+and+Code&"
            "location=70+Molesworth+Street%2C+Wellington&"
            "dates=20170331T120000%2F20170331T130000&"
            "ctz=Pacific%2FAuckland&"
            "recur=RRULE%3AFREQ%3DMONTHLY%3BWKST%3DSU%3BBYDAY%3D-1FR")

    def testServeException(self):
        event = RecurringEventPage(slug="test-meeting",
                                   title="Test Meeting",
                                   repeat=Recurrence(dtstart=dt.date(
                                       1988, 1, 1),
                                                     freq=WEEKLY,
                                                     byweekday=[MO, WE, FR]),
                                   time_from=dt.time(13),
                                   time_to=dt.time(15, 30))
        self.calendar.add_child(instance=event)
        event.save_revision().publish()
        info = ExtraInfoPage(owner=self.user,
                             overrides=event,
                             except_date=dt.date(1988, 11, 11),
                             extra_title="System Demo",
                             extra_information="<h3>System Demo</h3>")
        event.add_child(instance=info)
        info.save_revision().publish()
        response = self.handler.serve(
            info,
            self._getRequest("/events/test-meeting/1998-11-11/extra-info/"
                             "?format=google"))
        self.assertEqual(response.status_code, 302)
        self.assertEqual(
            response.url,
            "http://www.google.com/calendar/event?action=TEMPLATE&"
            "text=Test+Meeting&"
            "dates=19880101T130000%2F19880101T153000&"
            "ctz=Asia%2FTokyo&"
            "recur=RRULE%3AFREQ%3DWEEKLY%3BWKST%3DSU%3BBYDAY%3DMO%2CWE%2CFR")

    def testServeUnsupported(self):
        response = self.handler.serve(self.home, self._getRequest("/"))
        self.assertIsNone(response)