ajax vote / unvote comments
This commit is contained in:
@@ -10,6 +10,7 @@ urlpatterns = patterns('django_comment_client.base.views',
|
||||
url(r'threads/(?P<thread_id>[\w\-]+)/delete', 'delete_thread', name='delete_thread'),
|
||||
url(r'threads/(?P<thread_id>[\w\-]+)/upvote$', 'vote_for_thread', {'value': 'up'}, name='upvote_thread'),
|
||||
url(r'threads/(?P<thread_id>[\w\-]+)/downvote$', 'vote_for_thread', {'value': 'down'}, name='downvote_thread'),
|
||||
url(r'threads/(?P<thread_id>[\w\-]+)/unvote$', 'undo_vote_for_thread', name='undo_vote_for_thread'),
|
||||
url(r'threads/(?P<thread_id>[\w\-]+)/follow$', 'follow_thread', name='follow_thread'),
|
||||
url(r'threads/(?P<thread_id>[\w\-]+)/unfollow$', 'unfollow_thread', name='unfollow_thread'),
|
||||
|
||||
@@ -19,6 +20,7 @@ urlpatterns = patterns('django_comment_client.base.views',
|
||||
url(r'comments/(?P<comment_id>[\w\-]+)/delete$', 'delete_comment', name='delete_comment'),
|
||||
url(r'comments/(?P<comment_id>[\w\-]+)/upvote$', 'vote_for_comment', {'value': 'up'}, name='upvote_comment'),
|
||||
url(r'comments/(?P<comment_id>[\w\-]+)/downvote$', 'vote_for_comment', {'value': 'down'}, name='downvote_comment'),
|
||||
url(r'comments/(?P<comment_id>[\w\-]+)/unvote$', 'undo_vote_for_comment', name='undo_vote_for_comment'),
|
||||
|
||||
url(r'(?P<commentable_id>[\w\-]+)/threads/create$', 'create_thread', name='create_thread'),
|
||||
url(r'(?P<commentable_id>[\w\-]+)/follow$', 'follow_commentable', name='follow_commentable'),
|
||||
|
||||
@@ -172,6 +172,13 @@ def vote_for_comment(request, course_id, comment_id, value):
|
||||
response = comment_client.vote_for_comment(comment_id, user_id, value)
|
||||
return JsonResponse(response)
|
||||
|
||||
@login_required
|
||||
@require_POST
|
||||
def undo_vote_for_comment(request, course_id, comment_id):
|
||||
user_id = request.user.id
|
||||
response = comment_client.undo_vote_for_comment(comment_id, user_id)
|
||||
return JsonResponse(response)
|
||||
|
||||
@login_required
|
||||
@require_POST
|
||||
def vote_for_thread(request, course_id, thread_id, value):
|
||||
@@ -179,6 +186,13 @@ def vote_for_thread(request, course_id, thread_id, value):
|
||||
response = comment_client.vote_for_thread(thread_id, user_id, value)
|
||||
return JsonResponse(response)
|
||||
|
||||
@login_required
|
||||
@require_POST
|
||||
def undo_vote_for_thread(request, course_id, thread_id):
|
||||
user_id = request.user.id
|
||||
response = comment_client.undo_vote_for_thread(thread_id, user_id)
|
||||
return JsonResponse(response)
|
||||
|
||||
@login_required
|
||||
@require_POST
|
||||
def follow_thread(request, course_id, thread_id):
|
||||
|
||||
@@ -66,13 +66,13 @@ def vote_for_comment(comment_id, user_id, value, *args, **kwargs):
|
||||
return _perform_request('put', _url_for_vote_comment(comment_id), {'user_id': user_id, 'value': value}, *args, **kwargs)
|
||||
|
||||
def undo_vote_for_comment(comment_id, user_id, *args, **kwargs):
|
||||
return _perform_request('delete', _url_for_vote_comment(comment_id), *args, **kwargs)
|
||||
return _perform_request('delete', _url_for_vote_comment(comment_id), {'user_id': user_id}, *args, **kwargs)
|
||||
|
||||
def vote_for_thread(thread_id, user_id, value, *args, **kwargs):
|
||||
return _perform_request('put', _url_for_vote_thread(thread_id), {'user_id': user_id, 'value': value}, *args, **kwargs)
|
||||
|
||||
def undo_vote_for_thread(thread_id, user_id, *args, **kwargs):
|
||||
return _perform_request('delete', _url_for_vote_thread(thread_id), *args, **kwargs)
|
||||
return _perform_request('delete', _url_for_vote_thread(thread_id), {'user_id': user_id}, *args, **kwargs)
|
||||
|
||||
def get_notifications(user_id, *args, **kwargs):
|
||||
return _perform_request('get', _url_for_notifications(user_id), *args, **kwargs)
|
||||
@@ -108,8 +108,6 @@ def unsubscribe_thread(user_id, thread_id, *args, **kwargs):
|
||||
def unsubscribe_commentable(user_id, commentable_id, *args, **kwargs):
|
||||
return unsubscribe(user_id, {'source_type': 'other', 'source_id': commentable_id})
|
||||
|
||||
|
||||
|
||||
def _perform_request(method, url, data_or_params=None, *args, **kwargs):
|
||||
if method in ['post', 'put', 'patch']:
|
||||
response = requests.request(method, url, data=data_or_params)
|
||||
|
||||
@@ -71,13 +71,34 @@ Discussion = @Discussion
|
||||
$discussionContent.attr("status", "normal")
|
||||
)
|
||||
|
||||
handleUnvote = (elem) ->
|
||||
|
||||
handleVote = (elem, value) ->
|
||||
contentType = if $content.hasClass("thread") then "thread" else "comment"
|
||||
url = Discussion.urlFor("#{value}vote_#{contentType}", id)
|
||||
$.post url, {}, (response, textStatus) ->
|
||||
if textStatus == "success"
|
||||
Discussion.handleAnchorAndReload(response)
|
||||
, 'json'
|
||||
Discussion.safeAjax
|
||||
$elem: $local(".discussion-vote")
|
||||
url: url
|
||||
type: "POST"
|
||||
dataType: "json"
|
||||
success: (response, textStatus) ->
|
||||
if textStatus == "success"
|
||||
$local(".discussion-vote").removeClass("voted")
|
||||
$local(".discussion-vote-#{value}").addClass("voted")
|
||||
$local(".discussion-votes-point").html response.votes.point
|
||||
|
||||
handleUnvote = (elem, value) ->
|
||||
contentType = if $content.hasClass("thread") then "thread" else "comment"
|
||||
url = Discussion.urlFor("undo_vote_for_#{contentType}", id)
|
||||
Discussion.safeAjax
|
||||
$elem: $local(".discussion-vote")
|
||||
url: url
|
||||
type: "POST"
|
||||
dataType: "json"
|
||||
success: (response, textStatus) ->
|
||||
if textStatus == "success"
|
||||
$local(".discussion-vote").removeClass("voted")
|
||||
$local(".discussion-votes-point").html response.votes.point
|
||||
|
||||
handleCancelEdit = (elem) ->
|
||||
$local(".discussion-content-edit").hide()
|
||||
@@ -213,10 +234,18 @@ Discussion = @Discussion
|
||||
handleCancelReply(this)
|
||||
|
||||
"click .discussion-vote-up": ->
|
||||
handleVote(this, "up")
|
||||
$elem = $(this)
|
||||
if $elem.hasClass("voted")
|
||||
handleUnvote($elem)
|
||||
else
|
||||
handleVote($elem, "up")
|
||||
|
||||
"click .discussion-vote-down": ->
|
||||
handleVote(this, "down")
|
||||
$elem = $(this)
|
||||
if $elem.hasClass("voted")
|
||||
handleUnvote($elem)
|
||||
else
|
||||
handleVote($elem, "down")
|
||||
|
||||
"click .discussion-endorse": ->
|
||||
handleEndorse(this)
|
||||
|
||||
@@ -76,7 +76,7 @@ initializeFollowThread = (index, thread) ->
|
||||
|
||||
$discussion = $(discussion)
|
||||
$discussionNonContent = $discussion.children(".discussion-non-content")
|
||||
$local = Discussion.generateLocal($discussionNonContent)#(selector) -> $discussionNonContent.find(selector)
|
||||
$local = Discussion.generateLocal($discussionNonContent)
|
||||
|
||||
id = $discussion.attr("_id")
|
||||
|
||||
|
||||
@@ -26,6 +26,7 @@ wmdEditors = {}
|
||||
delete_thread : "/courses/#{$$course_id}/discussion/threads/#{param}/delete"
|
||||
upvote_thread : "/courses/#{$$course_id}/discussion/threads/#{param}/upvote"
|
||||
downvote_thread : "/courses/#{$$course_id}/discussion/threads/#{param}/downvote"
|
||||
undo_vote_for_thread : "/courses/#{$$course_id}/discussion/threads/#{param}/unvote"
|
||||
follow_thread : "/courses/#{$$course_id}/discussion/threads/#{param}/follow"
|
||||
unfollow_thread : "/courses/#{$$course_id}/discussion/threads/#{param}/unfollow"
|
||||
update_comment : "/courses/#{$$course_id}/discussion/comments/#{param}/update"
|
||||
@@ -34,6 +35,7 @@ wmdEditors = {}
|
||||
delete_comment : "/courses/#{$$course_id}/discussion/comments/#{param}/delete"
|
||||
upvote_comment : "/courses/#{$$course_id}/discussion/comments/#{param}/upvote"
|
||||
downvote_comment : "/courses/#{$$course_id}/discussion/comments/#{param}/downvote"
|
||||
undo_vote_for_comment : "/courses/#{$$course_id}/discussion/comments/#{param}/unvote"
|
||||
upload : "/courses/#{$$course_id}/discussion/upload"
|
||||
search : "/courses/#{$$course_id}/discussion/forum/search"
|
||||
tags_autocomplete : "/courses/#{$$course_id}/discussion/threads/tags/autocomplete"
|
||||
|
||||
@@ -108,7 +108,7 @@
|
||||
<%def name="render_vote(content)">
|
||||
<div class="discussion-votes">
|
||||
${render_link("discussion-vote discussion-vote-up", "˄")}
|
||||
${content['votes']['point']}
|
||||
<div class="discussion-votes-point">${content['votes']['point']}</div>
|
||||
${render_link("discussion-vote discussion-vote-down", "˅")}
|
||||
</div>
|
||||
</%def>
|
||||
|
||||
Reference in New Issue
Block a user