Skip to content

Commit

Permalink
feat: allow course entitlements REST API to be filtered on course_uuid (
Browse files Browse the repository at this point in the history
#32305)

* feat: allow course entitlements REST API to be filtered on course_uuid

* feat: add field to filter out entitlements with null expired_at values

* chore: update tests
  • Loading branch information
christopappas authored May 26, 2023
1 parent 89dcb47 commit 38a69d1
Show file tree
Hide file tree
Showing 2 changed files with 46 additions and 1 deletion.
4 changes: 3 additions & 1 deletion common/djangoapps/entitlements/rest_api/v1/filters.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,9 @@ class CourseEntitlementFilter(filters.FilterSet):

uuid = UUIDListFilter()
user = filters.CharFilter(field_name='user__username')
course_uuid = UUIDListFilter(field_name='course_uuid')
expired_at__isnull = filters.BooleanFilter(field_name='expired_at', lookup_expr='isnull')

class Meta:
model = CourseEntitlement
fields = ('uuid', 'user')
fields = ('uuid', 'user', 'course_uuid')
43 changes: 43 additions & 0 deletions common/djangoapps/entitlements/rest_api/v1/tests/test_views.py
Original file line number Diff line number Diff line change
Expand Up @@ -672,6 +672,49 @@ def test_get_expired_entitlement_by_uuid(self):
results = response.data
assert results.get('expired_at')

def test_entitlements_filter_on_course_uuid_and_expired_at(self):
"""
Verify that courses filtered properly on list of course_uuids.
"""
entitlements = CourseEntitlementFactory.create_batch(5, user=self.user, expired_at=datetime.now())
course_uuids_to_filter_on = {
str(entitlement.course_uuid)
for entitlement in entitlements[0:3]
}
# Create a 2nd entitlement for one of the ones to filter on
active_entitlement = CourseEntitlementFactory.create(
user=self.user,
course_uuid=str(entitlements[0].course_uuid),
expired_at=None,
)

url = reverse('entitlements_api:v1:entitlements-list')
url += f'?user={self.user.username}'
url += f'&course_uuid={",".join(course_uuids_to_filter_on)}'

response = self.client.get(
url,
content_type='application/json',
)
assert response.status_code == 200

results = response.data
assert results['count'] == 4
actual_course_uuids = {entitlement['course_uuid'] for entitlement in results['results']}
assert actual_course_uuids == course_uuids_to_filter_on
assert len(actual_course_uuids) == 3

# Now lets confirm we filter out expired entitlements
url += '&expired_at__isnull=True'
response = self.client.get(
url,
content_type='application/json',
)
assert response.status_code == 200
results = response.data
assert results['count'] == 1
assert results['results'][0]['uuid'] == str(active_entitlement.uuid)

def test_delete_and_revoke_entitlement(self):
course_entitlement = CourseEntitlementFactory.create()
url = reverse(self.ENTITLEMENTS_DETAILS_PATH, args=[str(course_entitlement.uuid)])
Expand Down

0 comments on commit 38a69d1

Please sign in to comment.