Commit 0e84be58e5f9aa50470905c8f1371bf1438fa925
1 parent
7b144b15
Exists in
master
and in
5 other branches
Adding post answer pagination (load more answers button) [Issues: #74 and #87 ]
Showing
9 changed files
with
113 additions
and
8 deletions
Show diff stats
forum/models.py
| @@ -67,4 +67,13 @@ class PostAnswer(models.Model): | @@ -67,4 +67,13 @@ class PostAnswer(models.Model): | ||
| 67 | app_label ='forum' | 67 | app_label ='forum' |
| 68 | 68 | ||
| 69 | def __str__(self): | 69 | def __str__(self): |
| 70 | - return ''.join([self.user.name, " / ", str(self.answer_date)]) | ||
| 71 | \ No newline at end of file | 70 | \ No newline at end of file |
| 71 | + return ''.join([self.user.name, " / ", str(self.answer_date)]) | ||
| 72 | + | ||
| 73 | + def is_modified(self): | ||
| 74 | + create = self.answer_date.strftime("%Y-%m-%d %H:%M:%S") | ||
| 75 | + edit = self.modification_date.strftime("%Y-%m-%d %H:%M:%S") | ||
| 76 | + | ||
| 77 | + if create != edit: | ||
| 78 | + return True | ||
| 79 | + | ||
| 80 | + return False | ||
| 72 | \ No newline at end of file | 81 | \ No newline at end of file |
forum/static/js/forum.js
| @@ -246,6 +246,10 @@ function load_more_posts(pageNum, numberPages, url) { | @@ -246,6 +246,10 @@ function load_more_posts(pageNum, numberPages, url) { | ||
| 246 | $("#loading_posts").hide(); | 246 | $("#loading_posts").hide(); |
| 247 | 247 | ||
| 248 | $("#posts_list").append(data); | 248 | $("#posts_list").append(data); |
| 249 | + }, | ||
| 250 | + error: function(data) { | ||
| 251 | + console.log(data); | ||
| 252 | + console.log('Error'); | ||
| 249 | } | 253 | } |
| 250 | }); | 254 | }); |
| 251 | }, 1000) | 255 | }, 1000) |
| @@ -356,3 +360,35 @@ function delete_answer(url, answer, message) { | @@ -356,3 +360,35 @@ function delete_answer(url, answer, message) { | ||
| 356 | }); | 360 | }); |
| 357 | } | 361 | } |
| 358 | 362 | ||
| 363 | +/* | ||
| 364 | +* | ||
| 365 | +* Function to load more answers of a post | ||
| 366 | +* | ||
| 367 | +*/ | ||
| 368 | +function load_more_answers(post_id, pageNum, numberPages, url) { | ||
| 369 | + // Remove button from the template | ||
| 370 | + $("#post_"+post_id).find(".load_more_answers").remove(); | ||
| 371 | + | ||
| 372 | + // Check if page is equal to the number of pages | ||
| 373 | + if (pageNum == numberPages) { | ||
| 374 | + return false | ||
| 375 | + } | ||
| 376 | + | ||
| 377 | + pageNum += 1; | ||
| 378 | + | ||
| 379 | + // Show loader | ||
| 380 | + $("#post_"+post_id).find(".loading_answers").show(); | ||
| 381 | + | ||
| 382 | + // Configure the url we're about to hit | ||
| 383 | + setTimeout(function (){ | ||
| 384 | + $.ajax({ | ||
| 385 | + url: url, | ||
| 386 | + data: {'page_answer': pageNum}, | ||
| 387 | + success: function(data) { | ||
| 388 | + $("#post_"+post_id).find(".loading_answers").hide(); | ||
| 389 | + | ||
| 390 | + $("#post_"+post_id).find(".answer_list").append(data); | ||
| 391 | + } | ||
| 392 | + }); | ||
| 393 | + }, 1000) | ||
| 394 | +}; | ||
| 359 | \ No newline at end of file | 395 | \ No newline at end of file |
forum/templates/post/post_list.html
| @@ -39,6 +39,11 @@ | @@ -39,6 +39,11 @@ | ||
| 39 | <div class="answer_list"> | 39 | <div class="answer_list"> |
| 40 | {% list_post_answer request post %} | 40 | {% list_post_answer request post %} |
| 41 | </div> | 41 | </div> |
| 42 | + <div class="alert alert-primary loading_answers" role="alert" style="display: none"> | ||
| 43 | + <center> | ||
| 44 | + <span class="fa fa-spin fa-circle-o-notch"></span> | ||
| 45 | + </center> | ||
| 46 | + </div> | ||
| 42 | </div> | 47 | </div> |
| 43 | </div> | 48 | </div> |
| 44 | {% endfor %} | 49 | {% endfor %} |
forum/templates/post_answers/post_answer_list.html
| @@ -24,7 +24,7 @@ | @@ -24,7 +24,7 @@ | ||
| 24 | <div class="post_answer_content"> | 24 | <div class="post_answer_content"> |
| 25 | <div class="card-data"> | 25 | <div class="card-data"> |
| 26 | <p class="comment-date"><i class="fa fa-clock-o"></i> {{ answer.answer_date|timesince }} {% trans 'ago' %} | 26 | <p class="comment-date"><i class="fa fa-clock-o"></i> {{ answer.answer_date|timesince }} {% trans 'ago' %} |
| 27 | - {% if answer.answer_date != answer.modifiction_date %} | 27 | + {% if answer.is_modified %} |
| 28 | <em> - {% trans 'Edited' %}</em> | 28 | <em> - {% trans 'Edited' %}</em> |
| 29 | {% endif %} | 29 | {% endif %} |
| 30 | </p> | 30 | </p> |
| @@ -35,4 +35,10 @@ | @@ -35,4 +35,10 @@ | ||
| 35 | </div> | 35 | </div> |
| 36 | </div> | 36 | </div> |
| 37 | {% endfor %} | 37 | {% endfor %} |
| 38 | +{% endif %} | ||
| 39 | + | ||
| 40 | +{% if not page_obj.number == paginator.num_pages %} | ||
| 41 | + <a href="javascript:load_more_answers({{ post.id }}, {{ page_obj.number }}, {{ paginator.num_pages }}, '{% url 'course:forum:load_answers' post_id=post.id %}');" class="btn btn-raised btn-primary btn-block load_more_answers"> | ||
| 42 | + {% trans 'Load more answers' %} | ||
| 43 | + </a> | ||
| 38 | {% endif %} | 44 | {% endif %} |
| 39 | \ No newline at end of file | 45 | \ No newline at end of file |
forum/templates/post_answers/post_answer_render.html
| @@ -22,7 +22,7 @@ | @@ -22,7 +22,7 @@ | ||
| 22 | <div class="post_answer_content"> | 22 | <div class="post_answer_content"> |
| 23 | <div class="card-data"> | 23 | <div class="card-data"> |
| 24 | <p class="comment-date"><i class="fa fa-clock-o"></i> {{ answer.answer_date|timesince }} {% trans 'ago' %} | 24 | <p class="comment-date"><i class="fa fa-clock-o"></i> {{ answer.answer_date|timesince }} {% trans 'ago' %} |
| 25 | - {% if answer.answer_date != answer.modifiction_date %} | 25 | + {% if answer.is_modified %} |
| 26 | <em> - {% trans 'Edited' %}</em> | 26 | <em> - {% trans 'Edited' %}</em> |
| 27 | {% endif %} | 27 | {% endif %} |
| 28 | </p> | 28 | </p> |
forum/templatetags/list_post.py
| 1 | from django import template | 1 | from django import template |
| 2 | 2 | ||
| 3 | from django.core.paginator import Paginator, EmptyPage | 3 | from django.core.paginator import Paginator, EmptyPage |
| 4 | +from django.http import Http404 | ||
| 4 | 5 | ||
| 5 | from forum.models import Post | 6 | from forum.models import Post |
| 6 | 7 | ||
| @@ -18,7 +19,7 @@ def list_posts(request, forum): | @@ -18,7 +19,7 @@ def list_posts(request, forum): | ||
| 18 | 19 | ||
| 19 | posts = Post.objects.filter(forum = forum).order_by('post_date') | 20 | posts = Post.objects.filter(forum = forum).order_by('post_date') |
| 20 | 21 | ||
| 21 | - paginator = Paginator(posts, 1) | 22 | + paginator = Paginator(posts, 2) |
| 22 | 23 | ||
| 23 | try: | 24 | try: |
| 24 | page_number = int(request.GET.get('page', 1)) | 25 | page_number = int(request.GET.get('page', 1)) |
forum/templatetags/list_post_answer.py
| 1 | from django import template | 1 | from django import template |
| 2 | 2 | ||
| 3 | +from django.core.paginator import Paginator, EmptyPage | ||
| 4 | +from django.http import Http404 | ||
| 5 | + | ||
| 3 | from forum.models import PostAnswer | 6 | from forum.models import PostAnswer |
| 4 | 7 | ||
| 5 | register = template.Library() | 8 | register = template.Library() |
| @@ -14,6 +17,24 @@ def list_post_answer(request, post): | @@ -14,6 +17,24 @@ def list_post_answer(request, post): | ||
| 14 | 'request': request, | 17 | 'request': request, |
| 15 | } | 18 | } |
| 16 | 19 | ||
| 17 | - context['answers'] = PostAnswer.objects.filter(post = post) | 20 | + answers = PostAnswer.objects.filter(post = post) |
| 21 | + | ||
| 22 | + paginator = Paginator(answers, 2) | ||
| 23 | + | ||
| 24 | + try: | ||
| 25 | + page_number = int(request.GET.get('page_answer', 1)) | ||
| 26 | + except ValueError: | ||
| 27 | + raise Http404 | ||
| 28 | + | ||
| 29 | + try: | ||
| 30 | + page_obj = paginator.page(page_number) | ||
| 31 | + except EmptyPage: | ||
| 32 | + raise Http404 | ||
| 33 | + | ||
| 34 | + context['paginator'] = paginator | ||
| 35 | + context['page_obj'] = page_obj | ||
| 36 | + | ||
| 37 | + context['answers'] = page_obj.object_list | ||
| 38 | + context['post'] = post | ||
| 18 | 39 | ||
| 19 | return context | 40 | return context |
| 20 | \ No newline at end of file | 41 | \ No newline at end of file |
forum/urls.py
| @@ -17,6 +17,7 @@ urlpatterns = [ | @@ -17,6 +17,7 @@ urlpatterns = [ | ||
| 17 | url(r'^delete_post/(?P<pk>[\w_-]+)/$', views.PostDeleteView.as_view(), name='delete_post'), | 17 | url(r'^delete_post/(?P<pk>[\w_-]+)/$', views.PostDeleteView.as_view(), name='delete_post'), |
| 18 | url(r'^render_post/([\w_-]+)/$', views.render_post, name='render_post'), | 18 | url(r'^render_post/([\w_-]+)/$', views.render_post, name='render_post'), |
| 19 | url(r'^post_deleted/$', views.post_deleted, name='deleted_post'), | 19 | url(r'^post_deleted/$', views.post_deleted, name='deleted_post'), |
| 20 | + url(r'^load_answers/(?P<post_id>[\w_-]+)/$', views.load_answers, name='load_answers'), | ||
| 20 | url(r'^post_answers/$', views.PostAnswerIndex.as_view(), name='post_answers'), | 21 | url(r'^post_answers/$', views.PostAnswerIndex.as_view(), name='post_answers'), |
| 21 | url(r'^reply_post/$', views.CreatePostAnswerView.as_view(), name='reply_post'), | 22 | url(r'^reply_post/$', views.CreatePostAnswerView.as_view(), name='reply_post'), |
| 22 | url(r'^update_post_answer/(?P<pk>[\w_-]+)/$', views.PostAnswerUpdateView.as_view(), name='update_post_answer'), | 23 | url(r'^update_post_answer/(?P<pk>[\w_-]+)/$', views.PostAnswerUpdateView.as_view(), name='update_post_answer'), |
forum/views.py
| @@ -121,7 +121,7 @@ def load_posts(request, forum_id): | @@ -121,7 +121,7 @@ def load_posts(request, forum_id): | ||
| 121 | 121 | ||
| 122 | posts = Post.objects.filter(forum = forum).order_by('post_date') | 122 | posts = Post.objects.filter(forum = forum).order_by('post_date') |
| 123 | 123 | ||
| 124 | - paginator = Paginator(posts, 1) | 124 | + paginator = Paginator(posts, 2) |
| 125 | 125 | ||
| 126 | try: | 126 | try: |
| 127 | page_number = int(request.GET.get('page', 1)) | 127 | page_number = int(request.GET.get('page', 1)) |
| @@ -133,8 +133,6 @@ def load_posts(request, forum_id): | @@ -133,8 +133,6 @@ def load_posts(request, forum_id): | ||
| 133 | except EmptyPage: | 133 | except EmptyPage: |
| 134 | raise Http404 | 134 | raise Http404 |
| 135 | 135 | ||
| 136 | - print(page_number) | ||
| 137 | - | ||
| 138 | context['paginator'] = paginator | 136 | context['paginator'] = paginator |
| 139 | context['page_obj'] = page_obj | 137 | context['page_obj'] = page_obj |
| 140 | 138 | ||
| @@ -199,6 +197,34 @@ def post_deleted(request): | @@ -199,6 +197,34 @@ def post_deleted(request): | ||
| 199 | """ | 197 | """ |
| 200 | Post Answer Section | 198 | Post Answer Section |
| 201 | """ | 199 | """ |
| 200 | +def load_answers(request, post_id): | ||
| 201 | + context = { | ||
| 202 | + 'request': request, | ||
| 203 | + } | ||
| 204 | + | ||
| 205 | + post = get_object_or_404(Post, id = post_id) | ||
| 206 | + | ||
| 207 | + answers = PostAnswer.objects.filter(post = post) | ||
| 208 | + | ||
| 209 | + paginator = Paginator(answers, 2) | ||
| 210 | + | ||
| 211 | + try: | ||
| 212 | + page_number = int(request.GET.get('page_answer', 1)) | ||
| 213 | + except ValueError: | ||
| 214 | + raise Http404 | ||
| 215 | + | ||
| 216 | + try: | ||
| 217 | + page_obj = paginator.page(page_number) | ||
| 218 | + except EmptyPage: | ||
| 219 | + raise Http404 | ||
| 220 | + | ||
| 221 | + context['paginator'] = paginator | ||
| 222 | + context['page_obj'] = page_obj | ||
| 223 | + | ||
| 224 | + context['answers'] = page_obj.object_list | ||
| 225 | + context['post'] = post | ||
| 226 | + | ||
| 227 | + return render(request, 'post_answers/post_answer_list.html', context) | ||
| 202 | 228 | ||
| 203 | class PostAnswerIndex(LoginRequiredMixin, generic.ListView): | 229 | class PostAnswerIndex(LoginRequiredMixin, generic.ListView): |
| 204 | login_url = reverse_lazy("core:home") | 230 | login_url = reverse_lazy("core:home") |