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
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
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
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
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
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
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
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
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'))
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)
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()
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
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)