Commit 910be64a by Ibrahim Awwal

Make pagination respect any filters or searches or sort keys. Searches and filters will

query the comment service to get their results rather than filtering threads that have
already been loaded.
parent 4d590139
...@@ -22,7 +22,7 @@ import django_comment_client.utils as utils ...@@ -22,7 +22,7 @@ import django_comment_client.utils as utils
import comment_client as cc import comment_client as cc
import xml.sax.saxutils as saxutils import xml.sax.saxutils as saxutils
THREADS_PER_PAGE = 2 THREADS_PER_PAGE = 5
INLINE_THREADS_PER_PAGE = 5 INLINE_THREADS_PER_PAGE = 5
PAGES_NEARBY_DELTA = 2 PAGES_NEARBY_DELTA = 2
escapedict = {'"': '"'} escapedict = {'"': '"'}
...@@ -78,8 +78,8 @@ def get_threads(request, course_id, discussion_id=None, per_page=THREADS_PER_PAG ...@@ -78,8 +78,8 @@ def get_threads(request, course_id, discussion_id=None, per_page=THREADS_PER_PAG
user.save() user.save()
query_params = merge_dict(default_query_params, query_params = merge_dict(default_query_params,
strip_none(extract(request.GET, ['page', 'sort_key', 'sort_order', 'text', 'tags']))) strip_none(extract(request.GET, ['page', 'sort_key', 'sort_order', 'text', 'tags', 'commentable_ids'])))
threads, page, num_pages = cc.Thread.search(query_params) threads, page, num_pages = cc.Thread.search(query_params)
query_params['page'] = page query_params['page'] = page
...@@ -143,6 +143,8 @@ def forum_form_discussion(request, course_id): ...@@ -143,6 +143,8 @@ def forum_form_discussion(request, course_id):
return utils.JsonResponse({ return utils.JsonResponse({
'discussion_data': threads, # TODO: Standardize on 'discussion_data' vs 'threads' 'discussion_data': threads, # TODO: Standardize on 'discussion_data' vs 'threads'
'annotated_content_info': annotated_content_info, 'annotated_content_info': annotated_content_info,
'num_pages': query_params['num_pages'],
'page': query_params['page'],
}) })
else: else:
#recent_active_threads = cc.search_recent_active_threads( #recent_active_threads = cc.search_recent_active_threads(
......
...@@ -11,7 +11,7 @@ cache = cache.get_cache('default') ...@@ -11,7 +11,7 @@ cache = cache.get_cache('default')
def cached_has_permission(user, permission, course_id=None): def cached_has_permission(user, permission, course_id=None):
""" """
Call has_permission if it's not cached. A change in a user's role or Call has_permission if it's not cached. A change in a user's role or
a role's permissions will only become effective after CACHE_LIFESPAN seconds. a role's permissions will only become effective after CACHE_LIFESPAN seconds.
""" """
CACHE_LIFESPAN = 60 CACHE_LIFESPAN = 60
key = "permission_%d_%s_%s" % (user.id, str(course_id), permission) key = "permission_%d_%s_%s" % (user.id, str(course_id), permission)
...@@ -54,8 +54,8 @@ def check_conditions_permissions(user, permissions, course_id, **kwargs): ...@@ -54,8 +54,8 @@ def check_conditions_permissions(user, permissions, course_id, **kwargs):
""" """
Accepts a list of permissions and proceed if any of the permission is valid. Accepts a list of permissions and proceed if any of the permission is valid.
Note that ["can_view", "can_edit"] will proceed if the user has either Note that ["can_view", "can_edit"] will proceed if the user has either
"can_view" or "can_edit" permission. To use AND operator in between, wrap them in "can_view" or "can_edit" permission. To use AND operator in between, wrap them in
a list. a list.
""" """
def test(user, per, operator="or"): def test(user, per, operator="or"):
...@@ -87,7 +87,7 @@ VIEW_PERMISSIONS = { ...@@ -87,7 +87,7 @@ VIEW_PERMISSIONS = {
'vote_for_thread' : [['vote', 'is_open']], 'vote_for_thread' : [['vote', 'is_open']],
'undo_vote_for_thread': [['unvote', 'is_open']], 'undo_vote_for_thread': [['unvote', 'is_open']],
'follow_thread' : ['follow_thread'], 'follow_thread' : ['follow_thread'],
'follow_commentable': ['follow_commentable'], 'follow_commentable': ['follow_commentable'],
'follow_user' : ['follow_user'], 'follow_user' : ['follow_user'],
'unfollow_thread' : ['unfollow_thread'], 'unfollow_thread' : ['unfollow_thread'],
'unfollow_commentable': ['unfollow_commentable'], 'unfollow_commentable': ['unfollow_commentable'],
......
...@@ -16,7 +16,7 @@ class Thread(models.Model): ...@@ -16,7 +16,7 @@ class Thread(models.Model):
] ]
updatable_fields = [ updatable_fields = [
'title', 'body', 'anonymous', 'course_id', 'title', 'body', 'anonymous', 'course_id',
'closed', 'tags', 'user_id', 'commentable_id', 'closed', 'tags', 'user_id', 'commentable_id',
] ]
...@@ -33,7 +33,7 @@ class Thread(models.Model): ...@@ -33,7 +33,7 @@ class Thread(models.Model):
'course_id': query_params['course_id'], 'course_id': query_params['course_id'],
'recursive': False} 'recursive': False}
params = merge_dict(default_params, strip_blank(strip_none(query_params))) params = merge_dict(default_params, strip_blank(strip_none(query_params)))
if query_params.get('text') or query_params.get('tags'): if query_params.get('text') or query_params.get('tags') or query_params.get('commentable_ids'):
url = cls.url(action='search') url = cls.url(action='search')
else: else:
url = cls.url(action='get_all', params=extract(params, 'commentable_id')) url = cls.url(action='get_all', params=extract(params, 'commentable_id'))
...@@ -41,7 +41,7 @@ class Thread(models.Model): ...@@ -41,7 +41,7 @@ class Thread(models.Model):
del params['commentable_id'] del params['commentable_id']
response = perform_request('get', url, params, *args, **kwargs) response = perform_request('get', url, params, *args, **kwargs)
return response.get('collection', []), response.get('page', 1), response.get('num_pages', 1) return response.get('collection', []), response.get('page', 1), response.get('num_pages', 1)
@classmethod @classmethod
def url_for_threads(cls, params={}): def url_for_threads(cls, params={}):
if params.get('commentable_id'): if params.get('commentable_id'):
......
...@@ -18,18 +18,23 @@ if Backbone? ...@@ -18,18 +18,23 @@ if Backbone?
@current_page < @pages @current_page < @pages
addThread: (thread, options) -> addThread: (thread, options) ->
# TODO: Check for existing thread with same ID?
options ||= {} options ||= {}
model = new Thread thread model = new Thread thread
@add model @add model
model model
retrieveAnotherPage: (search_text="", commentable_id="", sort_key="")-> retrieveAnotherPage: (search_text="", commentable_ids="", sort_key="")->
# TODO: Obey dropdown filter (commentable_id) # TODO: I really feel that this belongs in DiscussionThreadListView
@current_page += 1 @current_page += 1
url = DiscussionUtil.urlFor 'threads' url = DiscussionUtil.urlFor 'threads'
data = { page: @current_page, text: search_text } data = { page: @current_page }
if search_text
data['text'] = search_text
if sort_key if sort_key
data['sort_key'] = sort_key data['sort_key'] = sort_key
if commentable_ids
data['commentable_ids'] = commentable_ids
DiscussionUtil.safeAjax DiscussionUtil.safeAjax
$elem: @$el $elem: @$el
url: url url: url
......
...@@ -14,6 +14,7 @@ if Backbone? ...@@ -14,6 +14,7 @@ if Backbone?
@displayedCollection = new Discussion(@collection.models, pages: @collection.pages) @displayedCollection = new Discussion(@collection.models, pages: @collection.pages)
@collection.on "change", @reloadDisplayedCollection @collection.on "change", @reloadDisplayedCollection
@sortBy = "date" @sortBy = "date"
@discussionIds=""
@collection.on "reset", (discussion) => @collection.on "reset", (discussion) =>
board = $(".current-board").html() board = $(".current-board").html()
@displayedCollection.current_page = discussion.current_page @displayedCollection.current_page = discussion.current_page
...@@ -117,10 +118,12 @@ if Backbone? ...@@ -117,10 +118,12 @@ if Backbone?
@$(".post-list").append("<li class='more-pages'><a href='#'>Load more</a></li>") @$(".post-list").append("<li class='more-pages'><a href='#'>Load more</a></li>")
loadMorePages: -> loadMorePages: ->
# TODO: Obey dropdown filter
@$(".more-pages").html('<div class="loading-animation"></div>') @$(".more-pages").html('<div class="loading-animation"></div>')
@$(".more-pages").addClass("loading") @$(".more-pages").addClass("loading")
@collection.retrieveAnotherPage(@current_search, "", @sortBy) @collection.retrieveAnotherPage(@current_search, @discussionIds, @sortBy)
if not @collection.hasMorePages()
$(".more-pages").hide()
renderThread: (thread) => renderThread: (thread) =>
content = $(_.template($("#thread-list-item-template").html())(thread.toJSON())) content = $(_.template($("#thread-list-item-template").html())(thread.toJSON()))
...@@ -232,14 +235,27 @@ if Backbone? ...@@ -232,14 +235,27 @@ if Backbone?
@setTopic(event) @setTopic(event)
@clearSearch @filterTopic, event @clearSearch @filterTopic, event
else else
@setTopic(event) @setTopic(event) # just sets the title for the dropdown
item = $(event.target).closest('li') item = $(event.target).closest('li')
if item.find("span.board-name").data("discussion_id") == "#all" if item.find("span.board-name").data("discussion_id") == "#all"
item = item.parent() item = item.parent()
@discussionIds = ""
discussionIds = _.map item.find(".board-name[data-discussion_id]"), (board) -> $(board).data("discussion_id").id discussionIds = _.map item.find(".board-name[data-discussion_id]"), (board) -> $(board).data("discussion_id").id
filtered = @collection.filter (thread) => @retrieveDiscussions(discussionIds)
_.include(discussionIds, thread.get('commentable_id'))
@displayedCollection.reset filtered retrieveDiscussions: (discussion_ids) ->
@discussionIds = discussion_ids.join(',')
url = DiscussionUtil.urlFor("search")
DiscussionUtil.safeAjax
data: { 'commentable_ids': @discussionIds }
url: url
type: "GET"
success: (response, textStatus) =>
@collection.current_page = response.page
@collection.pages = response.num_pages
@collection.reset(response.discussion_data)
Content.loadContentInfos(response.content_info)
@displayedCollection.reset(@collection.models)
sortThreads: (event) -> sortThreads: (event) ->
@$(".sort-bar a").removeClass("active") @$(".sort-bar a").removeClass("active")
...@@ -283,6 +299,8 @@ if Backbone? ...@@ -283,6 +299,8 @@ if Backbone?
# TODO: Augment existing collection? # TODO: Augment existing collection?
@collection.reset(response.discussion_data) @collection.reset(response.discussion_data)
Content.loadContentInfos(response.content_info) Content.loadContentInfos(response.content_info)
@collection.current_page = response.page
@collection.pages = response.num_pages
# TODO: Perhaps reload user info so that votes can be updated. # TODO: Perhaps reload user info so that votes can be updated.
# In the future we might not load all of a user's votes at once # In the future we might not load all of a user's votes at once
# so this would probably be necessary anyway # so this would probably be necessary anyway
......
...@@ -105,7 +105,7 @@ ...@@ -105,7 +105,7 @@
$('<span>').text(value).append('&nbsp;&nbsp;'), $('<span>').text(value).append('&nbsp;&nbsp;'),
$('<a>', { $('<a>', {
href : '#', href : '#',
title : 'Removing tag', title : 'Remove tag',
text : 'x' text : 'x'
}).click(function () { }).click(function () {
return $('#' + id).removeTag(escape(value)); return $('#' + id).removeTag(escape(value));
......
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