Commit 0e84be58e5f9aa50470905c8f1371bf1438fa925

Authored by Zambom
1 parent 7b144b15

Adding post answer pagination (load more answers button) [Issues: #74 and #87 ]

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
@@ -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")