feat: added new v2 for course config api (#34804)
This commit is contained in:
@@ -279,7 +279,7 @@ def get_thread_list_url(request, course_key, topic_id_list=None, following=False
|
||||
return request.build_absolute_uri(urlunparse(("", "", path, "", urlencode(query_list), "")))
|
||||
|
||||
|
||||
def get_course(request, course_key):
|
||||
def get_course(request, course_key, check_tab=True):
|
||||
"""
|
||||
Return general discussion information for the course.
|
||||
|
||||
@@ -289,6 +289,7 @@ def get_course(request, course_key):
|
||||
determining the requesting user.
|
||||
|
||||
course_key: The key of the course to get information for
|
||||
check_tab: Whether to check if the discussion tab is enabled for the course
|
||||
|
||||
Returns:
|
||||
|
||||
@@ -322,7 +323,7 @@ def get_course(request, course_key):
|
||||
"""
|
||||
return dt.isoformat().replace('+00:00', 'Z')
|
||||
|
||||
course = _get_course(course_key, request.user)
|
||||
course = _get_course(course_key, request.user, check_tab=check_tab)
|
||||
user_roles = get_user_role_names(request.user, course_key)
|
||||
course_config = DiscussionsConfiguration.get(course_key)
|
||||
EDIT_REASON_CODES = getattr(settings, "DISCUSSION_MODERATION_EDIT_REASON_CODES", {})
|
||||
@@ -331,7 +332,7 @@ def get_course(request, course_key):
|
||||
course_config.posting_restrictions,
|
||||
course.get_discussion_blackout_datetimes()
|
||||
)
|
||||
|
||||
discussion_tab = CourseTabList.get_tab_by_type(course.tabs, 'discussion')
|
||||
return {
|
||||
"id": str(course_key),
|
||||
"is_posting_enabled": is_posting_enabled,
|
||||
@@ -370,7 +371,7 @@ def get_course(request, course_key):
|
||||
{"code": reason_code, "label": label}
|
||||
for (reason_code, label) in CLOSE_REASON_CODES.items()
|
||||
],
|
||||
|
||||
'show_discussions': bool(discussion_tab and discussion_tab.is_enabled(course, request.user)),
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -189,6 +189,10 @@ class GetCourseTest(ForumsEnableMixin, UrlResetMixin, SharedModuleStoreTestCase)
|
||||
with pytest.raises(DiscussionDisabledError):
|
||||
get_course(self.request, _discussion_disabled_course_for(self.user).id)
|
||||
|
||||
def test_discussions_disabled_v2(self):
|
||||
data = get_course(self.request, _discussion_disabled_course_for(self.user).id, False)
|
||||
assert data['show_discussions'] is False
|
||||
|
||||
def test_basic(self):
|
||||
assert get_course(self.request, self.course.id) == {
|
||||
'id': str(self.course.id),
|
||||
@@ -211,6 +215,7 @@ class GetCourseTest(ForumsEnableMixin, UrlResetMixin, SharedModuleStoreTestCase)
|
||||
'user_roles': {'Student'},
|
||||
'edit_reasons': [{'code': 'test-edit-reason', 'label': 'Test Edit Reason'}],
|
||||
'post_close_reasons': [{'code': 'test-close-reason', 'label': 'Test Close Reason'}],
|
||||
'show_discussions': True,
|
||||
}
|
||||
|
||||
@ddt.data(
|
||||
|
||||
@@ -538,6 +538,7 @@ class CourseViewTest(DiscussionAPIViewTestMixin, ModuleStoreTestCase):
|
||||
"user_roles": ["Student"],
|
||||
"edit_reasons": [{"code": "test-edit-reason", "label": "Test Edit Reason"}],
|
||||
"post_close_reasons": [{"code": "test-close-reason", "label": "Test Close Reason"}],
|
||||
'show_discussions': True,
|
||||
}
|
||||
)
|
||||
|
||||
|
||||
@@ -16,6 +16,7 @@ from lms.djangoapps.discussion.rest_api.views import (
|
||||
CourseTopicsViewV2,
|
||||
CourseTopicsViewV3,
|
||||
CourseView,
|
||||
CourseViewV2,
|
||||
LearnerThreadView,
|
||||
ReplaceUsernamesView,
|
||||
RetireUserView,
|
||||
@@ -64,6 +65,11 @@ urlpatterns = [
|
||||
CourseView.as_view(),
|
||||
name="discussion_course"
|
||||
),
|
||||
re_path(
|
||||
fr"^v2/courses/{settings.COURSE_ID_PATTERN}",
|
||||
CourseViewV2.as_view(),
|
||||
name="discussion_course_v2"
|
||||
),
|
||||
re_path(r'^v1/accounts/retire_forum/?$', RetireUserView.as_view(), name="retire_discussion_user"),
|
||||
path('v1/accounts/replace_username', ReplaceUsernamesView.as_view(), name="replace_discussion_username"),
|
||||
re_path(
|
||||
|
||||
@@ -119,6 +119,36 @@ class CourseView(DeveloperErrorViewMixin, APIView):
|
||||
return Response(get_course(request, course_key))
|
||||
|
||||
|
||||
@view_auth_classes()
|
||||
class CourseViewV2(DeveloperErrorViewMixin, APIView):
|
||||
"""
|
||||
General discussion metadata API v2.
|
||||
"""
|
||||
|
||||
@apidocs.schema(
|
||||
parameters=[
|
||||
apidocs.string_parameter("course_id", apidocs.ParameterLocation.PATH, description="Course ID")
|
||||
],
|
||||
responses={
|
||||
200: CourseMetadataSerailizer(read_only=True, required=False),
|
||||
401: "The requester is not authenticated.",
|
||||
403: "The requester cannot access the specified course.",
|
||||
404: "The requested course does not exist.",
|
||||
}
|
||||
)
|
||||
def get(self, request, course_id):
|
||||
"""
|
||||
Retrieve general discussion metadata for a course.
|
||||
|
||||
**Example Requests**:
|
||||
GET /api/discussion/v2/courses/course-v1:ExampleX+Subject101+2015
|
||||
"""
|
||||
course_key = CourseKey.from_string(course_id)
|
||||
# Record user activity for tracking progress towards a user's course goals (for mobile app)
|
||||
UserActivity.record_user_activity(request.user, course_key, request=request, only_if_mobile_app=True)
|
||||
return Response(get_course(request, course_key, False))
|
||||
|
||||
|
||||
@view_auth_classes()
|
||||
class CourseActivityStatsView(DeveloperErrorViewMixin, APIView):
|
||||
"""
|
||||
|
||||
Reference in New Issue
Block a user