Example #1
0
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
Example #2
0
 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()
Example #3
0
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
Example #4
0
    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
Example #5
0
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
Example #6
0
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
Example #7
0
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
Example #8
0
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
Example #9
0
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
Example #10
0
    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
Example #11
0
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
Example #12
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)