Skip to content

Commit

Permalink
Merge branch 'develop' into release/2.7
Browse files Browse the repository at this point in the history
  • Loading branch information
thatbudakguy committed Sep 17, 2020
2 parents 6e5ca9c + 9ab97d8 commit ccf57d1
Show file tree
Hide file tree
Showing 3 changed files with 41 additions and 25 deletions.
48 changes: 26 additions & 22 deletions cdhweb/people/models.py
Original file line number Diff line number Diff line change
@@ -1,30 +1,30 @@
from datetime import date

from django.db import models
from django.contrib.auth.models import User
from django.core.exceptions import ObjectDoesNotExist
from django.db import models
from django.urls import reverse
from django.utils import timezone
from django.utils.text import slugify
from mezzanine.core.fields import RichTextField, FileField
from mezzanine.core.models import Displayable, CONTENT_STATUS_PUBLISHED, \
CONTENT_STATUS_DRAFT
from mezzanine.core.fields import FileField, RichTextField
from mezzanine.core.models import (CONTENT_STATUS_DRAFT,
CONTENT_STATUS_PUBLISHED, Displayable)
from mezzanine.utils.models import AdminThumbMixin, upload_to
from taggit.managers import TaggableManager

from cdhweb.resources.models import Attachment, PublishedQuerySetMixin, \
DateRange
from cdhweb.resources.models import (Attachment, DateRange,
PublishedQuerySetMixin)


class Title(models.Model):
'''Job titles for people'''
title = models.CharField(max_length=255, unique=True)
sort_order = models.PositiveIntegerField(default=0, blank=False,
null=False)
null=False)
# NOTE: defining relationship here because we can't add it to User
# directly
positions = models.ManyToManyField(User, through='Position',
related_name='titles')
related_name='titles')

class Meta:
ordering = ['sort_order']
Expand Down Expand Up @@ -99,8 +99,8 @@ def profile_url(self):

@property
def latest_grant(self):
'''most recent grants where this person is project director'''
mship = self.membership_set.filter(role__title='Project Director') \
'''most recent grants where this person has director role'''
mship = self.membership_set.filter(role__title__in=ProfileQuerySet.director_roles) \
.order_by('-grant__start_date').first()
if mship:
return mship.grant
Expand All @@ -125,11 +125,15 @@ class ProfileQuerySet(PublishedQuerySetMixin):
#: variant postdoc title for Princeton PGRA
postgrad_title = 'Postgraduate Research Associate'

#: position titles that indicate a person is a project director
director_roles = ['Project Director', 'Co-PI: Research Lead']

#: position titles that indicate a staff person is a student
student_titles = ['Graduate Fellow', 'Graduate Assistant',
'Undergraduate Assistant']
#: memebership roles that indicate someone is an affiliate
project_roles = ['Project Director', 'Project Manager']
project_roles = ['Project Director',
'Project Manager', 'Co-PI: Research Lead']

#: student status codes from LDAP
student_pu_status = ['graduate', 'undergraduate']
Expand Down Expand Up @@ -170,8 +174,8 @@ def affiliates(self):
'''Faculty and staff affiliates based on PU status and Project Director
project role. Excludes CDH staff.'''
return self.filter(pu_status__in=('fac', 'stf'),
user__membership__role__title='Project Director') \
.exclude(is_staff=True)
user__membership__role__title__in=self.director_roles) \
.exclude(is_staff=True)

def executive_committee(self):
'''Executive committee members; based on position title.'''
Expand All @@ -193,10 +197,10 @@ def grant_years(self):
# page student staff without grants are still included
return self.annotate(
first_start=models.Min(models.Case(
models.When(user__membership__role__title='Project Director',
models.When(user__membership__role__title__in=self.director_roles,
then='user__membership__grant__start_date'))),
last_end=models.Max(models.Case(
models.When(user__membership__role__title='Project Director',
models.When(user__membership__role__title__in=self.director_roles,
then='user__membership__grant__end_date'))))

def project_manager_years(self):
Expand Down Expand Up @@ -227,7 +231,7 @@ def _current_position_query(self):
models.Q(user__positions__isnull=False) &
(models.Q(user__positions__end_date__isnull=True) |
models.Q(user__positions__end_date__gte=date.today())
)
)
)

def _current_grant_query(self):
Expand Down Expand Up @@ -285,7 +289,7 @@ def order_by_event(self):
earliest_event=models.Min(models.Case(
models.When(user__event__status=CONTENT_STATUS_PUBLISHED,
then='user__event__start_time')))
).order_by('earliest_event')
).order_by('earliest_event')

def order_by_position(self):
'''order by job title sort order and then by start date'''
Expand All @@ -294,7 +298,7 @@ def order_by_position(self):
# not be from the same position)
return self.annotate(min_title=models.Min('user__positions__title__sort_order'),
min_start=models.Min('user__positions__start_date')) \
.order_by('min_title', 'min_start', 'user__last_name')
.order_by('min_title', 'min_start', 'user__last_name')


class Profile(Displayable, AdminThumbMixin):
Expand Down Expand Up @@ -332,12 +336,12 @@ class Profile(Displayable, AdminThumbMixin):
max_length=15, blank=True, default='')

image = FileField(verbose_name="Image",
upload_to=upload_to("people.image", "people"),
format="Image", max_length=255, null=True, blank=True)
upload_to=upload_to("people.image", "people"),
format="Image", max_length=255, null=True, blank=True)

thumb = FileField(verbose_name="Thumbnail",
upload_to=upload_to("people.image", "people/thumbnails"),
format="Image", max_length=255, null=True, blank=True)
upload_to=upload_to("people.image", "people/thumbnails"),
format="Image", max_length=255, null=True, blank=True)

admin_thumb_field = "thumb"

Expand Down
15 changes: 12 additions & 3 deletions cdhweb/people/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -280,11 +280,19 @@ def test_affiliates(self):
faculty = Person.objects.get(username='jk2')
assert faculty.profile in Profile.objects.affiliates()

# faculty person with co-PI: Research Lead should be affiliate
co_pi = Person.objects.create(username='copi')
co_pi_profile = Profile.objects.create(user=co_pi, title="Co-PI", pu_status='fac')
co_pi_role, _created = Role.objects.get_or_create(title='Co-PI: Research Lead')
s_co_grant = Grant.objects.get(pk=4)
s_co = Project.objects.get(slug='sco')
Membership.objects.create(
user=co_pi, project=s_co, grant=s_co_grant, role=co_pi_role)
assert co_pi.profile in Profile.objects.affiliates()

# staff project director is also an affiliate
# (make jay dominick a project director on s&co)
staff = Person.objects.get(username='dominick')
s_co = Project.objects.get(slug='sco')
s_co_grant = Grant.objects.get(pk=4)
proj_director = Role.objects.get(title='Project Director')
Membership.objects.create(
user=staff, project=s_co, grant=s_co_grant, role=proj_director)
Expand Down Expand Up @@ -431,7 +439,8 @@ def test_staff_list(self):

response = self.client.get(reverse('people:staff'))
# person should only appear once even if they have multiple positions
assert response.context['current'].filter(user__username='staff').count() == 1
assert response.context['current'].filter(
user__username='staff').count() == 1

# staffer profile should be included
assert staffer.profile in response.context['current']
Expand Down
3 changes: 3 additions & 0 deletions cdhweb/projects/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -159,6 +159,9 @@ def __str__(self):

# fixme: where does resource type go, for associated links?




class Role(models.Model):
'''A role on a project'''
title = models.CharField(max_length=255, unique=True)
Expand Down

0 comments on commit ccf57d1

Please sign in to comment.