Skip to content

Commit

Permalink
Adjust person.views.get_commanders() to ignore title when finding uni…
Browse files Browse the repository at this point in the history
…que commanders
  • Loading branch information
Jean Cochrane (Lead developer, DataMade) committed Sep 3, 2020
1 parent 9a9d585 commit 9388f03
Show file tree
Hide file tree
Showing 4 changed files with 39 additions and 4 deletions.
13 changes: 12 additions & 1 deletion person/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -161,7 +161,13 @@ def get_commanders(mem_start, mem_end, compositions, person_id=None, relationshi
child_id = child.value.uuid

child_commanders_query = '''
SELECT DISTINCT(membership.id)
SELECT
-- Consider two memberships identical if only title is different
DISTINCT ON (
person.id, organization.id, rank.value_id, role.value_id,
first_cited.value, last_cited.value
)
membership.id
FROM membershipperson_membershipperson AS membership
JOIN membershipperson_membershippersonmember AS member
ON membership.id = member.object_ref_id
Expand All @@ -171,6 +177,10 @@ def get_commanders(mem_start, mem_end, compositions, person_id=None, relationshi
ON membership.id = member_org.object_ref_id
JOIN organization_organization AS organization
ON member_org.value_id = organization.id
JOIN membershipperson_membershippersonrank AS rank
ON membership.id = rank.object_ref_id
JOIN membershipperson_membershippersonrole AS Role
ON membership.id = role.object_ref_id
JOIN membershipperson_membershippersonfirstciteddate AS first_cited
ON membership.id = first_cited.object_ref_id
JOIN membershipperson_membershippersonlastciteddate AS last_cited
Expand All @@ -179,6 +189,7 @@ def get_commanders(mem_start, mem_end, compositions, person_id=None, relationshi
AND (first_cited.value < '{mem_end}' or first_cited is NULL)
AND (last_cited.value > '{mem_start}' or last_cited is NULL)
AND person.uuid != '{person_id}'
ORDER BY person.id, organization.id, rank.value_id, role.value_id, first_cited.value, last_cited.value
'''.format(child_id=child_id,
mem_end=mem_end,
mem_start=mem_start,
Expand Down
13 changes: 11 additions & 2 deletions tests/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -565,7 +565,7 @@ def membership_person(access_points, people, organizations):

memberships = []

for member in people[:2]:
for member, organization in zip(people[:2], organizations[:2]):

rank = Rank.objects.create(value='Commander')
role = Role.objects.create(value='Honcho')
Expand All @@ -577,7 +577,7 @@ def membership_person(access_points, people, organizations):
'confidence': '1',
},
'MembershipPerson_MembershipPersonOrganization': {
'value': organizations[0],
'value': organization,
'sources': access_points,
'confidence': '1',
},
Expand Down Expand Up @@ -623,6 +623,15 @@ def membership_person(access_points, people, organizations):

memberships.append(MembershipPerson.create(mem_info))

# Create an additional membership that is the same as the last one, just
# with a different title, for testing apparent duplicates
mem_info['MembershipPerson_MembershipPersonTitle'] = {
'value': 'Second Title',
'sources': access_points,
'confidence': '1',
}
memberships.append(MembershipPerson.create(mem_info))

return memberships


Expand Down
3 changes: 2 additions & 1 deletion tests/test_organization.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,8 @@ def expected_entity_names(emplacement,
composition[0].child.get_value().value.name.get_value().value,
truncatewords(violation.description.get_value(), 10),
membership_organization.organization.get_value().value.name.get_value().value,
] + [mem.member.get_value().value.name.get_value().value for mem in membership_person]
membership_person[0].member.get_value().value.name.get_value().value
]


@pytest.mark.django_db
Expand Down
14 changes: 14 additions & 0 deletions tests/test_person.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@

from source.models import AccessPoint
from person.models import Person
from person.views import get_commanders
from organization.models import Organization
from membershipperson.models import MembershipPerson, Rank, Role
from tests.conftest import is_tab_active
Expand Down Expand Up @@ -688,3 +689,16 @@ def test_person_edit_buttons(setUp, people, membership_person):
)
),
'Postings')


@pytest.mark.django_db
def test_get_commanders_ignores_title(setUp, access_points, people, membership_person, organizations, composition):
"""
get_commanders() should ignore memberships that are identical except for
title. Use the fact that we set up such a membership in the membership_person
fixture to test to make sure get_commanders() only returns one commander.
"""
person_id = people[0].uuid
child_compositions = composition[0].parent.get_value().value.child_organization.all()
commanders = get_commanders(None, None, child_compositions, person_id)
assert len(commanders) == 1

0 comments on commit 9388f03

Please sign in to comment.