Пример #1
0
def make_lecture(link_page, zoom_location):
    """Create a 1hr lecture on zoom with 1 speaker from 2018."""
    lecture_type = EventType.objects.get_or_create(name="Lecture")[0]
    start_time = timezone.datetime(2018, 4, 20, 16, 20, tzinfo=EST).astimezone(tz.utc)
    end_time = timezone.datetime(2018, 4, 20, 17, 20, tzinfo=EST).astimezone(tz.utc)
    lecture = Event(
        title="testing lecture",
        body=to_streamfield_safe(
            "<p>John Lecturer will discuss digital humanities on April 20th.</p>"
        ),
        start_time=start_time,
        end_time=end_time,
        location=zoom_location,
        type=lecture_type,
        join_url="https://princeton.zoom.us/my/zoomroom",
    )
    lecture.last_published_at = start_time - timedelta(days=10)
    link_page.add_child(instance=lecture)
    link_page.save()
    lecturer = Person.objects.create(
        first_name="john",
        last_name="lecturer",
        institution="princeton university",
    )
    Speaker.objects.create(person=lecturer, event=lecture)
    return lecture
Пример #2
0
    def test_ical_event(self):
        jan15 = datetime(2015, 1, 15, hour=16)
        end = jan15 + timedelta(hours=1, minutes=30)
        loc = Location(name='Center for Finger Studies')
        description = 'A revelatory experience'
        event = Event(start_time=jan15,
                      end_time=end,
                      title='DataViz Workshop',
                      location=loc,
                      content='<p>%s</p>' % description,
                      slug='dataviz-workshop')
        ical = event.ical_event()
        assert isinstance(ical, icalendar.Event)
        absurl = absolutize_url(event.get_absolute_url())
        assert ical['uid'] == absurl
        assert ical['summary'] == event.title
        # Dates are in this format, as bytes: 20150115T160000
        assert ical['dtstart'].to_ical() == \
            event.start_time.strftime('%Y%m%dT%H%M%S').encode()
        assert ical['dtend'].to_ical() == \
            event.end_time.strftime('%Y%m%dT%H%M%S').encode()
        assert ical['location'] == loc.display_name
        # description should have tags stripped
        assert description in ical['description'].to_ical().decode()
        assert absurl in ical['description'].to_ical().decode()

        # get by slug with wrong dates - should not be found
        response = self.client.get(
            reverse('event:detail', args=[1999, '01', event.slug]))
        assert response.status_code == 404
Пример #3
0
 def test_get_absolute_url(self):
     jan15 = datetime(2015, 1, 15, tzinfo=timezone.get_default_timezone())
     evt = Event(start_time=jan15, end_time=jan15, slug='some-workshop')
     # single-digit months should be converted to two-digit for url
     resolved_url = resolve(evt.get_absolute_url())
     assert resolved_url.namespace == 'event'
     assert resolved_url.url_name == 'detail'
     assert resolved_url.kwargs['year'] == str(evt.start_time.year)
     assert resolved_url.kwargs['month'] == '%02d' % evt.start_time.month
     assert resolved_url.kwargs['slug'] == evt.slug
Пример #4
0
    def test_duration(self):
        jan15 = datetime(2015,
                         1,
                         15,
                         hour=16,
                         tzinfo=timezone.get_default_timezone())
        end = jan15 + timedelta(hours=1)
        event = Event(start_time=jan15, end_time=end)
        dur = event.duration()
        assert isinstance(dur, timedelta)
        assert dur == timedelta(hours=1)

        # should work with days also
        event.end_time = jan15 + timedelta(days=1)
        assert event.duration().days == 1
Пример #5
0
def make_deadline(link_page):
    """Create a deadline set for 2099."""
    deadline_type = EventType.objects.get_or_create(name="Deadline")[0]
    start_time = timezone.datetime(2099, 1, 1, tzinfo=EST).astimezone(tz.utc)
    end_time = timezone.datetime(2099, 1, 1, tzinfo=EST).astimezone(tz.utc)
    deadline = Event(
        title="testing deadline",
        body=to_streamfield_safe("<p>An important due date in the far future!</p>"),
        start_time=start_time,
        end_time=end_time,
        type=deadline_type,
    )
    deadline.last_published_at = start_time - timedelta(days=10)
    link_page.add_child(instance=deadline)
    link_page.save()
    return deadline
Пример #6
0
def make_course(link_page):
    """Create a course that happened spring 2017."""
    course_type = EventType.objects.get_or_create(name="Course")[0]
    start_time = timezone.datetime(2017, 2, 2, tzinfo=EST).astimezone(tz.utc)
    end_time = timezone.datetime(2017, 4, 27, tzinfo=EST).astimezone(tz.utc)
    course = Event(
        title="testing course",
        body=to_streamfield_safe("<p>February 2017 Intro to Digital Humanities</p>"),
        start_time=start_time,
        end_time=end_time,
        type=course_type,
    )
    course.last_published_at = start_time - timedelta(days=10)
    link_page.add_child(instance=course)
    link_page.save()
    return course
Пример #7
0
def make_workshop(link_page, cdh_location):
    """Create a 2hr workshop at the CDH that happened in 2019."""
    workshop_type = EventType.objects.get_or_create(name="Workshop")[0]
    start_time = timezone.datetime(2019, 10, 5, 9, tzinfo=EST).astimezone(tz.utc)
    end_time = timezone.datetime(2019, 10, 5, 11, tzinfo=EST).astimezone(tz.utc)
    workshop = Event(
        title="testing workshop",
        body=to_streamfield_safe("<p>Digital Mapping workshop for 2019</p>"),
        start_time=start_time,
        end_time=end_time,
        location=cdh_location,
        type=workshop_type,
    )
    workshop.last_published_at = start_time - timedelta(days=10)
    link_page.add_child(instance=workshop)
    link_page.save()
    return workshop
Пример #8
0
def add_upcoming_event(link_page):
    """Create a course that will happen in 2080. This second course is not defined
    as a fixture since it only needs to be called once."""
    course_type = EventType.objects.get_or_create(name="Course")[0]
    start_time = timezone.datetime(2080, 2, 2).astimezone(tz.utc)
    end_time = timezone.datetime(2080, 4, 27).astimezone(tz.utc)
    course = Event(
        title="second testing course",
        body=to_streamfield_safe("<p>February 2080 History of Digital Humanities</p>"),
        start_time=start_time,
        end_time=end_time,
        type=course_type,
    )
    course.last_published_at = start_time - timedelta(days=10)
    link_page.add_child(instance=course)
    link_page.save()
    return course
Пример #9
0
 def test_str(self):
     jan15 = datetime(2015, 1, 15, tzinfo=timezone.get_default_timezone())
     event = Event(title='Learning',
                   start_time=jan15,
                   end_time=jan15,
                   slug='some-workshop')
     assert str(event) == '%s - %s' % (event.title,
                                       jan15.strftime('%b %d, %Y'))
Пример #10
0
 def test_type_required(self, events_link_page, cdh_location):
     """events should require an event type on creation"""
     # create without a type; should fail
     reading_grp = Event(
         title="testing reading group",
         body="my description",
         start_time=timezone.now(),
         end_time=timezone.now(),
         location=cdh_location,
     )
     with pytest.raises(ValidationError):
         events_link_page.add_child(instance=reading_grp)
Пример #11
0
    def test_when(self):
        # same day, both pm
        jan15 = datetime(2015,
                         1,
                         15,
                         hour=16,
                         tzinfo=timezone.get_default_timezone())
        end = jan15 + timedelta(hours=1, minutes=30)
        event = Event(start_time=jan15, end_time=end)
        # start day month date time (no pm), end time (pm)
        assert event.when() == '%s – %s' % (jan15.strftime('%b %d %-I:%M'),
                                            end.strftime('%-I:%M %p').lower())

        # same day, starting in am and ending in pm
        event.start_time = jan15 - timedelta(hours=10)
        # should include am on start time
        # NOTE: %-I should be equivalent to %I with lstrip('0')
        assert event.when() == '%s %s – %s' % \
            (event.start_time.strftime('%b %d %-I:%M'),
             event.start_time.strftime('%p').lower(),
             end.strftime('%I:%M %p').lstrip('0').lower())

        # different days, same month
        event.start_time = jan15 + timedelta(days=1)
        assert event.when() == '%s – %s %s' % \
            (event.start_time.strftime('%b %d %-I:%M'),
             end.strftime('%d %-I:%M'), end.strftime('%p').lower())

        # different timezone should get localized to current timezone
        event.start_time = datetime(2015, 1, 15, hour=20, tzinfo=pytz.UTC)
        event.end_time = event.start_time + timedelta(hours=12)
        assert '3:00 pm' in event.when()

        # different months
        end = jan15 + timedelta(days=35)
        event = Event(start_time=jan15, end_time=end)
        # month name should display
        assert end.strftime('%b') in event.when()

        # different months, same day
        feb15 = datetime(2015,
                         2,
                         15,
                         hour=16,
                         tzinfo=timezone.get_default_timezone())
        event = Event(start_time=jan15, end_time=feb15)
        assert event.start_time.strftime('%b %d') in event.when()
        assert event.end_time.strftime('%b %d') in event.when()
Пример #12
0
 def test_excerpt(self):
     evt = Event(description='excerpt about the event',
                 gen_description=False)
     assert evt.excerpt() == evt.description
     evt.gen_description = True
     assert evt.excerpt() != evt.description
Пример #13
0
    def test_site_index(self):
        index_url = reverse('home')

        # should not error even if no events/projects to display
        response = self.client.get(index_url)
        assert response.status_code == 200
        self.assertContains(response, "Next semester's events are being scheduled.",
                            msg_prefix='should display a message when there are no upcoming events')
        self.assertContains(response, reverse('event:upcoming'),
                            msg_prefix='should link to upcoming events (in lieue of an archive)')

        # test the carousel display
        # shouldn't display without any blog posts
        self.assertTemplateNotUsed(response, 'snippets/carousel.html')
        # add some posts but don't feature any yet; should display most recent 3
        for n in range(1, 8):
            BlogPost.objects.create(title='Post %s' % n)
        response = self.client.get(index_url)
        assert len(response.context['updates']) == 3
        self.assertTemplateUsed(response, 'snippets/carousel.html')
        self.assertContains(response, '<div id="carousel')
        # one "active" slide, the rest are normal
        self.assertContains(
            response, '<div class="post-update active">', count=1)
        self.assertContains(response, '<div class="post-update">', count=2)
        # feature all of the posts; should display most recent 6
        for post in BlogPost.objects.all():
            post.is_featured = True
            post.save()
        response = self.client.get(index_url)
        assert len(response.context['updates']) == 6
        self.assertTemplateUsed(response, 'snippets/carousel.html')
        self.assertContains(response, '<div id="carousel')
        self.assertContains(
            response, '<div class="post-update active">', count=1)
        self.assertContains(response, '<div class="post-update">', count=5)

        # ensure all displayed posts have a title and link
        for post in BlogPost.objects.all()[:6]:
            self.assertContains(response, post.get_absolute_url())
            self.assertContains(response, post.title)

        # test how projects are displayed on the home page
        today = timezone.now()
        site = Site.objects.first()
        projects = Project.objects.bulk_create(
            [Project(title='Meeting %s' % a, slug=a, highlight=True,
                     site=site, short_description='This is project %s' % a)
             for a in string.ascii_letters[:5]]
        )
        grtype = GrantType.objects.create(grant_type='Sponsored Project')
        # add grant that covers the current date
        grant_start = today - timedelta(days=2)
        grant_end = today + timedelta(days=7)
        Grant.objects.bulk_create(
            [Grant(project=proj, grant_type=grtype,
                   start_date=grant_start, end_date=grant_end)
             for proj in Project.objects.all()]
        )

        response = self.client.get(index_url)
        # should be 4 random projects in context
        assert len(response.context['projects']) == 4

        # test that highlight flag is honored
        # - delete one project so that all four will be present
        Project.objects.first().delete()
        # get next project and mark not highlighted
        inactive_proj = Project.objects.first()
        inactive_proj.highlight = False
        inactive_proj.save()
        response = self.client.get(index_url)
        assert inactive_proj not in response.context['projects']

        # get next active project and remove grant
        noncurrent_proj = Project.objects.highlighted().first()
        noncurrent_proj.grant_set.all().delete()
        response = self.client.get(index_url)
        # highlight means it should be included even without grant
        assert noncurrent_proj in response.context['projects']
        # check that brief project details are displayed
        projects = Project.objects.highlighted()
        for proj in projects:
            self.assertContains(response, proj.get_absolute_url())
            self.assertContains(response, proj.title)
            self.assertContains(response, proj.short_description)
            # NOTE: currently not testing thumbnail included

        # test how projects are displayed on the home page
        event_type = EventType.objects.first()
        yesterday = today - timedelta(days=1)
        tomorrow = today + timedelta(days=1)
        past_event = Event.objects.create(start_time=yesterday,
                                          end_time=yesterday, event_type=event_type, title='Old News')
        Event.objects.bulk_create(
            [Event(start_time=tomorrow, end_time=tomorrow, title='event %s' % a,
                   slug=a, event_type=event_type, site=site)
             for a in string.ascii_letters[:5]]
        )

        response = self.client.get(index_url)
        # only three events in context
        assert len(response.context['events']) == 3
        # past event not displayed
        assert past_event not in response.context['events']
        self.assertContains(response, event_type, count=3)
        for event in Event.objects.published().upcoming()[:3]:
            self.assertContains(response, event.get_absolute_url())
            self.assertContains(response, event.title)
            # TODO: date/time

        # test editable page content displayed
        page = Page.objects.get(slug='/')
        self.assertContains(response, page.richtextpage.content)