From 0bb47bf87ef0170ea5d210f5c1dd745239a43aae Mon Sep 17 00:00:00 2001 From: Shafqat Farhan Date: Sat, 17 Sep 2022 07:13:37 +0500 Subject: [PATCH] fix: VAN-1080 - Users getting already enrolled courses recommendations --- .../learner_dashboard/api/v0/views.py | 12 ++- .../RecommendationsPanel.jsx | 75 +++++++++++-------- 2 files changed, 56 insertions(+), 31 deletions(-) diff --git a/lms/djangoapps/learner_dashboard/api/v0/views.py b/lms/djangoapps/learner_dashboard/api/v0/views.py index 87ebf1d592..f63d1ea125 100644 --- a/lms/djangoapps/learner_dashboard/api/v0/views.py +++ b/lms/djangoapps/learner_dashboard/api/v0/views.py @@ -373,8 +373,17 @@ class CourseRecommendationApiView(APIView): return Response(status=400) recommended_courses = [] + user_enrolled_course_keys = set() fields = ['title', 'owners', 'marketing_url'] - for course_id in course_keys: + + course_enrollments = CourseEnrollment.enrollments_for_user(request.user) + for course_enrollment in course_enrollments: + course_key = f'{course_enrollment.course_id.org}+{course_enrollment.course_id.course}' + user_enrolled_course_keys.add(course_key) + + # Pick 5 course keys, excluding the user's already enrolled course(s). + enrollable_course_keys = list(set(course_keys).difference(user_enrolled_course_keys))[:5] + for course_id in enrollable_course_keys: course_data = get_course_data(course_id, fields) if course_data: recommended_courses.append({ @@ -384,4 +393,5 @@ class CourseRecommendationApiView(APIView): 'marketing_url': course_data.get('marketing_url') }) + segment.track(user_id, 'edx.bi.user.recommendations.count', {'count': len(recommended_courses)}) return Response({'courses': recommended_courses, 'is_personalized_recommendation': not is_control}, status=200) diff --git a/lms/static/js/learner_dashboard/RecommendationsPanel.jsx b/lms/static/js/learner_dashboard/RecommendationsPanel.jsx index bfeb174ff5..d4a7bc9ec1 100644 --- a/lms/static/js/learner_dashboard/RecommendationsPanel.jsx +++ b/lms/static/js/learner_dashboard/RecommendationsPanel.jsx @@ -10,6 +10,7 @@ class RecommendationsPanel extends React.Component { this.onCourseSelect = this.onCourseSelect.bind(this); this.getCourseList = this.getCourseList.bind(this); this.state = { + isLoading: true, isPersonalizedRecommendation: false, coursesList: [], }; @@ -51,6 +52,7 @@ class RecommendationsPanel extends React.Component { }); this.setState({ + isLoading: false, coursesList: coursesRecommendationData.courses, isPersonalizedRecommendation: coursesRecommendationData.is_personalized_recommendation }); @@ -60,44 +62,57 @@ class RecommendationsPanel extends React.Component { this.getCourseList(); }; - render() { return (
-
{gettext('Recommendations for you')}
-
- {this.state.coursesList.length ? this.state.coursesList.map(course => ( - this.onCourseSelect(course.course_key)}> -
-
- course image -
-
- {course.title} -
-
-
- )) : ( -
+ {this.state.isLoading ? ( +
+
{gettext('Recommendations for you')}
+
{gettext('loading')}
- )} -
- +
+ ) : ( +
+ {this.state.coursesList.length ? ( +
+
{gettext('Recommendations for you')}
+
+ {this.state.coursesList.map(course => ( + this.onCourseSelect(course.course_key)}> +
+
+ course image +
+
+ {course.title} +
+
+
+ ))} +
+
+ ) : null} +
+ )} {this.props.exploreCoursesUrl ? ( -
- - {gettext('Explore courses')} - +
+ {!(this.state.coursesList.length || this.state.isLoading) && +
{gettext('Browse recently launched courses and see what\'s new in your favorite subjects.')}
} +
) : null}