コード例 #1
0
ファイル: group_id.py プロジェクト: AlexxNica/edx-platform
    def test_cohorted_topic_enrollment_track_invalid_group_id(self, mock_request):
        CourseModeFactory.create(course_id=self.course.id, mode_slug=CourseMode.AUDIT)
        CourseModeFactory.create(course_id=self.course.id, mode_slug=CourseMode.VERIFIED)
        set_course_discussion_settings(
            course_key=self.course.id,
            divided_discussions=['cohorted_topic'],
            division_scheme=CourseDiscussionSettings.ENROLLMENT_TRACK,
            always_divide_inline_discussions=True,
        )

        invalid_id = -1000
        response = self.call_view(mock_request, "cohorted_topic", self.moderator, invalid_id)
        self.assertEqual(response.status_code, 500)
コード例 #2
0
ファイル: tasks.py プロジェクト: luisvasq/edx-platform
def update_discussions_map(context):
    """
    Updates the mapping between discussion_id to discussion block usage key
    for all discussion blocks in the given course.

    context is a dict that contains:
        course_id (string): identifier of the course
    """
    course_key = CourseKey.from_string(context['course_id'])
    discussion_blocks = get_accessible_discussion_xblocks_by_course_id(course_key, include_all=True)
    discussions_id_map = {
        discussion_block.discussion_id: unicode(discussion_block.location)
        for discussion_block in discussion_blocks
    }
    set_course_discussion_settings(course_key, discussions_id_map=discussions_id_map)
コード例 #3
0
ファイル: views.py プロジェクト: edx-solutions/edx-platform
    def patch(self, request, course_id):
        """
        Implement a handler for the PATCH method.
        """
        if request.content_type != MergePatchParser.media_type:
            raise UnsupportedMediaType(request.content_type)

        kwargs = self._get_request_kwargs(course_id)
        form = CourseDiscussionSettingsForm(kwargs, request_user=request.user)
        if not form.is_valid():
            raise ValidationError(form.errors)

        course = form.cleaned_data['course']
        course_key = form.cleaned_data['course_key']
        discussion_settings = get_course_discussion_settings(course_key)

        serializer = DiscussionSettingsSerializer(
            data=request.data,
            partial=True,
            course=course,
            discussion_settings=discussion_settings
        )
        if not serializer.is_valid():
            raise ValidationError(serializer.errors)

        settings_to_change = serializer.validated_data['settings_to_change']

        try:
            discussion_settings = set_course_discussion_settings(course_key, **settings_to_change)
        except ValueError as e:
            raise ValidationError(unicode(e))

        return Response(status=status.HTTP_204_NO_CONTENT)
コード例 #4
0
ファイル: views.py プロジェクト: ahmed-zubair12/edx-platform
    def patch(self, request, course_id):
        """
        Implement a handler for the PATCH method.
        """
        if request.content_type != MergePatchParser.media_type:
            raise UnsupportedMediaType(request.content_type)

        kwargs = self._get_request_kwargs(course_id)
        form = CourseDiscussionSettingsForm(kwargs, request_user=request.user)
        if not form.is_valid():
            raise ValidationError(form.errors)

        course = form.cleaned_data['course']
        course_key = form.cleaned_data['course_key']
        discussion_settings = get_course_discussion_settings(course_key)

        serializer = DiscussionSettingsSerializer(
            data=request.data,
            partial=True,
            course=course,
            discussion_settings=discussion_settings)
        if not serializer.is_valid():
            raise ValidationError(serializer.errors)

        settings_to_change = serializer.validated_data['settings_to_change']

        try:
            discussion_settings = set_course_discussion_settings(
                course_key, **settings_to_change)
        except ValueError as e:
            raise ValidationError(unicode(e))

        return Response(status=status.HTTP_204_NO_CONTENT)
コード例 #5
0
    def test_cohorted_topic_enrollment_track_invalid_group_id(
            self, mock_request):
        CourseModeFactory.create(course_id=self.course.id,
                                 mode_slug=CourseMode.AUDIT)
        CourseModeFactory.create(course_id=self.course.id,
                                 mode_slug=CourseMode.VERIFIED)
        set_course_discussion_settings(
            course_key=self.course.id,
            divided_discussions=['cohorted_topic'],
            division_scheme=CourseDiscussionSettings.ENROLLMENT_TRACK,
            always_divide_inline_discussions=True,
        )

        invalid_id = -1000
        response = self.call_view(mock_request, "cohorted_topic",
                                  self.moderator, invalid_id)
        self.assertEqual(response.status_code, 500)
コード例 #6
0
ファイル: tasks.py プロジェクト: wangrocky/edx-platform
def update_discussions_map(context):
    """
    Updates the mapping between discussion_id to discussion block usage key
    for all discussion blocks in the given course.

    context is a dict that contains:
        course_id (string): identifier of the course
    """
    course_key = CourseKey.from_string(context['course_id'])
    discussion_blocks = get_accessible_discussion_xblocks_by_course_id(
        course_key, include_all=True)
    discussions_id_map = {
        discussion_block.discussion_id: unicode(discussion_block.location)
        for discussion_block in discussion_blocks
    }
    set_course_discussion_settings(course_key,
                                   discussions_id_map=discussions_id_map)
コード例 #7
0
def config_course_cohorts(
    course,
    is_cohorted,
    discussion_division_scheme=CourseDiscussionSettings.COHORT,
    auto_cohorts=[],
    manual_cohorts=[],
):
    """
    Set and configure cohorts for a course.

    Arguments:
        course: CourseDescriptor
        is_cohorted (bool): Is the course cohorted?
        discussion_division_scheme (String): the division scheme for discussions. Default is
            CourseDiscussionSettings.COHORT.
        auto_cohorts (list): Names of auto cohorts to create.
        manual_cohorts (list): Names of manual cohorts to create.

    Returns:
        Nothing -- modifies course in place.
    """

    set_course_cohorted(course.id, is_cohorted)
    set_course_discussion_settings(
        course.id,
        division_scheme=discussion_division_scheme,
    )

    for cohort_name in auto_cohorts:
        cohort = CohortFactory(course_id=course.id, name=cohort_name)
        CourseCohortFactory(course_user_group=cohort,
                            assignment_type=CourseCohort.RANDOM)

    for cohort_name in manual_cohorts:
        cohort = CohortFactory(course_id=course.id, name=cohort_name)
        CourseCohortFactory(course_user_group=cohort,
                            assignment_type=CourseCohort.MANUAL)

    try:
        # Not implemented for XMLModulestore, which is used by test_cohorts.
        modulestore().update_item(course, ModuleStoreEnum.UserID.test)
    except NotImplementedError:
        pass
コード例 #8
0
ファイル: helpers.py プロジェクト: edx-solutions/edx-platform
def config_course_cohorts(
        course,
        is_cohorted,
        discussion_division_scheme=CourseDiscussionSettings.COHORT,
        auto_cohorts=[],
        manual_cohorts=[],
):
    """
    Set and configure cohorts for a course.

    Arguments:
        course: CourseDescriptor
        is_cohorted (bool): Is the course cohorted?
        discussion_division_scheme (String): the division scheme for discussions. Default is
            CourseDiscussionSettings.COHORT.
        auto_cohorts (list): Names of auto cohorts to create.
        manual_cohorts (list): Names of manual cohorts to create.

    Returns:
        Nothing -- modifies course in place.
    """

    set_course_cohorted(course.id, is_cohorted)
    set_course_discussion_settings(
        course.id,
        division_scheme=discussion_division_scheme,
    )

    for cohort_name in auto_cohorts:
        cohort = CohortFactory(course_id=course.id, name=cohort_name)
        CourseCohortFactory(course_user_group=cohort, assignment_type=CourseCohort.RANDOM)

    for cohort_name in manual_cohorts:
        cohort = CohortFactory(course_id=course.id, name=cohort_name)
        CourseCohortFactory(course_user_group=cohort, assignment_type=CourseCohort.MANUAL)

    try:
        # Not implemented for XMLModulestore, which is used by test_cohorts.
        modulestore().update_item(course, ModuleStoreEnum.UserID.test)
    except NotImplementedError:
        pass
コード例 #9
0
ファイル: utils.py プロジェクト: edx-solutions/edx-platform
def config_course_discussions(
        course,
        discussion_topics={},
        divided_discussions=[],
        always_divide_inline_discussions=False
):
        """
        Set discussions and configure divided discussions for a course.

        Arguments:
            course: CourseDescriptor
            discussion_topics (Dict): Discussion topic names. Picks ids and
                sort_keys automatically.
            divided_discussions: Discussion topics to divide. Converts the
                list to use the same ids as discussion topic names.
            always_divide_inline_discussions (bool): Whether inline discussions
                should be divided by default.

        Returns:
            Nothing -- modifies course in place.
        """

        def to_id(name):
            """Convert name to id."""
            return topic_name_to_id(course, name)

        set_course_discussion_settings(
            course.id,
            divided_discussions=[to_id(name) for name in divided_discussions],
            always_divide_inline_discussions=always_divide_inline_discussions,
            division_scheme=CourseDiscussionSettings.COHORT,
        )

        course.discussion_topics = dict((name, {"sort_key": "A", "id": to_id(name)})
                                        for name in discussion_topics)
        try:
            # Not implemented for XMLModulestore, which is used by test_cohorts.
            modulestore().update_item(course, ModuleStoreEnum.UserID.test)
        except NotImplementedError:
            pass
コード例 #10
0
ファイル: utils.py プロジェクト: zhulinhai/edx-platform
def config_course_discussions(
        course,
        discussion_topics={},
        divided_discussions=[],
        always_divide_inline_discussions=False
):
    """
    Set discussions and configure divided discussions for a course.

    Arguments:
        course: CourseDescriptor
        discussion_topics (Dict): Discussion topic names. Picks ids and
            sort_keys automatically.
        divided_discussions: Discussion topics to divide. Converts the
            list to use the same ids as discussion topic names.
        always_divide_inline_discussions (bool): Whether inline discussions
            should be divided by default.

    Returns:
        Nothing -- modifies course in place.
    """

    def to_id(name):
        """Convert name to id."""
        return topic_name_to_id(course, name)

    set_course_discussion_settings(
        course.id,
        divided_discussions=[to_id(name) for name in divided_discussions],
        always_divide_inline_discussions=always_divide_inline_discussions,
        division_scheme=CourseDiscussionSettings.COHORT,
    )

    course.discussion_topics = dict((name, {"sort_key": "A", "id": to_id(name)})
                                    for name in discussion_topics)
    try:
        # Not implemented for XMLModulestore, which is used by test_cohorts.
        modulestore().update_item(course, ModuleStoreEnum.UserID.test)
    except NotImplementedError:
        pass
コード例 #11
0
ファイル: views.py プロジェクト: tanyaxp/edx-platform
def course_discussions_settings_handler(request, course_key_string):
    """
    The restful handler for divided discussion setting requests. Requires JSON.
    This will raise 404 if user is not staff.
    GET
        Returns the JSON representation of divided discussion settings for the course.
    PATCH
        Updates the divided discussion settings for the course. Returns the JSON representation of updated settings.
    """
    course_key = CourseKey.from_string(course_key_string)
    course = get_course_with_access(request.user, 'staff', course_key)
    discussion_settings = get_course_discussion_settings(course_key)

    if request.method == 'PATCH':
        divided_course_wide_discussions, divided_inline_discussions = get_divided_discussions(
            course, discussion_settings)

        settings_to_change = {}

        if 'divided_course_wide_discussions' in request.json or 'divided_inline_discussions' in request.json:
            divided_course_wide_discussions = request.json.get(
                'divided_course_wide_discussions',
                divided_course_wide_discussions)
            divided_inline_discussions = request.json.get(
                'divided_inline_discussions', divided_inline_discussions)
            settings_to_change[
                'divided_discussions'] = divided_course_wide_discussions + divided_inline_discussions

        if 'always_divide_inline_discussions' in request.json:
            settings_to_change[
                'always_divide_inline_discussions'] = request.json.get(
                    'always_divide_inline_discussions')
        if 'division_scheme' in request.json:
            settings_to_change['division_scheme'] = request.json.get(
                'division_scheme')

        if not settings_to_change:
            return JsonResponse({"error": unicode("Bad Request")}, 400)

        try:
            if settings_to_change:
                discussion_settings = set_course_discussion_settings(
                    course_key, **settings_to_change)

        except ValueError as err:
            # Note: error message not translated because it is not exposed to the user (UI prevents this state).
            return JsonResponse({"error": unicode(err)}, 400)

    divided_course_wide_discussions, divided_inline_discussions = get_divided_discussions(
        course, discussion_settings)

    return JsonResponse({
        'id':
        discussion_settings.id,
        'divided_inline_discussions':
        divided_inline_discussions,
        'divided_course_wide_discussions':
        divided_course_wide_discussions,
        'always_divide_inline_discussions':
        discussion_settings.always_divide_inline_discussions,
        'division_scheme':
        discussion_settings.division_scheme,
        'available_division_schemes':
        available_division_schemes(course_key)
    })
コード例 #12
0
ファイル: views.py プロジェクト: mreyk/edx-platform
def course_discussions_settings_handler(request, course_key_string):
    """
    The restful handler for divided discussion setting requests. Requires JSON.
    This will raise 404 if user is not staff.
    GET
        Returns the JSON representation of divided discussion settings for the course.
    PATCH
        Updates the divided discussion settings for the course. Returns the JSON representation of updated settings.
    """
    course_key = CourseKey.from_string(course_key_string)
    course = get_course_with_access(request.user, 'staff', course_key)
    discussion_settings = get_course_discussion_settings(course_key)

    if request.method == 'PATCH':
        divided_course_wide_discussions, divided_inline_discussions = get_divided_discussions(
            course, discussion_settings
        )

        settings_to_change = {}

        if 'divided_course_wide_discussions' in request.json or 'divided_inline_discussions' in request.json:
            divided_course_wide_discussions = request.json.get(
                'divided_course_wide_discussions', divided_course_wide_discussions
            )
            divided_inline_discussions = request.json.get(
                'divided_inline_discussions', divided_inline_discussions
            )
            settings_to_change['divided_discussions'] = divided_course_wide_discussions + divided_inline_discussions

        if 'always_divide_inline_discussions' in request.json:
            settings_to_change['always_divide_inline_discussions'] = request.json.get(
                'always_divide_inline_discussions'
            )
        if 'division_scheme' in request.json:
            settings_to_change['division_scheme'] = request.json.get(
                'division_scheme'
            )

        if not settings_to_change:
            return JsonResponse({"error": unicode("Bad Request")}, 400)

        try:
            if settings_to_change:
                discussion_settings = set_course_discussion_settings(course_key, **settings_to_change)

        except ValueError as err:
            # Note: error message not translated because it is not exposed to the user (UI prevents this state).
            return JsonResponse({"error": unicode(err)}, 400)

    divided_course_wide_discussions, divided_inline_discussions = get_divided_discussions(
        course, discussion_settings
    )

    return JsonResponse({
        'id': discussion_settings.id,
        'divided_inline_discussions': divided_inline_discussions,
        'divided_course_wide_discussions': divided_course_wide_discussions,
        'always_divide_inline_discussions': discussion_settings.always_divide_inline_discussions,
        'division_scheme': discussion_settings.division_scheme,
        'available_division_schemes': available_division_schemes(course_key)
    })