Skip to content

Commit

Permalink
Add API endpoint to list all courses average rating (#278)
Browse files Browse the repository at this point in the history
  • Loading branch information
AsadDevAI authored Oct 26, 2021
1 parent 7fd88a7 commit 5c6a2d5
Show file tree
Hide file tree
Showing 5 changed files with 112 additions and 7 deletions.
47 changes: 43 additions & 4 deletions openedx/features/course_rating/api/tests/test_serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,11 @@
from opaque_keys.edx.keys import CourseKey
from student.tests.factories import UserFactory
from openedx.features.course_rating.tests.factories import CourseRatingFactory
from openedx.features.course_rating.api.v1.serializers import CourseRatingSerializer
from openedx.features.course_rating.api.v1.serializers import (
CourseAverageRatingListSerializer,
CourseRatingSerializer,
)
from openedx.features.course_rating.models import CourseAverageRating


class CourseRatingSerializerTests(TestCase):
Expand All @@ -24,20 +28,55 @@ def setUp(self):
rating=3
)
self.expected_data = {
'user': self.user.id,

'id': 1,
'user': self.user.id,
'rating': 3,
'comment': 'This is test comment 0',
'moderated_by': self.moderator.id,
'is_approved': False,
'course_rating': {'total_raters': 1, 'average_rating': '3.00'},
'course_rating': {
'average_rating': '3.00',
'total_raters': 1
},
'course': 'course-v1:edX+DemoX+Demo_Course'
}
super(CourseRatingSerializerTests, self).setUp()

def test_user_data(self):
def test_review_data(self):
"""
Tests response for `CourseRatingSerializer`.
"""
serializer = CourseRatingSerializer(self.course_rating)
assert serializer.data == self.expected_data


class CourseAverageRatingListSerializerTests(TestCase):
"""
Unit tests for `CourseAverageRatingListSerializer`.
"""

def setUp(self):
self.user = UserFactory()
self.moderator = UserFactory(username='moderator2')
self.course = 'course-v1:edX+DemoX+Demo_Course'
self.course_rating = CourseRatingFactory(
user=self.user,
course=CourseKey.from_string('course-v1:edX+DemoX+Demo_Course'),
moderated_by=self.moderator,
rating=3
)
self.expected_data = {
'total_raters': 1,
'course': 'course-v1:edX+DemoX+Demo_Course',
'average_rating': '3.00'
}
super(CourseAverageRatingListSerializerTests, self).setUp()

def test_course_data(self):
"""
Tests response for `CourseAverageRatingListSerializerTests`.
"""
course_average_rating = CourseAverageRating.objects.filter(course=self.course).first()
serializer = CourseAverageRatingListSerializer(course_average_rating)
assert serializer.data == self.expected_data
30 changes: 30 additions & 0 deletions openedx/features/course_rating/api/tests/test_views.py
Original file line number Diff line number Diff line change
Expand Up @@ -111,3 +111,33 @@ def test_course_rating_update(self):
response = client.put(api_url, params, content_type='application/json')
assert response.status_code == status.HTTP_200_OK
assert response.json()['rating'] == params['rating']


class CourseAverageRatingAPIView(TestCase):
"""
Unit tests for CourseAverageRatingAPIView View.
"""

def setUp(self):
"""
Setup data for test cases.
"""
self.user = EdlyUserFactory(password=USER_PASSWORD)
self.request = RequestFactory()
self.site = SiteFactory()
self.request.site = self.site
self.request.user = self.user
self.client = Client(SERVER_NAME=self.request.site.domain)
self.client.login(username=self.user.username, password=USER_PASSWORD)
self.course = 'course-v1:edX+DemoX+Demo_Course'
self.comment = 'Dummy test comment'
self.user_course_rating = CourseRatingFactory(user=self.user, comment=self.comment, rating=5)
self.url = reverse('course_rating_api:course_average_rating')
super(CourseAverageRatingAPIView, self).setUp()

def test_request_data_(self):
"""
Verify request data.
"""
response = self.client.get(self.url)
assert response.status_code == status.HTTP_200_OK
9 changes: 9 additions & 0 deletions openedx/features/course_rating/api/v1/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,3 +28,12 @@ class CourseAverageRatingSerializer(serializers.ModelSerializer):
class Meta:
model = CourseAverageRating
fields = ['average_rating', 'total_raters']


class CourseAverageRatingListSerializer(serializers.ModelSerializer):
"""
Serializer for "CourseAverageRatingListSerializer" model
"""
class Meta:
model = CourseAverageRating
fields = ['course', 'average_rating', 'total_raters']
3 changes: 2 additions & 1 deletion openedx/features/course_rating/api/v1/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
from rest_framework import routers
from django.conf import settings

from openedx.features.course_rating.api.v1.views import CourseRatingViewSet
from openedx.features.course_rating.api.v1.views import CourseRatingViewSet, CourseAverageRatingAPIView

router = routers.DefaultRouter()
router.register(r'course_rating/{}'.format(settings.COURSE_ID_PATTERN), CourseRatingViewSet, base_name='course_rating')
Expand All @@ -15,4 +15,5 @@

urlpatterns = [
url(r'', include(router.urls)),
url(r'course_average_rating/', CourseAverageRatingAPIView.as_view(), name='course_average_rating')
]
30 changes: 28 additions & 2 deletions openedx/features/course_rating/api/v1/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,19 @@
Views for course rating api.
"""
from rest_framework import viewsets
from rest_framework.generics import ListAPIView
from django_filters.rest_framework import DjangoFilterBackend

import organizations
from opaque_keys.edx.keys import CourseKey
from openedx.features.course_rating.api.v1.serializers import CourseRatingSerializer
from openedx.features.course_rating.models import CourseRating

from openedx.features.course_rating.api.v1.serializers import (
CourseAverageRatingListSerializer,
CourseRatingSerializer,
)
from openedx.features.course_rating.models import CourseRating, CourseAverageRating
from openedx.features.course_rating.permissions import CustomCourseRatingPermission
from openedx.features.edly.models import EdlySubOrganization


class CourseRatingViewSet(viewsets.ModelViewSet):
Expand All @@ -26,3 +33,22 @@ def get_queryset(self):
course_id = self.kwargs['course_id']
course_key = CourseKey.from_string(course_id)
return CourseRating.objects.filter(course=course_key)


class CourseAverageRatingAPIView(ListAPIView):
"""
List CourseAverageRating.
"""
serializer_class = CourseAverageRatingListSerializer
model = CourseAverageRating

def get_queryset(self):
edx_orgs = EdlySubOrganization.objects.filter(
lms_site=self.request.site
).values_list('edx_organizations', flat=True)

course_ids = organizations.models.OrganizationCourse.objects.filter(
organization__in=edx_orgs
).values_list('course_id', flat=True)

return CourseAverageRating.objects.filter(course__in=course_ids)

0 comments on commit 5c6a2d5

Please sign in to comment.