Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: [AXM-1591] remove courses with zero size #2599

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 14 additions & 15 deletions lms/djangoapps/mobile_api/download_courses/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,10 @@
Views for the download courses API.
"""

from django.conf import settings
from django.contrib.auth.models import User # lint-amnesty, pylint: disable=imported-auth-user
from django.shortcuts import get_object_or_404
from rest_framework import views
from rest_framework.response import Response
from urllib.parse import urljoin

from common.djangoapps.student.models import CourseEnrollment, User # lint-amnesty, pylint: disable=reimported
from lms.djangoapps.courseware.access import is_mobile_available_for_user
Expand Down Expand Up @@ -74,18 +72,19 @@ def get(self, request, *args, **kwargs) -> Response:
for enrollment in user_enrollments
if is_mobile_available_for_user(user, enrollment.course_overview)
]
response_data = []

for user_enrollment in mobile_available:
course_id = user_enrollment.course_overview.id
offline_course_size = OfflineCourseSize.objects.filter(course_id=course_id).first()
response_data.append(
{
"course_id": str(course_id),
"course_name": user_enrollment.course_overview.display_name,
"course_image": user_enrollment.course_overview.course_image_url,
"total_size": getattr(offline_course_size, "size", 0),
}
)
course_ids = [enrollment.course_overview.id for enrollment in mobile_available]
offline_course_sizes = OfflineCourseSize.objects.filter(course_id__in=course_ids, size__gt=0)
size_map = {size.course_id: size.size for size in offline_course_sizes}

response_data = [
{
"course_id": str(user_enrollment.course_overview.id),
"course_name": user_enrollment.course_overview.display_name,
"course_image": user_enrollment.course_overview.course_image_url,
"total_size": size_map.get(user_enrollment.course_overview.id)
}
for user_enrollment in mobile_available
if user_enrollment.course_overview.id in size_map
]

return Response(response_data)
48 changes: 48 additions & 0 deletions lms/djangoapps/mobile_api/tests/test_download_courses_views.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
"""
Tests for download courses API view.
"""

from unittest.mock import patch

from django.urls import reverse
from rest_framework import status

from common.djangoapps.student.tests.factories import CourseEnrollmentFactory
from lms.djangoapps.mobile_api.testutils import MobileAPITestCase
from openedx.features.offline_mode.models import OfflineCourseSize


class DownloadCoursesAPIViewTest(MobileAPITestCase):
"""
Download courses API view tests.
"""

def setUp(self):
super().setUp()
self.enrollment = CourseEnrollmentFactory.create(user=self.user, course_id=self.course.id, is_active=True)
self.url = reverse("download-courses", kwargs={"api_version": "v1", "username": self.user.username})
self.login_and_enroll()

@patch("lms.djangoapps.mobile_api.download_courses.views.is_mobile_available_for_user", return_value=True)
def test_get_download_courses_success(self, mock_mobile_available):
"""
Test that the API returns the expected response.
"""
OfflineCourseSize.objects.create(course_id=self.course.id, size=123456)

response = self.client.get(self.url)
self.assertEqual(response.status_code, status.HTTP_200_OK)
self.assertEqual(len(response.data), 1)
self.assertEqual(response.data[0]["course_id"], str(self.course.id))
self.assertEqual(response.data[0]["course_name"], self.course.display_name)
self.assertEqual(response.data[0]["course_image"], self.enrollment.course_overview.course_image_url)
self.assertEqual(response.data[0]["total_size"], 123456)

@patch("lms.djangoapps.mobile_api.download_courses.views.is_mobile_available_for_user", return_value=True)
def test_excludes_courses_with_no_offline_content(self, mock_mobile_available):
"""
Test that courses with no offline content are not returned in the API response.
"""
response = self.client.get(self.url)
self.assertEqual(response.status_code, status.HTTP_200_OK)
self.assertEqual(len(response.data), 0)
Loading