def user_profile(request, course_key, user_id): """ Renders a response to display the user profile page (shown after clicking on a post author's username). """ try: context = create_user_profile_context(request, course_key, user_id) if request.is_ajax(): return utils.JsonResponse({ 'discussion_data': context['threads'], 'page': context['page'], 'num_pages': context['num_pages'], 'annotated_content_info': context['annotated_content_info'], }) else: tab_view = CourseTabView() return tab_view.get(request, unicode(course_key), 'discussion', profile_page_context=context) except User.DoesNotExist: raise Http404 except ValueError: return HttpResponseServerError("Invalid group_id")
def forum_form_discussion(request, course_key): """ Renders the main Discussion page, potentially filtered by a search query """ course = get_course_with_access(request.user, 'load', course_key, check_if_enrolled=True) if request.is_ajax(): user = cc.User.from_django_user(request.user) user_info = user.to_dict() try: unsafethreads, query_params = get_threads(request, course, user_info) # This might process a search query is_staff = has_permission(request.user, 'openclose_thread', course.id) threads = [utils.prepare_content(thread, course_key, is_staff) for thread in unsafethreads] except cc.utils.CommentClientMaintenanceError: return HttpResponseServerError('Forum is in maintenance mode', status=status.HTTP_503_SERVICE_UNAVAILABLE) except ValueError: return HttpResponseServerError("Invalid group_id") with function_trace("get_metadata_for_threads"): annotated_content_info = utils.get_metadata_for_threads(course_key, threads, request.user, user_info) with function_trace("add_courseware_context"): add_courseware_context(threads, course, request.user) return utils.JsonResponse({ 'discussion_data': threads, # TODO: Standardize on 'discussion_data' vs 'threads' 'annotated_content_info': annotated_content_info, 'num_pages': query_params['num_pages'], 'page': query_params['page'], 'corrected_text': query_params['corrected_text'], }) else: course_id = unicode(course.id) tab_view = CourseTabView() return tab_view.get(request, course_id, 'discussion')
def user_profile(request, course_key, user_id): """ Renders a response to display the user profile page (shown after clicking on a post author's username). """ try: context = create_user_profile_context(request, course_key, user_id) if request.is_ajax(): return utils.JsonResponse({ 'discussion_data': context['threads'], 'page': context['page'], 'num_pages': context['num_pages'], 'annotated_content_info': context['annotated_content_info'], }) else: tab_view = CourseTabView() # To avoid mathjax loading from 'mathjax_include.html' # as that file causes multiple loadings of Mathjax on # 'user_profile' page context['load_mathjax'] = False return tab_view.get(request, unicode(course_key), 'discussion', profile_page_context=context) except User.DoesNotExist: raise Http404 except ValueError: return HttpResponseServerError("Invalid group_id")
def user_profile(request, course_key, user_id): """ Renders a response to display the user profile page (shown after clicking on a post author's username). """ try: context = create_user_profile_context(request, course_key, user_id) context['threads'] = add_user_fullname_in_threads(context['threads']) if request.is_ajax(): return utils.JsonResponse({ 'discussion_data': context['threads'], 'page': context['page'], 'num_pages': context['num_pages'], 'annotated_content_info': context['annotated_content_info'], }) else: tab_view = CourseTabView() # To avoid mathjax loading from 'mathjax_include.html' # as that file causes multiple loadings of Mathjax on # 'user_profile' page context['load_mathjax'] = False return tab_view.get(request, unicode(course_key), 'discussion', profile_page_context=context) except User.DoesNotExist: raise Http404 except ValueError: return HttpResponseServerError("Invalid group_id")
def single_thread(request, course_key, discussion_id, thread_id): """ Renders a response to display a single discussion thread. This could either be a page refresh after navigating to a single thread, a direct link to a single thread, or an AJAX call from the discussions UI loading the responses/comments for a single thread. Depending on the HTTP headers, we'll adjust our response accordingly. """ course = get_course_with_access(request.user, 'load', course_key, check_if_enrolled=True) request.user.is_community_ta = utils.is_user_community_ta( request.user, course.id) if request.is_ajax(): cc_user = cc.User.from_django_user(request.user) user_info = cc_user.to_dict() is_staff = has_permission(request.user, 'openclose_thread', course.id) thread = _load_thread_for_viewing( request, course, discussion_id=discussion_id, thread_id=thread_id, raise_event=True, ) with function_trace("get_annotated_content_infos"): annotated_content_info = utils.get_annotated_content_infos( course_key, thread, request.user, user_info=user_info) content = utils.prepare_content(thread.to_dict(), course_key, is_staff) with function_trace("add_courseware_context"): add_courseware_context([content], course, request.user) # [COLARAZ_CUSTOM] content = add_user_fullname_in_threads(content) if len(content) == 1: content = content[0] return utils.JsonResponse({ 'content': content, 'annotated_content_info': annotated_content_info, }) else: course_id = unicode(course.id) tab_view = CourseTabView() return tab_view.get(request, course_id, 'discussion', discussion_id=discussion_id, thread_id=thread_id)
def single_thread(request, course_key, discussion_id, thread_id): """ Renders a response to display a single discussion thread. This could either be a page refresh after navigating to a single thread, a direct link to a single thread, or an AJAX call from the discussions UI loading the responses/comments for a single thread. Depending on the HTTP headers, we'll adjust our response accordingly. """ nr_transaction = newrelic.agent.current_transaction() course = get_course_with_access(request.user, 'load', course_key, check_if_enrolled=True) if request.is_ajax(): cc_user = cc.User.from_django_user(request.user) user_info = cc_user.to_dict() is_staff = has_permission(request.user, 'openclose_thread', course.id) thread = _find_thread(request, course, discussion_id=discussion_id, thread_id=thread_id) if not thread: raise Http404 with newrelic.agent.FunctionTrace(nr_transaction, "get_annotated_content_infos"): annotated_content_info = utils.get_annotated_content_infos( course_key, thread, request.user, user_info=user_info) content = utils.prepare_content(thread.to_dict(), course_key, is_staff) with newrelic.agent.FunctionTrace(nr_transaction, "add_courseware_context"): add_courseware_context([content], course, request.user) return utils.JsonResponse({ 'content': content, 'annotated_content_info': annotated_content_info, }) else: course_id = unicode(course.id) tab_view = CourseTabView() return tab_view.get(request, course_id, 'discussion', discussion_id=discussion_id, thread_id=thread_id)
def single_thread(request, course_key, discussion_id, thread_id): """ Renders a response to display a single discussion thread. This could either be a page refresh after navigating to a single thread, a direct link to a single thread, or an AJAX call from the discussions UI loading the responses/comments for a single thread. Depending on the HTTP headers, we'll adjust our response accordingly. """ course = get_course_with_access(request.user, 'load', course_key, check_if_enrolled=True) if request.is_ajax(): cc_user = cc.User.from_django_user(request.user) user_info = cc_user.to_dict() is_staff = has_permission(request.user, 'openclose_thread', course.id) thread = _load_thread_for_viewing( request, course, discussion_id=discussion_id, thread_id=thread_id, raise_event=True, ) with function_trace("get_annotated_content_infos"): annotated_content_info = utils.get_annotated_content_infos( course_key, thread, request.user, user_info=user_info ) content = utils.prepare_content(thread.to_dict(), course_key, is_staff) with function_trace("add_courseware_context"): add_courseware_context([content], course, request.user) return utils.JsonResponse({ 'content': content, 'annotated_content_info': annotated_content_info, }) else: course_id = unicode(course.id) tab_view = CourseTabView() return tab_view.get(request, course_id, 'discussion', discussion_id=discussion_id, thread_id=thread_id)
def get(self, *args, **kwargs): """ Overrides `get` method to redirect course staff to the instructor list view. This would have been done better if the course tab URL property can tell which user it is providing the URL to. """ course = self.get_course() if not self.get_course().enable_university_id: return redirect('course_root', unicode(course.id)) if self.is_staff(): return redirect('edraak_university:id_staff', course_id=course.id) CourseTabView.register_user_access_warning_messages( self.request, self.get_course_key()) return super(UniversityIDView, self).get(*args, **kwargs)
def get(self, request, course_id, chapter=None, section=None, position=None): """ Displays courseware accordion and associated content. If course, chapter, and section are all specified, renders the page, or returns an error if they are invalid. If section is not specified, displays the accordion opened to the right chapter. If neither chapter or section are specified, displays the user's most recent chapter, or the first chapter if this is the user's first visit. Arguments: request: HTTP request course_id (unicode): course id chapter (unicode): chapter url_name section (unicode): section url_name position (unicode): position in module, eg of <sequential> module """ self.course_key = CourseKey.from_string(course_id) self.request = request self.original_chapter_url_name = chapter self.original_section_url_name = section self.chapter_url_name = chapter self.section_url_name = section self.position = position self.chapter, self.section = None, None self.course = None self.url = request.path try: set_custom_metrics_for_course_key(self.course_key) self._clean_position() with modulestore().bulk_operations(self.course_key): self.course = get_course_with_access( request.user, 'load', self.course_key, depth=CONTENT_DEPTH, check_if_enrolled=True, ) self.is_staff = has_access(request.user, 'staff', self.course) self._setup_masquerade_for_effective_user() return self._get(request) except Exception as exception: # pylint: disable=broad-except return CourseTabView.handle_exceptions(request, self.course, exception)
), url( r'^notification_prefs/resubscribe/(?P<token>[a-zA-Z0-9-_=]+)/', notification_prefs_views.set_subscription, { 'subscribe': True, }, name='resubscribe_forum_update', ), ] urlpatterns += [ url( r'^courses/{}/tab/(?P<tab_type>[^/]+)/$'.format( settings.COURSE_ID_PATTERN, ), CourseTabView.as_view(), name='course_tab_view', ), ] urlpatterns += [ # This MUST be the last view in the courseware--it's a catch-all for custom tabs. url( r'^courses/{}/(?P<tab_slug>[^/]+)/$'.format( settings.COURSE_ID_PATTERN, ), StaticCourseTabView.as_view(), name='static_tab', ), ] if settings.FEATURES.get('ENABLE_STUDENT_HISTORY_VIEW'):
url( r'^notification_prefs/resubscribe/(?P<token>[a-zA-Z0-9-_=]+)/', 'notification_prefs.views.set_subscription', { 'subscribe': True, }, name='resubscribe_forum_update', ), ) urlpatterns += ( url( r'^courses/{}/tab/(?P<tab_type>[^/]+)/$'.format( settings.COURSE_ID_PATTERN, ), CourseTabView.as_view(), name='course_tab_view', ), ) urlpatterns += ( # This MUST be the last view in the courseware--it's a catch-all for custom tabs. url( r'^courses/{}/(?P<tab_slug>[^/]+)/$'.format( settings.COURSE_ID_PATTERN, ), StaticCourseTabView.as_view(), name='static_tab', ), )