Commit d539e900 by Rocky Duan

retrieve threads by ajax

parent fbfe0d02
...@@ -11,7 +11,9 @@ from courseware.courses import check_course ...@@ -11,7 +11,9 @@ from courseware.courses import check_course
from dateutil.tz import tzlocal from dateutil.tz import tzlocal
from datehelper import time_ago_in_words from datehelper import time_ago_in_words
from django_comment_client.utils import get_categorized_discussion_info, extract, strip_none from django_comment_client.utils import get_categorized_discussion_info, \
extract, strip_none, \
JsonResponse
from urllib import urlencode from urllib import urlencode
import json import json
...@@ -125,8 +127,7 @@ def forum_form_discussion(request, course_id, discussion_id): ...@@ -125,8 +127,7 @@ def forum_form_discussion(request, course_id, discussion_id):
} }
return render_to_response('discussion/index.html', context) return render_to_response('discussion/index.html', context)
def render_single_thread(request, course_id, thread_id): def get_annotated_content_info(thread, user_id):
def get_annotated_content_info(thread, user_id):
infos = {} infos = {}
def _annotate(content): def _annotate(content):
infos[str(content['id'])] = { infos[str(content['id'])] = {
...@@ -137,12 +138,17 @@ def render_single_thread(request, course_id, thread_id): ...@@ -137,12 +138,17 @@ def render_single_thread(request, course_id, thread_id):
_annotate(thread) _annotate(thread)
return infos return infos
def render_single_thread(request, course_id, thread_id):
thread = comment_client.get_thread(thread_id, recursive=True) thread = comment_client.get_thread(thread_id, recursive=True)
annotated_content_info = get_annotated_content_info(thread=thread, \
user_id=request.user.id)
context = { context = {
'thread': thread, 'thread': thread,
'user_info': comment_client.get_user_info(request.user.id, raw=True), 'user_info': comment_client.get_user_info(request.user.id, raw=True),
'annotated_content_info': json.dumps(get_annotated_content_info(thread=thread, user_id=request.user.id)), 'annotated_content_info': json.dumps(annotated_content_info),
'course_id': course_id, 'course_id': course_id,
'request': request, 'request': request,
} }
...@@ -150,6 +156,20 @@ def render_single_thread(request, course_id, thread_id): ...@@ -150,6 +156,20 @@ def render_single_thread(request, course_id, thread_id):
def single_thread(request, course_id, discussion_id, thread_id): def single_thread(request, course_id, discussion_id, thread_id):
if request.is_ajax():
thread = comment_client.get_thread(thread_id, recursive=True)
annotated_content_info = get_annotated_content_info(thread=thread, \
user_id=request.user.id)
context = {'thread': thread}
html = render_to_string('discussion/_ajax_single_thread.html', context)
return JsonResponse({
'html': html,
'annotated_content_info': annotated_content_info,
})
else:
course = check_course(course_id) course = check_course(course_id)
context = { context = {
......
...@@ -12,7 +12,6 @@ $ -> ...@@ -12,7 +12,6 @@ $ ->
$(".discussion-module").each (index, elem) -> $(".discussion-module").each (index, elem) ->
Discussion.initializeDiscussionModule(elem) Discussion.initializeDiscussionModule(elem)
$("section.discussion").each (index, discussion) -> $("section.discussion").each (index, discussion) ->
Discussion.initializeDiscussion(discussion) Discussion.initializeDiscussion(discussion)
Discussion.bindDiscussionEvents(discussion) Discussion.bindDiscussionEvents(discussion)
...@@ -80,7 +79,7 @@ Discussion = ...@@ -80,7 +79,7 @@ Discussion =
</form> </form>
""" """
urlFor: (name, param) -> urlFor: (name, param, param1) ->
{ {
watch_commentable : "/courses/#{$$course_id}/discussion/#{param}/watch" watch_commentable : "/courses/#{$$course_id}/discussion/#{param}/watch"
unwatch_commentable : "/courses/#{$$course_id}/discussion/#{param}/unwatch" unwatch_commentable : "/courses/#{$$course_id}/discussion/#{param}/unwatch"
...@@ -102,6 +101,7 @@ Discussion = ...@@ -102,6 +101,7 @@ Discussion =
search : "/courses/#{$$course_id}/discussion/forum/search" search : "/courses/#{$$course_id}/discussion/forum/search"
tags_autocomplete : "/courses/#{$$course_id}/discussion/threads/tags/autocomplete" tags_autocomplete : "/courses/#{$$course_id}/discussion/threads/tags/autocomplete"
retrieve_discussion : "/courses/#{$$course_id}/discussion/forum/#{param}/inline" retrieve_discussion : "/courses/#{$$course_id}/discussion/forum/#{param}/inline"
retrieve_single_thread : "/courses/#{$$course_id}/discussion/forum/#{param}/threads/#{param1}"
}[name] }[name]
handleAnchorAndReload: (response) -> handleAnchorAndReload: (response) ->
...@@ -119,7 +119,7 @@ Discussion = ...@@ -119,7 +119,7 @@ Discussion =
$elem.attr("disabled", "disabled") $elem.attr("disabled", "disabled")
discussion_id = $elem.attr("discussion_id") discussion_id = $elem.attr("discussion_id")
url = Discussion.urlFor 'retrieve_discussion', discussion_id url = Discussion.urlFor 'retrieve_discussion', discussion_id
$.ajax $.ajax(
url: url url: url
method: "GET" method: "GET"
success: (data, textStatus, xhr) -> success: (data, textStatus, xhr) ->
...@@ -127,11 +127,13 @@ Discussion = ...@@ -127,11 +127,13 @@ Discussion =
discussion = $local("section.discussion") discussion = $local("section.discussion")
Discussion.initializeDiscussion(discussion) Discussion.initializeDiscussion(discussion)
Discussion.bindDiscussionEvents(discussion) Discussion.bindDiscussionEvents(discussion)
$elem.removeAttr("disabled")
$elem.html("Hide Discussion") $elem.html("Hide Discussion")
$elem.unbind('click').click -> $elem.unbind('click').click ->
handleHideDiscussion(this) handleHideDiscussion(this)
dataType: 'html' dataType: 'html'
).always ->
$elem.removeAttr("disabled")
else else
$local("section.discussion").show() $local("section.discussion").show()
$elem.html("Hide Discussion") $elem.html("Hide Discussion")
...@@ -184,8 +186,6 @@ Discussion = ...@@ -184,8 +186,6 @@ Discussion =
watchDiscussion = generateDiscussionLink("discussion-watch-discussion", "Watch", handleWatchDiscussion) watchDiscussion = generateDiscussionLink("discussion-watch-discussion", "Watch", handleWatchDiscussion)
$local(".discussion-title-wrapper").append(watchDiscussion) $local(".discussion-title-wrapper").append(watchDiscussion)
initializeWatchThreads = (index, thread) -> initializeWatchThreads = (index, thread) ->
$thread = $(thread) $thread = $(thread)
id = $thread.attr("_id") id = $thread.attr("_id")
...@@ -219,7 +219,6 @@ Discussion = ...@@ -219,7 +219,6 @@ Discussion =
$local(".thread").each(initializeVote).each(initializeWatchThreads) $local(".thread").each(initializeVote).each(initializeWatchThreads)
initializeWatchDiscussion(discussion) initializeWatchDiscussion(discussion)
if $$tags?
$local(".new-post-tags").tagsInput $local(".new-post-tags").tagsInput
autocomplete_url: Discussion.urlFor('tags_autocomplete') autocomplete_url: Discussion.urlFor('tags_autocomplete')
autocomplete: autocomplete:
...@@ -381,6 +380,47 @@ Discussion = ...@@ -381,6 +380,47 @@ Discussion =
Discussion.handleAnchorAndReload(response) Discussion.handleAnchorAndReload(response)
, 'json' , 'json'
handleHideSingleThread = (elem) ->
$elem = $(elem)
$content.children(".comments").hide()
$elem.unbind('click').click ->
handleShowSingleThread(this)
handleShowSingleThread = (elem) ->
$elem = $(elem)
if $elem.attr("disabled")
return
if $content.children(".comments").length
$content.children(".comments").show()
$elem.unbind('click').click ->
handleHideSingleThread(this)
else
$elem.attr("disabled", "disabled")
discussion_id = $elem.parents(".discussion").attr("_id")
url = Discussion.urlFor('retrieve_single_thread', discussion_id, id)
console.log url
$.ajax(
url: url
method: "GET"
success: (response, textStatus) ->
if not $$annotated_content_info?
window.$$annotated_content_info = {}
console.log response
window.$$annotated_content_info = $.extend $$annotated_content_info, response['annotated_content_info']
console.log $$annotated_content_info
$content.append(response['html'])
$content.find(".comment").each (index, comment) ->
Discussion.initializeContent(comment)
Discussion.bindContentEvents(comment)
$elem.unbind('click').click ->
handleHideSingleThread(this)
dataType: 'json'
).always ->
$elem.removeAttr("disabled")
$local(".thread-title").click ->
handleShowSingleThread(this)
$local(".discussion-reply").click -> $local(".discussion-reply").click ->
handleReply(this) handleReply(this)
...@@ -403,20 +443,19 @@ Discussion = ...@@ -403,20 +443,19 @@ Discussion =
else else
handleEditComment(this) handleEditComment(this)
initializeContent: (content) -> initializeContent: (content) ->
$content = $(content) $content = $(content)
$local = generateLocal($content.children(".discussion-content")) $local = generateLocal($content.children(".discussion-content"))
raw_text = $local(".content-body").html() $contentBody = $local(".content-body")
raw_text = $contentBody.html()
converter = Markdown.getMathCompatibleConverter() converter = Markdown.getMathCompatibleConverter()
$local(".content-body").html(converter.makeHtml(raw_text)) $contentBody.html(converter.makeHtml(raw_text))
MathJax.Hub.Queue ["Typeset", MathJax.Hub, $contentBody.attr("id")]
id = $content.attr("_id") id = $content.attr("_id")
if $$annotated_content_info? if $$annotated_content_info?
if not ($$annotated_content_info[id] || [])['editable'] if not ($$annotated_content_info[id] || [])['editable']
$local(".discussion-edit").remove() $local(".discussion-edit").remove()
bindDiscussionEvents: (discussion) -> bindDiscussionEvents: (discussion) ->
$discussion = $(discussion) $discussion = $(discussion)
$discussionNonContent = $discussion.children(".discussion-non-content") $discussionNonContent = $discussion.children(".discussion-non-content")
......
...@@ -13,5 +13,8 @@ ...@@ -13,5 +13,8 @@
<script type="text/javascript"> <script type="text/javascript">
var $$user_info = JSON.parse('${user_info | escape_quotes}'); var $$user_info = JSON.parse('${user_info | escape_quotes}');
var $$course_id = "${course_id}"; var $$course_id = "${course_id}";
var $$annotated_content_info = JSON.parse("${annotated_content_info | escape_quotes}"); if (typeof $$annotated_content_info === undefined || $$annotated_content_info === null) {
var $$annotated_content_info = {};
}
$$annotated_content_info = $.extend($$annotated_content_info, JSON.parse("${annotated_content_info | escape_quotes}"));
</script> </script>
...@@ -36,7 +36,7 @@ ...@@ -36,7 +36,7 @@
<div class="discussion-right-wrapper clearfix"> <div class="discussion-right-wrapper clearfix">
${render_title(content, type, **kwargs)} ${render_title(content, type, **kwargs)}
<div class="discussion-content-view"> <div class="discussion-content-view">
<div class="content-body ${type}-body">${content['body'] | h}</div> <div class="content-body ${type}-body" id="content-body-${content['id']}">${content['body'] | h}</div>
<div class="content-raw-body ${type}-raw-body" style="display: none">${content['body'] | h}</div> <div class="content-raw-body ${type}-raw-body" style="display: none">${content['body'] | h}</div>
${render_tags(content, type, **kwargs)} ${render_tags(content, type, **kwargs)}
${render_bottom_bar(content, type, **kwargs)} ${render_bottom_bar(content, type, **kwargs)}
...@@ -47,15 +47,8 @@ ...@@ -47,15 +47,8 @@
</%def> </%def>
<%def name="render_title(content, type, **kwargs)"> <%def name="render_title(content, type, **kwargs)">
<%
if type == "thread":
if kwargs.get('show_comments', False):
url_for_thread = ""
else:
url_for_thread = reverse('django_comment_client.forum.views.single_thread', args=[course_id, content['commentable_id'], content['id']])
%>
% if type == "thread": % if type == "thread":
<a class="thread-title" name="${content['id']}" href="${url_for_thread}">${content['title'] | h}</a> <a class="thread-title" name="${content['id']}" href="javascript:void(0)">${content['title'] | h}</a>
% endif % endif
</%def> </%def>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment