Commit d189a49e by Rocky Duan

continue working on backbone & got vote migrated and working

parent 0b3e9909
from django.core.urlresolvers import reverse
from django.template.defaultfilters import escapejs
from django.conf import settings
from mitxmako.shortcuts import render_to_string
from utils import *
from mustache_helpers import mustache_helpers
from functools import partial
from utils import *
import pystache_custom as pystache
import urllib
import os
def pluralize(singular_term, count):
if int(count) >= 2:
......@@ -18,6 +22,19 @@ def show_if(text, condition):
else:
return ''
# TODO there should be a better way to handle this
def include_mustache_templates():
mustache_dir = settings.PROJECT_ROOT / 'templates' / 'discussion'
valid_file_name = lambda file_name: file_name.endswith('.mustache')
read_file = lambda file_name: (file_name, open(mustache_dir / file_name, "r").read())
strip_file_name = lambda x: (x[0].rpartition('.')[0], x[1])
wrap_in_tag = lambda x: "<script type='text/template' id='{0}'>{1}</script>".format(x[0], escapejs(x[1]))
file_contents = map(read_file, filter(valid_file_name, os.listdir(mustache_dir)))
return '\n'.join(map(wrap_in_tag, map(strip_file_name, file_contents)))
def render_content(content, additional_context={}):
content_info = {
'displayed_title': content.get('highlighted_title') or content.get('title', ''),
......
$ ->
class Content extends Backbone.Model
class @Content extends Backbone.Model
class Thread extends Content
template: -> DiscussionUtil.getTemplate('_content')
window.Content = Content
window.Thread = Thread
actions:
editable: '.admin-edit'
can_reply: '.discussion-reply'
can_endorse: '.admin-endorse'
can_delete: '.admin-delete'
can_openclose: '.admin-openclose'
isUpvoted: ->
DiscussionUtil.isUpvoted @id
isDownvoted: ->
DiscussionUtil.isDownvoted @id
can: (action) ->
DiscussionUtil.getContentInfo @id, action
class @ContentView extends Backbone.View
$: (selector) ->
@$local.find(selector)
showSingleThread: (event) ->
unvote: (event) ->
url = DiscussionUtil.urlFor("undo_vote_for_#{@model.get('type')}", @model.id)
DiscussionUtil.safeAjax
$elem: @$(".discussion-vote")
url: url
type: "POST"
dataType: "json"
success: (response, textStatus) =>
if textStatus == "success"
@$(".discussion-vote").removeClass("voted")
@$(".discussion-votes-point").html response.votes.point
vote: (event) ->
$elem = $(event.target)
if $elem.hasClass("voted")
@unvote(event)
else
value = $elem.attr("value")
url = Discussion.urlFor("#{value}vote_#{@model.get('type')}", @model.id)
DiscussionUtil.safeAjax
$elem: @$(".discussion-vote")
url: url
type: "POST"
dataType: "json"
success: (response, textStatus) =>
if textStatus == "success"
@$(".discussion-vote").removeClass("voted")
@$(".discussion-vote-#{value}").addClass("voted")
@$(".discussion-votes-point").html response.votes.point
hideSingleThread: ->
reply: ->
cancelReply: ->
endorse: ->
close: ->
edit: ->
delete: ->
events:
"click .thread-title": "showSingleThread"
"click .discussion-show-comments": "showSingleThread"
"click .discussion-hide-comments": "hideSingleThread"
"click .discussion-reply-thread": "reply"
"click .discussion-reply-comment": "reply"
"click .discussion-cancel-reply": "cancelReply"
"click .discussion-vote-up": "vote"
"click .discussion-vote-down": "vote"
"click .admin-endorse": "endorse"
"click .admin-openclose": "close"
"click .admin-edit": "edit"
"click .admin-delete": "delete"
initLocal: ->
@$local = @$el.children(".local")
initFollowThread: ->
$el.children(".discussion-content")
.find(".follow-wrapper")
.append(DiscussionUtil.subscriptionLink('thread', id))
initVote: ->
if @model.isUpvoted()
@$(".discussion-vote-up").addClass("voted")
else if @model.isDownvoted()
@$(".discussion-vote-down").addClass("voted")
initBody: ->
$contentBody = @$(".content-body")
$contentBody.html DiscussionUtil.postMathJaxProcessor DiscussionUtil.markdownWithHighlight $contentBody.html()
MathJax.Hub.Queue ["Typeset", MathJax.Hub, $contentBody.attr("id")]
initActions: ->
for action, elemSelector of @model.actions
if not @model.can action
@$(elemSelector).remove()
initTimeago: ->
@$("span.timeago").timeago()
initialize: ->
@model.view = @
@initLocal()
@initVote()
@initTimeago()
@initBody()
@initActions()
class @Thread extends @Content
class @ThreadView extends @ContentView
class @Comment extends @Content
class @Comments extends Backbone.Collection
model: Comment
$ ->
class Discussion extends Backbone.Collection
model: Thread
initialize: ->
this.bind "add", (item) =>
item.collection = this
class DiscussionModuleView extends Backbone.View
class DiscussionView extends Backbone.View
$: (selector) ->
@$local.find(selector)
initialize: ->
@$local = @$el.children(".local")
events:
"submit .search-wrapper>.discussion-search-form": "search"
"click .discussion-search-link": "search"
"click .discussion-sort-link": "sort"
"click .discussion-paginator>.discussion-page-link": "page"
$(".discussion-module").each (index, elem) ->
view = new DiscussionModuleView(el: elem)
$("section.discussion").each (index, elem) ->
discussionData = DiscussionUtil.getDiscussionData(elem)
discussion = new Discussion(discussionData)
view = new DiscussionView(el: elem, model: discussion)
class @Discussion extends Backbone.Collection
model: Thread
initialize: ->
this.bind "add", (item) =>
item.collection = this
find: (id) ->
_.first @where(id: id)
class @DiscussionModuleView extends Backbone.View
class @DiscussionView extends Backbone.View
$: (selector) ->
@$local.find(selector)
initLocal: ->
@$local = @$el.children(".local")
initialize: ->
@initLocal()
@model.view = @
@$el.children(".threads").children(".thread").each (index, elem) =>
threadView = new ThreadView el: elem, model: @model.find $(elem).attr("_id")
search: ->
sort: ->
page: ->
events:
"submit .search-wrapper>.discussion-search-form": "search"
"click .discussion-search-link": "search"
"click .discussion-sort-link": "sort"
"click .discussion-paginator>.discussion-page-link": "page"
$ ->
$(".discussion-module").each (index, elem) ->
view = new DiscussionModuleView(el: elem)
$("section.discussion").each (index, elem) ->
discussionData = DiscussionUtil.getDiscussionData(elem)
discussion = new Discussion(discussionData)
view = new DiscussionView(el: elem, model: discussion)
......@@ -5,6 +5,7 @@
<%block name="headextra">
<%static:css group='course'/>
<%include file="discussion/_js_head_dependencies.html" />
</%block>
<%block name="js_extra">
......@@ -21,7 +22,7 @@
<%static:js group='courseware'/>
<%include file="discussion/_js_dependencies.html" />
<%include file="discussion/_js_body_dependencies.html" />
<!-- TODO: http://docs.jquery.com/Plugins/Validation -->
......
<div class="discussion-content">
<div class="discussion-content-wrapper">
<div class="discussion-votes">
<a class="discussion-vote discussion-vote-up" href="javascript:void(0)">&#9650;</a>
<a class="discussion-vote discussion-vote-up" href="javascript:void(0)" value="up">&#9650;</a>
<div class="discussion-votes-point">{{content.votes.point}}</div>
<a class="discussion-vote discussion-vote-down" href="javascript:void(0)">&#9660;</a>
<a class="discussion-vote discussion-vote-down" href="javascript:void(0)" value="down">&#9660;</a>
</div>
<div class="discussion-right-wrapper">
<ul class="admin-actions">
......
......@@ -6,7 +6,7 @@
<%def name="render_content_with_comments(content)">
<div class="${content['type']}" _id="${content['id']}" _discussion_id="${content.get('commentable_id')}" _author_id="${helpers.show_if(content['user_id'], content.get('anonymous'))}">
${render_content(content)}
<div class="local">${render_content(content)}</div>
% if content.get('children') is not None:
${render_comments(content['children'])}
% endif
......
<%! from django_comment_client.helpers import include_mustache_templates %>
<%include file="/mathjax_include.html" />
${include_mustache_templates()}
<%namespace name='static' file='../static_content.html'/>
<%include file="/mathjax_include.html" />
<script type="text/javascript" src="${static.url('js/split.js')}"></script>
<script type="text/javascript" src="${static.url('js/jquery.ajaxfileupload.js')}"></script>
<script type="text/javascript" src="${static.url('js/Markdown.Converter.js')}"></script>
......@@ -17,4 +15,3 @@
<link href="${static.url('css/vendor/jquery.tagsinput.css')}" rel="stylesheet" type="text/css">
<link href="${static.url('css/vendor/jquery.autocomplete.css')}" rel="stylesheet" type="text/css">
<script type="text/template" id="content-template" src="${static.url('templates/_content.mustache')}"></script>
<%namespace name='static' file='../static_content.html'/>
<script type="text/javascript" src="${static.url('js/split.js')}"></script>
<script type="text/javascript" src="${static.url('js/jquery.ajaxfileupload.js')}"></script>
<script type="text/javascript" src="${static.url('js/Markdown.Converter.js')}"></script>
<script type="text/javascript" src="${static.url('js/Markdown.Sanitizer.js')}"></script>
<script type="text/javascript" src="${static.url('js/Markdown.Editor.js')}"></script>
<script type="text/javascript" src="${static.url('js/jquery.autocomplete.js')}"></script>
<script type="text/javascript" src="${static.url('js/jquery.timeago.js')}"></script>
<script type="text/javascript" src="${static.url('js/jquery.tagsinput.js')}"></script>
<script type="text/javascript" src="${static.url('js/mustache.js')}"></script>
<script type="text/javascript" src="${static.url('js/URI.min.js')}"></script>
<script type="text/javascript" src="${static.url('js/vendor/underscore-min.js')}"></script>
<script type="text/javascript" src="${static.url('js/vendor/backbone-min.js')}"></script>
<link href="${static.url('css/vendor/jquery.tagsinput.css')}" rel="stylesheet" type="text/css">
<link href="${static.url('css/vendor/jquery.autocomplete.css')}" rel="stylesheet" type="text/css">
......@@ -5,10 +5,11 @@
<%block name="headextra">
<%static:css group='course'/>
<%include file="_js_head_dependencies.html" />
</%block>
<%block name="js_extra">
<%include file="_js_dependencies.html" />
<%include file="_js_body_dependencies.html" />
</%block>
<%include file="../courseware/course_navigation.html" args="active_page='discussion'" />
......
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