Commit 9cab1d9d by Tom Giannattasio

fixed merge conflict

parents b72ec725 d0f2f310
...@@ -55,7 +55,7 @@ def ajax_content_response(request, course_id, content, template_name): ...@@ -55,7 +55,7 @@ def ajax_content_response(request, course_id, content, template_name):
annotated_content_info = utils.get_annotated_content_info(course_id, content, request.user, user_info) annotated_content_info = utils.get_annotated_content_info(course_id, content, request.user, user_info)
return JsonResponse({ return JsonResponse({
'html': html, 'html': html,
'content': content, 'content': utils.safe_content(content),
'annotated_content_info': annotated_content_info, 'annotated_content_info': annotated_content_info,
}) })
...@@ -78,7 +78,7 @@ def create_thread(request, course_id, commentable_id): ...@@ -78,7 +78,7 @@ def create_thread(request, course_id, commentable_id):
if request.is_ajax(): if request.is_ajax():
return ajax_content_response(request, course_id, thread.to_dict(), 'discussion/ajax_create_thread.html') return ajax_content_response(request, course_id, thread.to_dict(), 'discussion/ajax_create_thread.html')
else: else:
return JsonResponse(thread.to_dict()) return JsonResponse(utils.safe_content(thread.to_dict()))
@require_POST @require_POST
@login_required @login_required
...@@ -90,7 +90,7 @@ def update_thread(request, course_id, thread_id): ...@@ -90,7 +90,7 @@ def update_thread(request, course_id, thread_id):
if request.is_ajax(): if request.is_ajax():
return ajax_content_response(request, course_id, thread.to_dict(), 'discussion/ajax_update_thread.html') return ajax_content_response(request, course_id, thread.to_dict(), 'discussion/ajax_update_thread.html')
else: else:
return JsonResponse(thread.to_dict()) return JsonResponse(utils.safe_content(thread.to_dict()))
def _create_comment(request, course_id, thread_id=None, parent_id=None): def _create_comment(request, course_id, thread_id=None, parent_id=None):
post = request.POST post = request.POST
...@@ -109,7 +109,7 @@ def _create_comment(request, course_id, thread_id=None, parent_id=None): ...@@ -109,7 +109,7 @@ def _create_comment(request, course_id, thread_id=None, parent_id=None):
if request.is_ajax(): if request.is_ajax():
return ajax_content_response(request, course_id, comment.to_dict(), 'discussion/ajax_create_comment.html') return ajax_content_response(request, course_id, comment.to_dict(), 'discussion/ajax_create_comment.html')
else: else:
return JsonResponse(comment.to_dict()) return JsonResponse(utils.safe_content(comment.to_dict()))
@require_POST @require_POST
@login_required @login_required
...@@ -126,7 +126,7 @@ def create_comment(request, course_id, thread_id): ...@@ -126,7 +126,7 @@ def create_comment(request, course_id, thread_id):
def delete_thread(request, course_id, thread_id): def delete_thread(request, course_id, thread_id):
thread = cc.Thread.find(thread_id) thread = cc.Thread.find(thread_id)
thread.delete() thread.delete()
return JsonResponse(thread.to_dict()) return JsonResponse(utils.safe_content(thread.to_dict()))
@require_POST @require_POST
@login_required @login_required
...@@ -138,7 +138,7 @@ def update_comment(request, course_id, comment_id): ...@@ -138,7 +138,7 @@ def update_comment(request, course_id, comment_id):
if request.is_ajax(): if request.is_ajax():
return ajax_content_response(request, course_id, comment.to_dict(), 'discussion/ajax_update_comment.html') return ajax_content_response(request, course_id, comment.to_dict(), 'discussion/ajax_update_comment.html')
else: else:
return JsonResponse(comment.to_dict()), return JsonResponse(utils.safe_content(comment.to_dict()))
@require_POST @require_POST
@login_required @login_required
...@@ -147,7 +147,7 @@ def endorse_comment(request, course_id, comment_id): ...@@ -147,7 +147,7 @@ def endorse_comment(request, course_id, comment_id):
comment = cc.Comment.find(comment_id) comment = cc.Comment.find(comment_id)
comment.endorsed = request.POST.get('endorsed', 'false').lower() == 'true' comment.endorsed = request.POST.get('endorsed', 'false').lower() == 'true'
comment.save() comment.save()
return JsonResponse(comment.to_dict()) return JsonResponse(utils.safe_content(comment.to_dict()))
@require_POST @require_POST
@login_required @login_required
...@@ -156,7 +156,11 @@ def openclose_thread(request, course_id, thread_id): ...@@ -156,7 +156,11 @@ def openclose_thread(request, course_id, thread_id):
thread = cc.Thread.find(thread_id) thread = cc.Thread.find(thread_id)
thread.closed = request.POST.get('closed', 'false').lower() == 'true' thread.closed = request.POST.get('closed', 'false').lower() == 'true'
thread.save() thread.save()
return JsonResponse(thread.to_dict()) thread = thread.to_dict()
return JsonResponse({
'content': utils.safe_content(thread),
'ability': utils.get_ability(course_id, thread, request.user),
})
@require_POST @require_POST
@login_required @login_required
...@@ -173,7 +177,7 @@ def create_sub_comment(request, course_id, comment_id): ...@@ -173,7 +177,7 @@ def create_sub_comment(request, course_id, comment_id):
def delete_comment(request, course_id, comment_id): def delete_comment(request, course_id, comment_id):
comment = cc.Comment.find(comment_id) comment = cc.Comment.find(comment_id)
comment.delete() comment.delete()
return JsonResponse(comment.to_dict()) return JsonResponse(utils.safe_content(comment.to_dict()))
@require_POST @require_POST
@login_required @login_required
...@@ -182,7 +186,7 @@ def vote_for_comment(request, course_id, comment_id, value): ...@@ -182,7 +186,7 @@ def vote_for_comment(request, course_id, comment_id, value):
user = cc.User.from_django_user(request.user) user = cc.User.from_django_user(request.user)
comment = cc.Comment.find(comment_id) comment = cc.Comment.find(comment_id)
user.vote(comment, value) user.vote(comment, value)
return JsonResponse(comment.to_dict()) return JsonResponse(utils.safe_content(comment.to_dict()))
@require_POST @require_POST
@login_required @login_required
...@@ -191,7 +195,7 @@ def undo_vote_for_comment(request, course_id, comment_id): ...@@ -191,7 +195,7 @@ def undo_vote_for_comment(request, course_id, comment_id):
user = cc.User.from_django_user(request.user) user = cc.User.from_django_user(request.user)
comment = cc.Comment.find(comment_id) comment = cc.Comment.find(comment_id)
user.unvote(comment) user.unvote(comment)
return JsonResponse(comment.to_dict()) return JsonResponse(utils.safe_content(comment.to_dict()))
@require_POST @require_POST
@login_required @login_required
...@@ -200,7 +204,7 @@ def vote_for_thread(request, course_id, thread_id, value): ...@@ -200,7 +204,7 @@ def vote_for_thread(request, course_id, thread_id, value):
user = cc.User.from_django_user(request.user) user = cc.User.from_django_user(request.user)
thread = cc.Thread.find(thread_id) thread = cc.Thread.find(thread_id)
user.vote(thread, value) user.vote(thread, value)
return JsonResponse(thread.to_dict()) return JsonResponse(utils.safe_content(thread.to_dict()))
@require_POST @require_POST
@login_required @login_required
...@@ -209,7 +213,7 @@ def undo_vote_for_thread(request, course_id, thread_id): ...@@ -209,7 +213,7 @@ def undo_vote_for_thread(request, course_id, thread_id):
user = cc.User.from_django_user(request.user) user = cc.User.from_django_user(request.user)
thread = cc.Thread.find(thread_id) thread = cc.Thread.find(thread_id)
user.unvote(thread) user.unvote(thread)
return JsonResponse(thread.to_dict()) return JsonResponse(utils.safe_content(thread.to_dict()))
@require_POST @require_POST
......
...@@ -83,7 +83,7 @@ def render_discussion(request, course_id, threads, *args, **kwargs): ...@@ -83,7 +83,7 @@ def render_discussion(request, course_id, threads, *args, **kwargs):
'base_url': base_url, 'base_url': base_url,
'query_params': strip_blank(strip_none(extract(query_params, ['page', 'sort_key', 'sort_order', 'tags', 'text']))), 'query_params': strip_blank(strip_none(extract(query_params, ['page', 'sort_key', 'sort_order', 'tags', 'text']))),
'annotated_content_info': json.dumps(annotated_content_info), 'annotated_content_info': json.dumps(annotated_content_info),
'discussion_data': json.dumps({ (discussion_id or user_id): threads }) 'discussion_data': json.dumps({ (discussion_id or user_id): map(utils.safe_content, threads) })
} }
context = dict(context.items() + query_params.items()) context = dict(context.items() + query_params.items())
return render_to_string(template, context) return render_to_string(template, context)
...@@ -128,7 +128,7 @@ def inline_discussion(request, course_id, discussion_id): ...@@ -128,7 +128,7 @@ def inline_discussion(request, course_id, discussion_id):
return utils.JsonResponse({ return utils.JsonResponse({
'html': html, 'html': html,
'discussionData': threads, 'discussion_data': map(utils.safe_content, threads),
}) })
def render_search_bar(request, course_id, discussion_id=None, text=''): def render_search_bar(request, course_id, discussion_id=None, text=''):
...@@ -149,7 +149,7 @@ def forum_form_discussion(request, course_id): ...@@ -149,7 +149,7 @@ def forum_form_discussion(request, course_id):
if request.is_ajax(): if request.is_ajax():
return utils.JsonResponse({ return utils.JsonResponse({
'html': content, 'html': content,
'discussionData': threads, 'discussion_data': map(utils.safe_content, threads),
}) })
else: else:
recent_active_threads = cc.search_recent_active_threads( recent_active_threads = cc.search_recent_active_threads(
...@@ -186,7 +186,7 @@ def render_single_thread(request, discussion_id, course_id, thread_id): ...@@ -186,7 +186,7 @@ def render_single_thread(request, discussion_id, course_id, thread_id):
'annotated_content_info': json.dumps(annotated_content_info), 'annotated_content_info': json.dumps(annotated_content_info),
'course_id': course_id, 'course_id': course_id,
'request': request, 'request': request,
'discussion_data': json.dumps({ discussion_id: [thread] }), 'discussion_data': json.dumps({ discussion_id: [utils.safe_content(thread)] }),
} }
return render_to_string('discussion/_single_thread.html', context) return render_to_string('discussion/_single_thread.html', context)
...@@ -202,7 +202,7 @@ def single_thread(request, course_id, discussion_id, thread_id): ...@@ -202,7 +202,7 @@ def single_thread(request, course_id, discussion_id, thread_id):
return utils.JsonResponse({ return utils.JsonResponse({
'html': html, 'html': html,
'content': thread.to_dict(), 'content': utils.safe_content(thread.to_dict()),
'annotated_content_info': annotated_content_info, 'annotated_content_info': annotated_content_info,
}) })
...@@ -252,7 +252,7 @@ def user_profile(request, course_id, user_id): ...@@ -252,7 +252,7 @@ def user_profile(request, course_id, user_id):
if request.is_ajax(): if request.is_ajax():
return utils.JsonResponse({ return utils.JsonResponse({
'html': content, 'html': content,
'discussionData': threads, 'discussion_data': map(utils.safe_content, threads),
}) })
else: else:
context = { context = {
......
...@@ -164,6 +164,16 @@ class QueryCountDebugMiddleware(object): ...@@ -164,6 +164,16 @@ class QueryCountDebugMiddleware(object):
logging.info('%s queries run, total %s seconds' % (len(connection.queries), total_time)) logging.info('%s queries run, total %s seconds' % (len(connection.queries), total_time))
return response return response
def get_ability(course_id, content, user):
return {
'editable': check_permissions_by_view(user, course_id, content, "update_thread" if content['type'] == 'thread' else "update_comment"),
'can_reply': check_permissions_by_view(user, course_id, content, "create_comment" if content['type'] == 'thread' else "create_sub_comment"),
'can_endorse': check_permissions_by_view(user, course_id, content, "endorse_comment") if content['type'] == 'comment' else False,
'can_delete': check_permissions_by_view(user, course_id, content, "delete_thread" if content['type'] == 'thread' else "delete_comment"),
'can_openclose': check_permissions_by_view(user, course_id, content, "openclose_thread") if content['type'] == 'thread' else False,
'can_vote': check_permissions_by_view(user, course_id, content, "vote_for_thread" if content['type'] == 'thread' else "vote_for_comment"),
}
def get_annotated_content_info(course_id, content, user, user_info): def get_annotated_content_info(course_id, content, user, user_info):
voted = '' voted = ''
if content['id'] in user_info['upvoted_ids']: if content['id'] in user_info['upvoted_ids']:
...@@ -173,14 +183,7 @@ def get_annotated_content_info(course_id, content, user, user_info): ...@@ -173,14 +183,7 @@ def get_annotated_content_info(course_id, content, user, user_info):
return { return {
'voted': voted, 'voted': voted,
'subscribed': content['id'] in user_info['subscribed_thread_ids'], 'subscribed': content['id'] in user_info['subscribed_thread_ids'],
'ability': { 'ability': get_ability(course_id, content, user),
'editable': check_permissions_by_view(user, course_id, content, "update_thread" if content['type'] == 'thread' else "update_comment"),
'can_reply': check_permissions_by_view(user, course_id, content, "create_comment" if content['type'] == 'thread' else "create_sub_comment"),
'can_endorse': check_permissions_by_view(user, course_id, content, "endorse_comment") if content['type'] == 'comment' else False,
'can_delete': check_permissions_by_view(user, course_id, content, "delete_thread" if content['type'] == 'thread' else "delete_comment"),
'can_openclose': check_permissions_by_view(user, course_id, content, "openclose_thread") if content['type'] == 'thread' else False,
'can_vote': check_permissions_by_view(user, course_id, content, "vote_for_thread" if content['type'] == 'thread' else "vote_for_comment"),
},
} }
def get_annotated_content_infos(course_id, thread, user, user_info): def get_annotated_content_infos(course_id, thread, user, user_info):
...@@ -216,3 +219,17 @@ def extend_content(content): ...@@ -216,3 +219,17 @@ def extend_content(content):
'permalink': permalink(content), 'permalink': permalink(content),
} }
return merge_dict(content, content_info) return merge_dict(content, content_info)
def safe_content(content):
fields = [
'id', 'title', 'body', 'course_id', 'anonymous', 'endorsed',
'parent_id', 'thread_id', 'votes', 'closed',
'created_at', 'updated_at', 'depth', 'type',
'commentable_id', 'comments_count', 'at_position_list',
'children', 'highlighted_title', 'highlighted_body',
]
if content.get('anonymous') is False:
fields += ['username', 'user_id']
return strip_none(extract(content, fields))
...@@ -16,6 +16,8 @@ WIKI_ENABLED = False ...@@ -16,6 +16,8 @@ WIKI_ENABLED = False
MITX_FEATURES['ENABLE_TEXTBOOK'] = False MITX_FEATURES['ENABLE_TEXTBOOK'] = False
MITX_FEATURES['ENABLE_DISCUSSION'] = False MITX_FEATURES['ENABLE_DISCUSSION'] = False
MITX_FEATURES['ACCESS_REQUIRE_STAFF_FOR_COURSE'] = True # require that user be in the staff_* group to be able to enroll MITX_FEATURES['ACCESS_REQUIRE_STAFF_FOR_COURSE'] = True # require that user be in the staff_* group to be able to enroll
MITX_FEATURES['SUBDOMAIN_COURSE_LISTINGS'] = False
MITX_FEATURES['SUBDOMAIN_BRANDING'] = False
MITX_FEATURES['DISABLE_START_DATES'] = True MITX_FEATURES['DISABLE_START_DATES'] = True
# MITX_FEATURES['USE_DJANGO_PIPELINE']=False # don't recompile scss # MITX_FEATURES['USE_DJANGO_PIPELINE']=False # don't recompile scss
......
...@@ -90,7 +90,9 @@ if Backbone? ...@@ -90,7 +90,9 @@ if Backbone?
ability: (ability) -> ability: (ability) ->
for action, elemSelector of @model.actions for action, elemSelector of @model.actions
if not ability[action] if not ability[action]
@$(elemSelector).parent().remove() @$(elemSelector).parent().hide()
else
@$(elemSelector).parent().show()
$discussionContent: -> $discussionContent: ->
@_discussionContent ||= @$el.children(".discussion-content") @_discussionContent ||= @$el.children(".discussion-content")
...@@ -191,6 +193,8 @@ if Backbone? ...@@ -191,6 +193,8 @@ if Backbone?
comment = @model.addComment response.content comment = @model.addComment response.content
commentView = new CommentView el: $comment[0], model: comment commentView = new CommentView el: $comment[0], model: comment
comment.updateInfo response.annotated_content_info comment.updateInfo response.annotated_content_info
if autowatch
@model.get('thread').set('subscribed', true)
@cancelReply() @cancelReply()
cancelReply: -> cancelReply: ->
...@@ -269,6 +273,7 @@ if Backbone? ...@@ -269,6 +273,7 @@ if Backbone?
data: data data: data
success: (response, textStatus) => success: (response, textStatus) =>
@model.set('closed', not closed) @model.set('closed', not closed)
@model.set('ability', response.ability)
edit: (event) -> edit: (event) ->
@$(".discussion-content-wrapper").hide() @$(".discussion-content-wrapper").hide()
...@@ -279,11 +284,11 @@ if Backbone? ...@@ -279,11 +284,11 @@ if Backbone?
view = {} view = {}
view.id = @model.id view.id = @model.id
if @model.get('type') == 'thread' if @model.get('type') == 'thread'
view.title = @$(".thread-raw-title").html() view.title = @model.get('title')
view.body = @$(".thread-raw-body").html() view.body = @model.get('body')
view.tags = @$(".thread-raw-tags").html() view.tags = @model.get('tags')
else else
view.body = @$(".comment-raw-body").html() view.body = @model.get('body')
@$discussionContent().append Mustache.render DiscussionUtil.getTemplate("_edit_#{@model.get('type')}"), view @$discussionContent().append Mustache.render DiscussionUtil.getTemplate("_edit_#{@model.get('type')}"), view
DiscussionUtil.makeWmdEditor @$el, $.proxy(@$, @), "#{@model.get('type')}-body-edit" DiscussionUtil.makeWmdEditor @$el, $.proxy(@$, @), "#{@model.get('type')}-body-edit"
@$(".thread-tags-edit").tagsInput DiscussionUtil.tagsInputOptions() @$(".thread-tags-edit").tagsInput DiscussionUtil.tagsInputOptions()
...@@ -311,8 +316,12 @@ if Backbone? ...@@ -311,8 +316,12 @@ if Backbone?
success: (response, textStatus) => success: (response, textStatus) =>
DiscussionUtil.clearFormErrors @$(".discussion-update-errors") DiscussionUtil.clearFormErrors @$(".discussion-update-errors")
@$discussionContent().replaceWith(response.html) @$discussionContent().replaceWith(response.html)
@model.set response.content if @model.get('type') == 'thread'
@model.updateInfo response.annotated_content_info @model = new Thread response.content
else
@model = new Comment $.extend {}, response.content, { thread: @model.get('thread') }
@reconstruct()
@model.updateInfo response.annotated_content_info, { forceUpdate: true }
cancelEdit: (event) -> cancelEdit: (event) ->
@$(".discussion-content-edit").hide() @$(".discussion-content-edit").hide()
...@@ -330,8 +339,10 @@ if Backbone? ...@@ -330,8 +339,10 @@ if Backbone?
DiscussionUtil.safeAjax DiscussionUtil.safeAjax
$elem: $elem $elem: $elem
url: url url: url
type: "POST"
success: (response, textStatus) => success: (response, textStatus) =>
@$el.remove() @$el.remove()
if @model.get('type') == 'comment'
@model.get('thread').removeComment(@model) @model.get('thread').removeComment(@model)
events: events:
...@@ -382,6 +393,14 @@ if Backbone? ...@@ -382,6 +393,14 @@ if Backbone?
@initBody() @initBody()
@initCommentViews() @initCommentViews()
reconstruct: ->
@initBindings()
@initLocal()
@initTimeago()
@initTitle()
@initBody()
@delegateEvents()
class @Thread extends @Content class @Thread extends @Content
urlMappers: urlMappers:
'retrieve' : -> DiscussionUtil.urlFor('retrieve_single_thread', @discussion.id, @id) 'retrieve' : -> DiscussionUtil.urlFor('retrieve_single_thread', @discussion.id, @id)
......
...@@ -42,13 +42,17 @@ if Backbone? ...@@ -42,13 +42,17 @@ if Backbone?
DiscussionUtil.safeAjax DiscussionUtil.safeAjax
$elem: $elem $elem: $elem
$loading: $elem $loading: $elem
loadingCallback: ->
$(this).parent().append("<span class='discussion-loading'></span>")
loadedCallback: ->
$(this).parent().children(".discussion-loading").remove()
url: url url: url
type: "GET" type: "GET"
success: (response, textStatus) => success: (response, textStatus) =>
$parent = @$el.parent() $parent = @$el.parent()
@$el.replaceWith(response.html) @$el.replaceWith(response.html)
$discussion = $parent.find("section.discussion") $discussion = $parent.find("section.discussion")
@model.reset(response.discussionData, { silent: false }) @model.reset(response.discussion_data, { silent: false })
view = new DiscussionView el: $discussion[0], model: @model view = new DiscussionView el: $discussion[0], model: @model
DiscussionUtil.bulkUpdateContentInfo(window.$$annotated_content_info) DiscussionUtil.bulkUpdateContentInfo(window.$$annotated_content_info)
$("html, body").animate({ scrollTop: 0 }, 0) $("html, body").animate({ scrollTop: 0 }, 0)
...@@ -109,6 +113,7 @@ if Backbone? ...@@ -109,6 +113,7 @@ if Backbone?
@$(".discussion-cancel-post").click $.proxy(@cancelNewPost, @) @$(".discussion-cancel-post").click $.proxy(@cancelNewPost, @)
@$el.children(".blank").hide()
@$(".new-post-form").show() @$(".new-post-form").show()
submitNewPost: (event) -> submitNewPost: (event) ->
...@@ -136,6 +141,8 @@ if Backbone? ...@@ -136,6 +141,8 @@ if Backbone?
$thread = $(response.html) $thread = $(response.html)
@$el.children(".threads").prepend($thread) @$el.children(".threads").prepend($thread)
@$el.children(".blank").remove()
@$(".new-post-similar-posts").empty() @$(".new-post-similar-posts").empty()
@$(".new-post-similar-posts-wrapper").hide() @$(".new-post-similar-posts-wrapper").hide()
@$(".new-post-title").val("").attr("prev-text", "") @$(".new-post-title").val("").attr("prev-text", "")
...@@ -154,6 +161,7 @@ if Backbone? ...@@ -154,6 +161,7 @@ if Backbone?
@$(".new-post-form").addClass("collapsed") @$(".new-post-form").addClass("collapsed")
else if @$el.hasClass("forum-discussion") else if @$el.hasClass("forum-discussion")
@$(".new-post-form").hide() @$(".new-post-form").hide()
@$el.children(".blank").show()
search: (event) -> search: (event) ->
event.preventDefault() event.preventDefault()
......
...@@ -72,12 +72,16 @@ class @DiscussionUtil ...@@ -72,12 +72,16 @@ class @DiscussionUtil
params["beforeSend"] = -> params["beforeSend"] = ->
$elem.attr("disabled", "disabled") $elem.attr("disabled", "disabled")
if params["$loading"] if params["$loading"]
console.log "loading" if params["loadingCallback"]?
params["loadingCallback"].apply(params["$loading"])
else
params["$loading"].loading() params["$loading"].loading()
$.ajax(params).always -> $.ajax(params).always ->
$elem.removeAttr("disabled") $elem.removeAttr("disabled")
if params["$loading"] if params["$loading"]
console.log "loaded" if params["loadedCallback"]?
params["loadedCallback"].apply(params["$loading"])
else
params["$loading"].loaded() params["$loading"].loaded()
@get: ($elem, url, data, success) -> @get: ($elem, url, data, success) ->
......
...@@ -152,6 +152,7 @@ $tag-text-color: #5b614f; ...@@ -152,6 +152,7 @@ $tag-text-color: #5b614f;
.user-profile { .user-profile {
@extend .sidebar; @extend .sidebar;
margin-top: 24px;
} }
.sidebar-username { .sidebar-username {
......
...@@ -885,8 +885,7 @@ section.wiki { ...@@ -885,8 +885,7 @@ section.wiki {
.alert { .alert {
position: relative; position: relative;
top: -15px; margin: 24px 40px;
margin-bottom: 24px;
padding: 8px 12px; padding: 8px 12px;
border: 1px solid #EBE8BF; border: 1px solid #EBE8BF;
border-radius: 3px; border-radius: 3px;
...@@ -903,6 +902,10 @@ section.wiki { ...@@ -903,6 +902,10 @@ section.wiki {
} }
} }
.main-article .alert {
margin: 0 0 24px;
}
.missing { .missing {
max-width: 400px; max-width: 400px;
margin: lh(2) auto; margin: lh(2) auto;
......
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
</%def> </%def>
<%def name="render_content_with_comments(content, *args, **kwargs)"> <%def name="render_content_with_comments(content, *args, **kwargs)">
<div class="${content['type']}${helpers.show_if(' endorsed', content.get('endorsed'))}" _id="${content['id']}" _discussion_id="${content.get('commentable_id', '')}" _author_id="${helpers.show_if(content['user_id'], not content.get('anonymous'))}"> <div class="${content['type'] | h}${helpers.show_if(' endorsed', content.get('endorsed')) | h}" _id="${content['id'] | h}" _discussion_id="${content.get('commentable_id', '') | h}" _author_id="${helpers.show_if(content['user_id'], not content.get('anonymous')) | h}">
${render_content(content, *args, **kwargs)} ${render_content(content, *args, **kwargs)}
${render_comments(content.get('children', []), *args, **kwargs)} ${render_comments(content.get('children', []), *args, **kwargs)}
</div> </div>
......
<div class="discussion-module"> <div class="discussion-module">
<a class="discussion-show control-button" href="javascript:void(0)" discussion_id="${discussion_id}">Show Discussion</a> <a class="discussion-show control-button" href="javascript:void(0)" discussion_id="${discussion_id | h}">Show Discussion</a>
</div> </div>
<%namespace name="renderer" file="_content_renderer.html"/> <%namespace name="renderer" file="_content_renderer.html"/>
<section class="discussion forum-discussion" _id="${discussion_id}"> <section class="discussion forum-discussion" _id="${discussion_id | h}">
<div class="discussion-non-content local"> <div class="discussion-non-content local">
<div class="search-wrapper"> <div class="search-wrapper">
......
<%namespace name="renderer" file="_content_renderer.html"/> <%namespace name="renderer" file="_content_renderer.html"/>
<section class="discussion inline-discussion" _id="${discussion_id}"> <section class="discussion inline-discussion" _id="${discussion_id | h}">
<div class="discussion-non-content local"></div> <div class="discussion-non-content local"></div>
......
...@@ -9,7 +9,7 @@ ...@@ -9,7 +9,7 @@
%> %>
<%def name="link_to_page(_page, text)"> <%def name="link_to_page(_page, text)">
<a class="discussion-page-link" href="javascript:void(0)" page-url="${url_for_page(_page)}">${text}</a> <a class="discussion-page-link" href="javascript:void(0)" page-url="${url_for_page(_page) | h}">${text}</a>
</%def> </%def>
<%def name="div_page(_page)"> <%def name="div_page(_page)">
...@@ -36,7 +36,7 @@ ...@@ -36,7 +36,7 @@
% endfor % endfor
</%def> </%def>
<div class="discussion-${discussion_type}-paginator discussion-paginator local"> <div class="discussion-${discussion_type | h}-paginator discussion-paginator local">
<div class="prev-page"> <div class="prev-page">
% if page > 1: % if page > 1:
${link_to_page(page - 1, "&lt; Previous page")} ${link_to_page(page - 1, "&lt; Previous page")}
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
</header> </header>
<ol class="discussion-sidebar-following-list"> <ol class="discussion-sidebar-following-list">
% for thread in recent_active_threads: % for thread in recent_active_threads:
<li><a href="${helpers.permalink(thread)}"><span class="sidebar-following-name">${thread['title']}</span> <span class="sidebar-vote-count">${thread['votes']['point']}</span></a></li> <li><a href="${helpers.permalink(thread) | h}"><span class="sidebar-following-name">${thread['title'] | h}</span> <span class="sidebar-vote-count">${thread['votes']['point'] | h}</span></a></li>
% endfor % endfor
<ol> <ol>
</article> </article>
......
...@@ -10,9 +10,9 @@ def base_url_for_search(): ...@@ -10,9 +10,9 @@ def base_url_for_search():
<form action="${base_url_for_search()}" method="get" class="discussion-search-form"> <form action="${base_url_for_search()}" method="get" class="discussion-search-form">
% if query_params.get('tags', None): % if query_params.get('tags', None):
<input class="search-input" type="text" value="[${tags}]${text}" id="keywords" autocomplete="off"/> <input class="search-input" type="text" value="[${tags | h}]${text | h}" id="keywords" autocomplete="off"/>
% else: % else:
<input class="search-input" type="text" value="${text}" id="keywords" autocomplete="off"/> <input class="search-input" type="text" value="${text | h}" id="keywords" autocomplete="off"/>
% endif % endif
<div class="discussion-link discussion-search-link" href="javascript:void(0)">Search posts</div> <div class="discussion-link discussion-search-link" href="javascript:void(0)">Search posts</div>
</form> </form>
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
<a class="hide-similar-posts" href="javascript:void(0)">Hide</a> <a class="hide-similar-posts" href="javascript:void(0)">Hide</a>
<div class="new-post-similar-posts"> <div class="new-post-similar-posts">
% for thread in threads: % for thread in threads:
<a class="similar-post" href="${thread['permalink']}">${thread['title']}</a> <a class="similar-post" href="${thread['permalink'] | h}">${thread['title'] | h}</a>
% endfor % endfor
</div> </div>
% endif % endif
<%namespace name="renderer" file="_content_renderer.html"/> <%namespace name="renderer" file="_content_renderer.html"/>
<section class="discussion" _id="${discussion_id}"> <section class="discussion" _id="${discussion_id | h}">
<a class="discussion-title" href="javascript:void(0)">Discussion</a> <a class="discussion-title" href="javascript:void(0)">Discussion</a>
<div class="threads"> <div class="threads">
${renderer.render_content_with_comments(thread)} ${renderer.render_content_with_comments(thread)}
......
...@@ -26,7 +26,7 @@ ...@@ -26,7 +26,7 @@
else: else:
return base_url + '?' + urlencode(merge(query_params, {'page': 1, 'sort_key': key, 'sort_order': order})) return base_url + '?' + urlencode(merge(query_params, {'page': 1, 'sort_key': key, 'sort_order': order}))
%> %>
<a class="discussion-sort-link ${cls}" href="javascript:void(0)" sort-url="${url_for_sort(key, order)}">${title}</a> <a class="discussion-sort-link ${cls | h}" href="javascript:void(0)" sort-url="${url_for_sort(key, order) | h}">${title}</a>
</%def> </%def>
<div class="discussion-sort local"> <div class="discussion-sort local">
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
</header> </header>
<ol class="discussion-sidebar-tags-list"> <ol class="discussion-sidebar-tags-list">
% for tag, count in trending_tags: % for tag, count in trending_tags:
<li><a href="${helpers.url_for_tags(course.id, tag)}" class="thread-tag">${tag}</a><span class="sidebar-tag-count">&times;${count}</span></li> <li><a href="${helpers.url_for_tags(course.id, tag) | h}" class="thread-tag">${tag | h}</a><span class="sidebar-tag-count">&times;${count | h}</span></li>
% endfor % endfor
<ol> <ol>
</article> </article>
......
<%namespace name="renderer" file="_content_renderer.html"/> <%namespace name="renderer" file="_content_renderer.html"/>
<section class="discussion user-active-discussion" _id="${user_id}"> <section class="discussion user-active-discussion" _id="${user_id | h}">
<div class="discussion-non-content local"></div> <div class="discussion-non-content local"></div>
......
...@@ -7,12 +7,12 @@ ...@@ -7,12 +7,12 @@
<% <%
role_names = sorted(map(attrgetter('name'), django_user.roles.all())) role_names = sorted(map(attrgetter('name'), django_user.roles.all()))
%> %>
<div class="sidebar-username">${django_user.username}</div> <div class="sidebar-username">${django_user.username | h}</div>
<div class="sidebar-user-roles"> <div class="sidebar-user-roles">
${", ".join(role_names)} ${", ".join(role_names)}
</div> </div>
<div class="sidebar-threads-count"><span>${profiled_user['threads_count']}</span> ${pluralize('discussion', profiled_user['threads_count'])} started</div> <div class="sidebar-threads-count"><span>${profiled_user['threads_count'] | h}</span> ${pluralize('discussion', profiled_user['threads_count']) | h} started</div>
<div class="sidebar-comments-count"><span>${profiled_user['comments_count']}</span> ${pluralize('comment', profiled_user['comments_count'])}</div> <div class="sidebar-comments-count"><span>${profiled_user['comments_count'] | h}</span> ${pluralize('comment', profiled_user['comments_count']) | h}</div>
% if check_permissions_by_view(user, course.id, content=None, name='update_moderator_status'): % if check_permissions_by_view(user, course.id, content=None, name='update_moderator_status'):
% if "Moderator" in role_names: % if "Moderator" in role_names:
<a href="javascript:void(0)" class="sidebar-toggle-moderator-button sidebar-revoke-moderator-button">Revoke Moderator provileges</a> <a href="javascript:void(0)" class="sidebar-toggle-moderator-button sidebar-revoke-moderator-button">Revoke Moderator provileges</a>
......
<%inherit file="../main.html" /> <%inherit file="../main.html" />
<%namespace name='static' file='../static_content.html'/> <%namespace name='static' file='../static_content.html'/>
<%block name="bodyclass">discussion</%block> <%block name="bodyclass">discussion</%block>
<%block name="title"><title>Discussion – ${course.number}</title></%block> <%block name="title"><title>Discussion – ${course.number | h}</title></%block>
<%block name="headextra"> <%block name="headextra">
<%static:css group='course'/> <%static:css group='course'/>
......
...@@ -16,19 +16,16 @@ ...@@ -16,19 +16,16 @@
</ul> </ul>
{{#thread}} {{#thread}}
<a class="thread-title" name="{{content.id}}" href="javascript:void(0)">{{content.displayed_title}}</a> <a class="thread-title" name="{{content.id}}" href="javascript:void(0)">{{content.displayed_title}}</a>
<div class="thread-raw-title" style="display: none">{{{content.title}}}</div>
{{/thread}} {{/thread}}
<div class="discussion-content-view"> <div class="discussion-content-view">
<a name="{{content.id}}" style="width: 0; height: 0; padding: 0; border: none;"></a> <a name="{{content.id}}" style="width: 0; height: 0; padding: 0; border: none;"></a>
<div class="content-body {{content.type}}-body" id="content-body-{{content.id}}">{{content.displayed_body}}</div> <div class="content-body {{content.type}}-body" id="content-body-{{content.id}}">{{content.displayed_body}}</div>
<div class="content-raw-body {{content.type}}-raw-body" style="display: none">{{{content.body}}}</div>
{{#thread}} {{#thread}}
<div class="thread-tags"> <div class="thread-tags">
{{#content.tags}} {{#content.tags}}
<a class="thread-tag" href="{{##url_for_tags}}{{.}}{{/url_for_tags}}">{{.}}</a> <a class="thread-tag" href="{{##url_for_tags}}{{.}}{{/url_for_tags}}">{{.}}</a>
{{/content.tags}} {{/content.tags}}
</div> </div>
<div class="thread-raw-tags" style="display: none">{{content.raw_tags}}</div>
{{/thread}} {{/thread}}
<div class="info"> <div class="info">
<div class="comment-time"> <div class="comment-time">
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
<%inherit file="../main.html" /> <%inherit file="../main.html" />
<%namespace name='static' file='../static_content.html'/> <%namespace name='static' file='../static_content.html'/>
<%block name="bodyclass">discussion</%block> <%block name="bodyclass">discussion</%block>
<%block name="title"><title>Discussion – ${course.number}</title></%block> <%block name="title"><title>Discussion – ${course.number | h}</title></%block>
<%block name="headextra"> <%block name="headextra">
<%static:css group='course'/> <%static:css group='course'/>
...@@ -36,6 +36,6 @@ ...@@ -36,6 +36,6 @@
</section> </section>
<script type="text/javascript"> <script type="text/javascript">
var $$profiled_user_id = "${user.id | escapejs}"; var $$profiled_user_id = "${django_user.id | escapejs}";
var $$course_id = "${course.id | escapejs}"; var $$course_id = "${course.id | escapejs}";
</script> </script>
...@@ -197,7 +197,6 @@ if settings.QUICKEDIT: ...@@ -197,7 +197,6 @@ if settings.QUICKEDIT:
if settings.ASKBOT_ENABLED: if settings.ASKBOT_ENABLED:
urlpatterns += (url(r'^%s' % settings.ASKBOT_URL, include('askbot.urls')), \ urlpatterns += (url(r'^%s' % settings.ASKBOT_URL, include('askbot.urls')), \
url(r'^admin/', include(admin.site.urls)), \
url(r'^settings/', include('askbot.deps.livesettings.urls')), \ url(r'^settings/', include('askbot.deps.livesettings.urls')), \
url(r'^followit/', include('followit.urls')), \ url(r'^followit/', include('followit.urls')), \
# url(r'^robots.txt$', include('robots.urls')), # url(r'^robots.txt$', include('robots.urls')),
...@@ -206,8 +205,10 @@ if settings.ASKBOT_ENABLED: ...@@ -206,8 +205,10 @@ if settings.ASKBOT_ENABLED:
if settings.DEBUG: if settings.DEBUG:
## Jasmine ## Jasmine and admin
urlpatterns=urlpatterns + (url(r'^_jasmine/', include('django_jasmine.urls')),) urlpatterns=urlpatterns + (url(r'^_jasmine/', include('django_jasmine.urls')),
url(r'^admin/', include(admin.site.urls)),
)
if settings.MITX_FEATURES.get('AUTH_USE_OPENID'): if settings.MITX_FEATURES.get('AUTH_USE_OPENID'):
urlpatterns += ( urlpatterns += (
......
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