Skip to content

Commit 077b7aa

Browse files
Filter courses based on orgs for user (#2657)
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
1 parent 6cc708c commit 077b7aa

File tree

2 files changed

+44
-10
lines changed

2 files changed

+44
-10
lines changed

courses/views/v2/__init__.py

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -73,16 +73,21 @@ class CourseFilterSet(django_filters.FilterSet):
7373

7474
def filter_queryset(self, queryset):
7575
request = self.request
76-
user = request.user if request else None
76+
user = getattr(request, "user", None)
7777
org_id = request.query_params.get("org_id") if request else None
7878

79-
if not user or user.is_anonymous:
80-
queryset = queryset.filter(courseruns__b2b_contract__isnull=True)
81-
elif org_id:
82-
queryset = queryset.filter(
83-
courseruns__b2b_contract__organization__id=org_id,
84-
courseruns__b2b_contract__active=True,
85-
)
79+
if org_id:
80+
if (
81+
user
82+
and user.is_authenticated
83+
and user.b2b_organizations.filter(id=org_id).exists()
84+
):
85+
queryset = queryset.filter(
86+
courseruns__b2b_contract__organization_id=org_id,
87+
courseruns__b2b_contract__active=True,
88+
)
89+
else:
90+
return queryset.none()
8691
else:
8792
queryset = queryset.filter(courseruns__b2b_contract__isnull=True)
8893

courses/views/v2/views_test.py

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
from django.urls import reverse
1313
from rest_framework import status
1414
from rest_framework.request import Request
15+
from rest_framework.test import APIClient
1516

1617
from b2b.api import create_contract_run
1718
from b2b.factories import ContractPageFactory, OrganizationPageFactory
@@ -29,6 +30,7 @@
2930
)
3031
from courses.views.v2 import CourseFilterSet, Pagination
3132
from main.test_utils import assert_drf_json_equal, duplicate_queries_check
33+
from users.factories import UserFactory
3234

3335
pytestmark = [pytest.mark.django_db, pytest.mark.usefixtures("raise_nplusone")]
3436

@@ -259,23 +261,50 @@ def test_get_course(
259261

260262

261263
@pytest.mark.django_db
262-
def test_filter_with_org_id_returns_contracted_course(user_drf_client):
264+
def test_filter_with_org_id_returns_contracted_course():
263265
org = OrganizationPageFactory(name="Test Org")
264266
contract = ContractPageFactory(organization=org, active=True)
267+
user = UserFactory()
268+
user.b2b_contracts.add(contract)
265269
course = CourseFactory(title="Contracted Course")
266270
create_contract_run(contract, course)
267271

272+
client = APIClient()
273+
client.force_authenticate(user=user)
274+
268275
unrelated_course = Course.objects.create(title="Other Course")
269276
CourseRunFactory(course=unrelated_course)
270277

271278
url = reverse("v2:courses_api-list")
272-
response = user_drf_client.get(url, {"org_id": org.id})
279+
response = client.get(url, {"org_id": org.id})
273280

274281
titles = [result["title"] for result in response.data["results"]]
275282
assert course.title in titles
276283
assert unrelated_course.title not in titles
277284

278285

286+
@pytest.mark.django_db
287+
def test_filter_with_org_id_user_not_associated_with_org_returns_no_courses():
288+
org = OrganizationPageFactory(name="Test Org")
289+
user = UserFactory()
290+
contract = ContractPageFactory(organization=org, active=True)
291+
course = CourseFactory(title="Contracted Course")
292+
create_contract_run(contract, course)
293+
294+
client = APIClient()
295+
client.force_authenticate(user=user)
296+
297+
unrelated_course = Course.objects.create(title="Other Course")
298+
CourseRunFactory(course=unrelated_course)
299+
300+
url = reverse("v2:courses_api-list")
301+
response = client.get(url, {"org_id": org.id})
302+
303+
titles = [result["title"] for result in response.data["results"]]
304+
assert course.title not in titles
305+
assert unrelated_course.title not in titles
306+
307+
279308
@pytest.mark.django_db
280309
def test_filter_without_org_id_authenticated_user(user_drf_client):
281310
course_with_contract = CourseFactory(title="Contract Course")

0 commit comments

Comments
 (0)