diff --git a/openedx/plugins/subscriber/MANIFEST.in b/openedx/plugins/subscriber/MANIFEST.in new file mode 100644 index 000000000000..f701c104845c --- /dev/null +++ b/openedx/plugins/subscriber/MANIFEST.in @@ -0,0 +1,3 @@ +include README.rst +include openedx.yaml +recursive-include subscriber *.py \ No newline at end of file diff --git a/openedx/plugins/subscriber/openedx.yaml b/openedx/plugins/subscriber/openedx.yaml new file mode 100644 index 000000000000..79205b9a67f4 --- /dev/null +++ b/openedx/plugins/subscriber/openedx.yaml @@ -0,0 +1,5 @@ +lms: + django_apps: + - subscriber + urls: + - subscriber.urls \ No newline at end of file diff --git a/openedx/plugins/subscriber/setup.py b/openedx/plugins/subscriber/setup.py new file mode 100644 index 000000000000..4e525fa44660 --- /dev/null +++ b/openedx/plugins/subscriber/setup.py @@ -0,0 +1,16 @@ +from setuptools import setup, find_packages + +setup( + name="platform-plugin-subscriber", + version="0.1.0", + packages=find_packages(), + include_package_data=True, + package_data={ + "": ["openedx.yaml"], + }, + entry_points={ + "lms.djangoapp": [ + "subscriber = subscriber.apps:SubscriberConfig", + ], + }, +) diff --git a/openedx/plugins/subscriber/subscriber/__init__.py b/openedx/plugins/subscriber/subscriber/__init__.py new file mode 100644 index 000000000000..9c21340522b3 --- /dev/null +++ b/openedx/plugins/subscriber/subscriber/__init__.py @@ -0,0 +1 @@ +default_app_config = "subscriber.apps.SubscriberConfig" \ No newline at end of file diff --git a/openedx/plugins/subscriber/subscriber/apps.py b/openedx/plugins/subscriber/subscriber/apps.py new file mode 100644 index 000000000000..a4d397d32378 --- /dev/null +++ b/openedx/plugins/subscriber/subscriber/apps.py @@ -0,0 +1,15 @@ +from django.apps import AppConfig + + +class SubscriberConfig(AppConfig): + name = "subscriber" + + plugin_app = { + "url_config": { + "lms.djangoapp": { + "namespace": "subscriber", + "regex": "^api/subscriber/", + "relative_path": "urls", + } + } + } diff --git a/openedx/plugins/subscriber/subscriber/services.py b/openedx/plugins/subscriber/subscriber/services.py new file mode 100644 index 000000000000..8ed89e3e132b --- /dev/null +++ b/openedx/plugins/subscriber/subscriber/services.py @@ -0,0 +1,44 @@ +from common.djangoapps.student.models import CourseEnrollment + +# TODO: Replace with Subscription Catalog API call +SUBSCRIPTION_COURSE_IDS = [ + "course-v1:edX+DemoX+Demo_Course", +] + + +def get_categorized_courses(user): + enrollments = CourseEnrollment.objects.filter( + user=user, + is_active=True + ) + + subscription_courses = [] + upgradeable_courses = [] + non_upgradeable_courses = [] + + # TODO: Replace with real subscription status check + user_is_subscriber = True + + subscription_catalog_courses = SUBSCRIPTION_COURSE_IDS + + for enrollment in enrollments: + course_id = str(enrollment.course_id) + + is_in_catalog = course_id in subscription_catalog_courses + + # TODO: Replace with enrollment mode / upgrade check + is_full_access = user_is_subscriber + + if is_in_catalog: + if is_full_access: + subscription_courses.append(course_id) + else: + upgradeable_courses.append(course_id) + else: + non_upgradeable_courses.append(course_id) + + return { + "subscription_courses": subscription_courses, + "upgradeable_courses": upgradeable_courses, + "non_upgradeable_courses": non_upgradeable_courses, + } diff --git a/openedx/plugins/subscriber/subscriber/urls.py b/openedx/plugins/subscriber/subscriber/urls.py new file mode 100644 index 000000000000..97f57a3c7eaa --- /dev/null +++ b/openedx/plugins/subscriber/subscriber/urls.py @@ -0,0 +1,10 @@ +from django.urls import path +from .views import subscriber_courses + +urlpatterns = [ + path( + "dashboard/courses/", + subscriber_courses, + name="subscriber-dashboard-courses", + ), +] \ No newline at end of file diff --git a/openedx/plugins/subscriber/subscriber/views.py b/openedx/plugins/subscriber/subscriber/views.py new file mode 100644 index 000000000000..5661e57a92d7 --- /dev/null +++ b/openedx/plugins/subscriber/subscriber/views.py @@ -0,0 +1,13 @@ +from django.http import JsonResponse +from django.contrib.auth.decorators import login_required +from .services import get_categorized_courses + + +@login_required +def subscriber_courses(request): + """ + API endpoint for Subscriber Learner Dashboard. + Returns user's enrolled courses grouped into categories. + """ + data = get_categorized_courses(request.user) + return JsonResponse(data)