Add comments pagination.

portnov [2008-06-10 17:50:28]
Add comments pagination.
Filename
media/css/main.css
mgmt/views.py
pygit/pygit.py
templates/comments.html
templates/pager.html
diff --git a/media/css/main.css b/media/css/main.css
index a07d469..e2b090f 100644
--- a/media/css/main.css
+++ b/media/css/main.css
@@ -134,6 +134,22 @@ p.date {
   text-align: right;
 }

+div.pager {
+  text-align: center;
+}
+
+span.pager {
+  padding: 1ex;
+}
+
+.pager-other {
+  border: 1px #091 solid;
+}
+
+.pager-current {
+  border: 1px #888 solid;
+}
+
 .bug {
   border: 1px #888 solid;
   padding: 1ex;
diff --git a/mgmt/views.py b/mgmt/views.py
index 666d90c..5e1c26a 100644
--- a/mgmt/views.py
+++ b/mgmt/views.py
@@ -4,6 +4,7 @@
 from datetime import datetime

 from django.http import HttpResponse,Http404
+from django.core.paginator import Paginator
 from django.template import RequestContext
 from django.template.loader import get_template
 from django.shortcuts import render_to_response
@@ -14,14 +15,13 @@ from models import *
 from context import add_blocks,debug_messages,add_menu
 from rights import can,possible_changes

+COMMENTS_PER_PAGE = 10
+
 def render_it(template,dict,request):
   c = RequestContext(request,dict,[add_blocks,add_menu,debug_messages])
   t = get_template(template)
   return HttpResponse(t.render(c))

-# def render_it(template,dict,request):
-#   return render_to_response(template,dict)
-
 class CommentForm(forms.Form):
   title = forms.CharField()
   text = forms.CharField(widget=forms.Textarea())
@@ -35,6 +35,16 @@ class DocForm(forms.Form):
 #   project = forms.ModelChoiceField(Project.objects.all())
   text = forms.CharField(widget=forms.Textarea())

+def get_comments(request,id,type):
+  all = Comment.objects.filter(object_id=id, object_type=type)
+  pg = Paginator(all,COMMENTS_PER_PAGE)
+  page_num = int(request.GET.get('page',1))
+  page = pg.page(page_num)
+  range = pg.page_range
+  if range == [1]:
+    range = None
+  return page_num,range, page.object_list
+
 def main(request):
   projects = Project.objects.all()
   return render_it('main.html',{'projects': projects},request)
@@ -53,13 +63,15 @@ def one_project(request,id):
         title = title,
         text = text)
     c.save()
-  comments = Comment.objects.filter(object_id=project.id,object_type='Project')
+  curr,pages,comments = get_comments(request,project.id,'Project')
   if can(request.user,'comment'):
     form = CommentForm()
   else:
     form = None
   return render_it('project.html',
       {'project': project,
+       'current_page': curr,
+       'page_numbers': pages,
        'comments': comments,
        'form': form},
        request)
@@ -110,7 +122,7 @@ def one_document(request,id):
         title = title,
         text = text)
     c.save()
-  comments = Comment.objects.filter(object_id=doc.id,object_type='Document')
+  curr,pages,comments = get_comments(request,doc.id,'Document')
   if can(request.user,'comment'):
     form = CommentForm()
   else:
@@ -122,6 +134,8 @@ def one_document(request,id):
   return render_it('document.html',
       {'document': doc,
        'edit_link': edit_link,
+       'current_page': curr,
+       'page_numbers': pages,
        'comments': comments,
        'form': form},
        request)
@@ -164,7 +178,7 @@ def one_bug(request,id):
       if bug.status.id==3:
         bug.responsible = request.user
       bug.save()
-  comments = Comment.objects.filter(object_id=bug.id,object_type='Bug')
+  curr,pages,comments = get_comments(request,bug.id,'Bug')
   change_states = possible_changes(bug,request.user)
   if change_states:
     choices = [(st.id,st.name) for st in change_states]
@@ -188,6 +202,8 @@ def one_bug(request,id):
        'change_state': state_form,
        'edit_link': edit_link,
        'project': bug.project,
+       'current_page': curr,
+       'page_numbers': pages,
        'comments': comments,
        'form': form},
        request)
diff --git a/pygit/pygit.py b/pygit/pygit.py
index 55bf554..876e898 100644
--- a/pygit/pygit.py
+++ b/pygit/pygit.py
@@ -3,7 +3,8 @@ from os.path import basename
 from git import *

 REPOS = ['/home/portnov/www/projects',
-         '/home/portnov/www/projects/mgmt/hms']
+         '/home/portnov/www/projects/mgmt/hms',
+         '/home/portnov/git/pylambda']

 rp = None
 curr_path = None
@@ -112,5 +113,5 @@ def commits_stats(rid,branch='master'):
     y,m,d = tp
     return "%d.%d" % (d,m)
   r = open_repo(rid)
-  d = [c.authored_date[:3] for c in r.commits(branch)][:20]
-  return [(date(t[0]),t[1]) for t in uniq(d)]
+  d = [c.authored_date[:3] for c in r.commits(branch,max_count=100)]
+  return [(date(t[0]),t[1]) for t in uniq(d)][:20]
diff --git a/templates/comments.html b/templates/comments.html
index d9297fb..87369c3 100644
--- a/templates/comments.html
+++ b/templates/comments.html
@@ -1,4 +1,4 @@
-{% if comments.count %}
+{% if comments %}
   <h3>Комментарии</h3>
   <div class='comments'>
     {% for comment in comments %}
@@ -10,6 +10,7 @@
       </div>
     {% endfor %}
   </div>
+  {% include "pager.html" %}
 {% else %}
   <p>Комментариев пока нет.</p>
 {% endif %}
diff --git a/templates/pager.html b/templates/pager.html
new file mode 100644
index 0000000..765d74c
--- /dev/null
+++ b/templates/pager.html
@@ -0,0 +1,11 @@
+{% if page_numbers %}
+<div class='pager'>
+  {% for page in page_numbers %}
+  {% ifequal page current_page %}
+    <span class='pager pager-current'>{{page}}</span>
+  {% else %}
+    <span class='pager pager-other'><a href='?page={{page}}'>{{page}}</a></span>
+  {% endifequal %}
+  {% endfor %}
+</div>
+{% endif %}
ViewGit