def make_faculty_pi(projects_landing_page): """Create a faculty person with PI role on an associated project.""" person = Person.objects.create(first_name="Josh", cdh_staff=False, pu_status="fac") project = Project(title="MEP") projects_landing_page.add_child(instance=project) projects_landing_page.save() project_director = Role.objects.get_or_create(title="Project Director")[0] dataset_curation = GrantType.objects.get_or_create( grant_type="Dataset Curation")[0] Grant.objects.create( grant_type=dataset_curation, project=project, start_date=date(2019, 9, 1), end_date=date.today() + timedelta(days=30), ) Membership.objects.create( project=project, person=person, role=project_director, start_date=date(2016, 9, 1), ) website = RelatedLinkType.objects.get_or_create(name="Website")[0] PersonRelatedLink.objects.create(person=person, type=website, url="example.com") return person
def setUp(self): """create testing data""" # create titles and roles self.director = Title.objects.create(title="director", sort_order=0) self.dev = Title.objects.create(title="developer", sort_order=1) self.data = Title.objects.create(title="data worker", sort_order=2) self.grad = Title.objects.create(title="Graduate Assistant", sort_order=2) self.undergrad = Title.objects.create(title="Undergraduate Assistant", sort_order=3) self.pgra = Title.objects.create( title="Postgraduate Research Associate") self.exec = Title.objects.get_or_create( title="Executive Committee Member")[0] self.sits_exec = Title.objects.get_or_create( title="Sits with Executive Committee")[0] self.proj_dir = Role.objects.create(title="Project Director") self.co_pi = Role.objects.create(title="Co-PI: Research Lead") self.pm = Role.objects.create(title="Project Manager") # FIXME should use fixtures when these are converted root = Page.objects.first() home = HomePage(title="home", slug="") root.add_child(instance=home) root.save() link = ProjectsLandingPage(title="projects", slug="projects", tagline="let's collaborate") home.add_child(instance=link) home.save() self.project = Project(title="project") link.add_child(instance=self.project) link.save()
def make_grad_pm(projects_landing_page): """Create a grad student person with PM role on an associated project.""" person = Person.objects.create( first_name="Tom", cdh_staff=False, pu_status="graduate", email="*****@*****.**", ) project = Project(title="Reconstructing the Past") projects_landing_page.add_child(instance=project) projects_landing_page.save() project_manager = Role.objects.get_or_create(title="Project Manager")[0] Membership.objects.create( project=project, person=person, role=project_manager, start_date=date(2015, 9, 1), ) dataset_curation = GrantType.objects.get_or_create( grant_type="Dataset Curation")[0] Grant.objects.create( grant_type=dataset_curation, project=project, start_date=date(2015, 9, 1), end_date=date.today() + timedelta(days=30), ) return person
def test_priority(self): proj = Project(title='A project') # default assert ProjectSitemap().priority(proj) == 0.5 # cdh built = higher priority proj.cdh_built = True assert ProjectSitemap().priority(proj) == 0.6 # simulate website url with patch.object(Project, 'website_url', return_val='http://example.com'): # cdh built + website = even higher priority assert ProjectSitemap().priority(proj) == 0.7 # website but not cdh built = not quite as high proj.cdh_built = False assert ProjectSitemap().priority(proj) == 0.6
def make_slavic(projects_landing_page): """a dh working group with one expired seed grant and one current member""" # create the working group pubdate = timezone.datetime(2017, 9, 9, 8, 25, tzinfo=EST).astimezone(tz.utc) slavic = Project( title="Slavic DH Working Group", short_description="Slavic Digital Humanists at Princeton and beyond", working_group=True, ) projects_landing_page.add_child(instance=slavic) projects_landing_page.save() slavic.first_published_at = pubdate slavic.last_published_at = pubdate slavic.save() # dates used one_year_ago = datetime.today() - timedelta(days=365) two_years_ago = one_year_ago - timedelta(days=365) # add a seed grant and one member; grant ended but membership is current seed = GrantType.objects.get_or_create(grant_type="Seed")[0] Grant.objects.create(project=slavic, grant_type=seed, start_date=two_years_ago, end_date=one_year_ago) add_project_member( slavic, "Chair", start_date=two_years_ago, first_name="Natalia", last_name="Ermolaev", ) return slavic
def make_ocampo(projects_landing_page): """a postdoctoral research project with one r&d grant and one current member""" # create the project pubdate = timezone.datetime(2018, 2, 20, 8, 25, tzinfo=EST).astimezone(tz.utc) ocampo = Project( title="Global Networks of Cultural Production", short_description="Epistolary networks in 20th-century Latin America", ) projects_landing_page.add_child(instance=ocampo) projects_landing_page.save() ocampo.first_published_at = pubdate ocampo.last_published_at = pubdate ocampo.save() # add a postdoc grant and one member; no end date so grant/role is current start_date = datetime.today() - timedelta(days=450) prp = GrantType.objects.get_or_create( grant_type="Postdoctoral Research Project")[0] Grant.objects.create(project=ocampo, grant_type=prp, start_date=start_date) add_project_member( ocampo, "Project Director", start_date=start_date, first_name="Nora", last_name="Benedict", ) return ocampo
def make_pliny(projects_landing_page): """a staff r&d project with one current r&d grant and one current member""" # create the project pubdate = timezone.datetime(2019, 10, 11, 8, 25, tzinfo=EST).astimezone(tz.utc) pliny = Project( title="Pliny Project", short_description="A digital network of early Roman writers", ) projects_landing_page.add_child(instance=pliny) projects_landing_page.save() pliny.first_published_at = pubdate pliny.last_published_at = pubdate pliny.save() # add a staff r&d grant and one member; no end date so grant/role is current start_date = datetime.today() - timedelta(days=400) srd = GrantType.objects.get_or_create(grant_type="Staff R&D")[0] Grant.objects.create(project=pliny, grant_type=srd, start_date=start_date) add_project_member( pliny, "Project Director", start_date=start_date, first_name="Ben", last_name="Hicks", ) return pliny
def make_grad_pi(projects_landing_page): """Create a grad student person with PI role on an associated project.""" person = Person.objects.create(first_name="Tom", cdh_staff=False, pu_status="graduate") project = Project(title="Chinese Exchange Poems") projects_landing_page.add_child(instance=project) projects_landing_page.save() project_director = Role.objects.get_or_create(title="Project Director")[0] Membership.objects.create( project=project, person=person, role=project_director, start_date=date(2015, 9, 1), ) dataset_curation = GrantType.objects.get_or_create( grant_type="Dataset Curation")[0] Grant.objects.create( grant_type=dataset_curation, project=project, start_date=date(2015, 9, 1), end_date=date.today() + timedelta(days=30), ) return person
def make_staff_pi(projects_landing_page): """Create a staff (PUL) person with PI role on an associated project.""" person = Person.objects.create(first_name="Thomas", cdh_staff=False, pu_status="stf") project = Project(title="SVP") projects_landing_page.add_child(instance=project) projects_landing_page.save() project_director = Role.objects.get_or_create(title="Project Director")[0] dataset_curation = GrantType.objects.get_or_create( grant_type="Dataset Curation")[0] Grant.objects.create( grant_type=dataset_curation, project=project, start_date=date(2020, 9, 1), end_date=date.today() + timedelta(days=30), ) Membership.objects.create( project=project, person=person, role=project_director, start_date=date(2016, 9, 1), ) return person
def test_latest_grant(self, db, projects_landing_page): """person should track the most recent grant they were director on""" # setup project = Project(title="Project") projects_landing_page.add_child(instance=project) projects_landing_page.save() person = Person.objects.create() director = Role.objects.get_or_create(title="Project Director")[0] pm = Role.objects.get_or_create(title="Project Manager")[0] dcg = GrantType.objects.get_or_create(grant_type="Dataset Curation")[0] grant1 = Grant.objects.create( project=project, grant_type=dcg, start_date=date(2016, 5, 1), end_date=date(2016, 9, 30), ) grant2 = Grant.objects.create( project=project, grant_type=dcg, start_date=date(2017, 1, 1), end_date=date(2017, 5, 31), ) # no memberships = no latest grant assert person.latest_grant is None # current grant but not project director = no latest grant mship = Membership.objects.create( person=person, role=pm, project=project, start_date=date(2016, 5, 1), end_date=date(2016, 9, 30), ) assert person.latest_grant is None # project director on older grant; should return older grant as latest mship.role = director mship.save() assert person.latest_grant == grant1 # project director on most recent grant; should return as latest mship.start_date = date(2017, 1, 1) mship.end_date = date(2017, 5, 31) mship.save() assert person.latest_grant == grant2 # project director on both grants; should return newer one mship2 = Membership.objects.create( person=person, role=director, project=project, start_date=date(2016, 5, 1), end_date=date(2016, 9, 30), ) assert person.latest_grant == grant2 # project directorship with no end date; should count as latest mship2.delete() mship.end_date = None mship.save() assert person.latest_grant == grant2 # project director on grant with no end date; should count as latest mship.end_date = date(2017, 5, 31) mship.save() grant2.end_date = None grant2.save() assert person.latest_grant == grant2
def make_derrida(projects_landing_page): """a sponsored project with two different grants and project teams""" # dates used pubdate = timezone.datetime(2019, 3, 4, 8, 25, tzinfo=EST).astimezone(tz.utc) tomorrow = datetime.today() + timedelta(days=1) one_year_ago = datetime.today() - timedelta(days=365) two_years_ago = one_year_ago - timedelta(days=365) # create the project derrida = Project( title="Derrida's Margins", short_description= "A digital home for Jacques Derrida's personal library", ) projects_landing_page.add_child(instance=derrida) projects_landing_page.save() derrida.first_published_at = pubdate derrida.last_published_at = pubdate derrida.save() # add grants: DCG from last year and RPG from this year dcg = GrantType.objects.get_or_create(grant_type="Dataset Curation")[0] rpg = GrantType.objects.get_or_create(grant_type="Research Partnership")[0] Grant.objects.create(project=derrida, grant_type=dcg, start_date=two_years_ago, end_date=one_year_ago) Grant.objects.create(project=derrida, grant_type=rpg, start_date=one_year_ago, end_date=tomorrow) # add memberships for initial project team (first year) add_project_member( derrida, "Project Director", start_date=two_years_ago, end_date=tomorrow, first_name="Katie", last_name="Chenoweth", ) add_project_member( derrida, "Lead Developer", start_date=two_years_ago, end_date=tomorrow, first_name="Rebecca", last_name="Koeser", ) add_project_member( derrida, "Project Manager", start_date=two_years_ago, end_date=one_year_ago, first_name="Rebecca", last_name="Munson", ) # add new memberships for past year add_project_member( derrida, "Grad Assistant", start_date=one_year_ago, end_date=tomorrow, first_name="Chloe", last_name="Vettier", ) add_project_member( derrida, "Project Manager", start_date=one_year_ago, end_date=tomorrow, first_name="Renee", last_name="Altergott", ) return derrida
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)