Commit a06cc229 by Rocky Duan

watch/unwatch threads; display current vote

parent 8c3931ba
......@@ -2,16 +2,23 @@ from django.conf.urls.defaults import url, patterns
import django_comment_client.base.views
urlpatterns = patterns('django_comment_client.base.views',
url(r'(?P<commentable_id>[\w\-]+)/threads/create$', 'create_thread', name='create_thread'),
url(r'threads/(?P<thread_id>[\w\-]+)/update$', 'update_thread', name='update_thread'),
url(r'threads/(?P<thread_id>[\w\-]+)/reply$', 'create_comment', name='create_comment'),
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\-]+)/watch$', 'watch_thread', name='watch_thread'),
url(r'threads/(?P<thread_id>[\w\-]+)/unwatch$', 'unwatch_thread', name='unwatch_thread'),
url(r'comments/(?P<comment_id>[\w\-]+)/update$', 'update_comment', name='update_comment'),
url(r'comments/(?P<comment_id>[\w\-]+)/endorse$', 'endorse_comment', name='endorse_comment'),
url(r'comments/(?P<comment_id>[\w\-]+)/reply$', 'create_sub_comment', name='create_sub_comment'),
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'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'(?P<commentable_id>[\w\-]+)/threads/create$', 'create_thread', name='create_thread'),
url(r'(?P<commentable_id>[\w\-]+)/watch$', 'watch_commentable', name='watch_commentable'),
url(r'(?P<commentable_id>[\w\-]+)/unwatch$', 'unwatch_commentable', name='unwatch_commentable'),
)
......@@ -129,8 +129,47 @@ def vote_for_thread(request, thread_id, value):
response = comment_client.vote_for_thread(thread_id, user_id, value)
return JsonResponse(response)
#undo vote: disabled for now
@login_required
@require_POST
def watch_thread(request, thread_id):
user_id = request.user.id
response = comment_client.subscribe_thread(user_id, thread_id)
return JsonResponse(response)
@login_required
@require_POST
def watch_commentable(request, commentable_id):
user_id = request.user.id
response = comment_client.subscribe_commentable(user_id, commentable_id)
return JsonResponse(response)
@login_required
@require_POST
def follow(request, followed_user_id):
user_id = request.user.id
response = comment_client.follow(user_id, followed_user_id)
return JsonResponse(response)
@login_required
@require_POST
def unwatch_thread(request, thread_id):
user_id = request.user.id
response = comment_client.unsubscribe_thread(user_id, thread_id)
return JsonResponse(response)
@login_required
@require_POST
def unwatch_commentable(request, commentable_id):
user_id = request.user.id
response = comment_client.unsubscribe_commentable(user_id, commentable_id)
return JsonResponse(response)
@login_required
@require_POST
def unfollow(request, followed_user_id):
user_id = request.user.id
response = comment_client.unfollow(user_id, followed_user_id)
return JsonResponse(response)
@login_required
@require_GET
......
......@@ -22,6 +22,7 @@ from datehelper import time_ago_in_words
import operator
import itertools
import json
_FULLMODULES = None
_DISCUSSIONINFO = None
......@@ -80,11 +81,12 @@ def get_categorized_discussion_info(request, user, course, course_name, url_cour
return _DISCUSSIONINFO
def render_accordion(request, course, discussion_info, discussion_id):
context = dict([
('course', course),
('discussion_info', discussion_info),
('active', discussion_id), # TODO change this later
('csrf', csrf(request)['csrf_token'])])
context = {
'course': course,
'discussion_info': discussion_info,
'active': discussion_id,
'csrf': csrf(request)['csrf_token'],
}
return render_to_string('discussion/accordion.html', context)
......@@ -147,6 +149,7 @@ def single_thread(request, thread_id):
'init': '',
'content': render_single_thread(request, thread_id),
'accordion': '',
'user_info': json.dumps(comment_client.get_user_info(request.user.id)),
}
return render_to_response('discussion/index.html', context)
......
......@@ -9,38 +9,93 @@ $ ->
$('#open_close_accordion a').click @toggle
$('#accordion').show()
$("section.discussion").each (index, discussion) ->
Discussion.bindDiscussionEvents(discussion)
Discussion.initializeDiscussion(discussion)
generateLocal = (elem) ->
(selector) -> $(elem).find(selector)
generateDiscussionLink = (cls, txt, handler) ->
$("<a>").addClass("discussion-link").
attr("href", "javascript:void(0)").
addClass(cls).html(txt).
click(-> handler(this))
Discussion =
urlFor: (name, param) ->
{
create_thread : "/discussions/#{param}/threads/create"
update_thread : "/discussions/threads/#{param}/update"
create_comment : "/discussions/threads/#{param}/reply"
delete_thread : "/discussions/threads/#{param}/delete"
update_comment : "/discussions/comments/#{param}/update"
endorse_comment : "/discussions/comments/#{param}/endorse"
create_sub_comment : "/discussions/comments/#{param}/reply"
delete_comment : "/discussions/comments/#{param}/delete"
upvote_comment : "/discussions/comments/#{param}/upvote"
downvote_comment : "/discussions/comments/#{param}/downvote"
upvote_thread : "/discussions/threads/#{param}/upvote"
downvote_thread : "/discussions/threads/#{param}/downvote"
search : "/discussions/forum/search"
watch_commentable : "/discussions/#{param}/watch"
unwatch_commentable : "/discussions/#{param}/unwatch"
create_thread : "/discussions/#{param}/threads/create"
update_thread : "/discussions/threads/#{param}/update"
create_comment : "/discussions/threads/#{param}/reply"
delete_thread : "/discussions/threads/#{param}/delete"
upvote_thread : "/discussions/threads/#{param}/upvote"
downvote_thread : "/discussions/threads/#{param}/downvote"
watch_thread : "/discussions/threads/#{param}/watch"
unwatch_thread : "/discussions/threads/#{param}/unwatch"
update_comment : "/discussions/comments/#{param}/update"
endorse_comment : "/discussions/comments/#{param}/endorse"
create_sub_comment : "/discussions/comments/#{param}/reply"
delete_comment : "/discussions/comments/#{param}/delete"
upvote_comment : "/discussions/comments/#{param}/upvote"
downvote_comment : "/discussions/comments/#{param}/downvote"
search : "/discussions/forum/search"
}[name]
handleAnchorAndReload: (response) ->
#window.location = window.location.pathname + "#" + response['id']
window.location.reload()
initializeDiscussion: (discussion) ->
initializeVote = (index, content) ->
$content = $(content)
$local = generateLocal($content.children(".discussion-content"))
id = $content.attr("_id")
if id in user_info.upvoted_ids
$local(".discussion-vote-up").addClass("voted")
else if id in user_info.downvoted_ids
$local(".discussion-vote-down").addClass("voted")
initializeWatchThreads = (index, thread) ->
$thread = $(thread)
id = $thread.attr("_id")
$local = generateLocal($thread.children(".discussion-content"))
handleWatchThread = (elem) ->
url = Discussion.urlFor('watch_thread', id)
console.log url
$.post url, {}, (response, textStatus) ->
if textStatus == "success"
Discussion.handleAnchorAndReload(response)
, 'json'
handleUnwatchThread = (elem) ->
url = Discussion.urlFor('unwatch_thread', id)
$.post url, {}, (response, textStatus) ->
if textStatus == "success"
Discussion.handleAnchorAndReload(response)
, 'json'
if id in user_info.subscribed_thread_ids
unwatchThread = generateDiscussionLink("discussion-unwatch-thread", "Unwatch", handleUnwatchThread)
$local(".info").append(unwatchThread)
else
watchThread = generateDiscussionLink("discussion-watch-thread", "Watch", handleWatchThread)
$local(".info").append(watchThread)
if user_info?
$(discussion).find(".comment").each(initializeVote)
$(discussion).find(".thread").each(initializeVote).each(initializeWatchThreads)
bindContentEvents: (content) ->
$content = $(content)
$discussionContent = $content.children(".discussion-content")
$local = (selector) -> $discussionContent.find(selector)
$local = generateLocal($discussionContent)
discussionContentHoverIn = ->
status = $discussionContent.attr("status") || "normal"
......@@ -58,11 +113,7 @@ Discussion =
$discussionContent.hover(discussionContentHoverIn, discussionContentHoverOut)
generateDiscussionLink = (cls, txt, handler) ->
$("<a>").addClass("discussion-link").
attr("href", "javascript:void(0)").
addClass(cls).html(txt).
click(-> handler(this))
handleReply = (elem) ->
editView = $local(".discussion-content-edit")
......
......@@ -66,6 +66,9 @@ $discussion_input_width: 60%;
&.discussion-vote-down {
margin-top: 3px;
}
&.voted {
color: #1d9dd9;
}
}
}
.discussion-right-wrapper {
......
......@@ -8,11 +8,10 @@
</%block>
<%block name="js_extra">
<!-- TODO: http://docs.jquery.com/Plugins/Validation -->
<script type="text/javascript">
document.write('\x3Cscript type="text/javascript" src="' +
document.location.protocol + '//www.youtube.com/player_api">\x3C/script>');
var user_info = JSON.parse('${user_info}');
</script>
</%block>
##<%include file="../course_navigation.html" args="active_page='discussion'" />
......
......@@ -2,8 +2,6 @@
<%! from datehelper import time_ago_in_words %>
<%! from dateutil.parser import parse %>
<%def name="render_thread(thread, edit_thread=False, show_comments=False)">
<%
if show_comments:
......@@ -24,7 +22,6 @@
% if edit_thread:
${render_reply()}
${render_edit()}
${render_watch_thread()}
% endif
</div>
</div>
......
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