view pylons_app/controllers/changelog.py @ 245:a83a1799480c

Reimplemented way of caching repos list, hg model now get's repos objects right from cached dict, this way we skipp creating instances of MercurialRepository and gain performance. Some import cleanup
author Marcin Kuzminski <marcin@python-works.com>
date Thu, 03 Jun 2010 00:04:48 +0200
parents 7a97f0b100cd
children 3782a6d698af
line wrap: on
line source

from mercurial.graphmod import revisions as graph_rev, colored, CHANGESET
from mercurial.node import short
from pylons import request, session, tmpl_context as c
from pylons_app.lib.auth import LoginRequired
from pylons_app.lib.base import BaseController, render
from pylons_app.lib.filters import age as _age, person
from pylons_app.model.hg_model import _full_changelog_cached
from simplejson import dumps
from webhelpers.paginate import Page
import logging
log = logging.getLogger(__name__)     

class ChangelogController(BaseController):
    
    @LoginRequired()
    def __before__(self):
        super(ChangelogController, self).__before__()
                
    def index(self):
        limit = 100
        default = 20
        if request.params.get('size'):
            try:
                int_size = int(request.params.get('size'))
            except ValueError:
                int_size = default
            int_size = int_size if int_size <= limit else limit 
            c.size = int_size
            session['changelog_size'] = c.size
            session.save()
        else:
            c.size = session.get('changelog_size', default)

        changesets = _full_changelog_cached(c.repo_name)
            
        p = int(request.params.get('page', 1))
        c.pagination = Page(changesets, page=p, item_count=len(changesets),
                            items_per_page=c.size)
            
        #self._graph(c.repo, c.size,p)
        
        return render('changelog/changelog.html')


    def _graph(self, repo, size, p):
        revcount = size
        if not repo.revisions:return dumps([]), 0
        
        max_rev = repo.revisions[-1]
        offset = 1 if p == 1 else  ((p - 1) * revcount)
        rev_start = repo.revisions[(-1 * offset)]
        c.bg_height = 120
        
        revcount = min(max_rev, revcount)
        rev_end = max(0, rev_start - revcount)
        dag = graph_rev(repo.repo, rev_start, rev_end)
        
        c.dag = tree = list(colored(dag))
        canvasheight = (len(tree) + 1) * c.bg_height - 27
        data = []
        for (id, type, ctx, vtx, edges) in tree:
            if type != CHANGESET:
                continue
            node = short(ctx.node())
            age = _age(ctx.date())
            desc = ctx.description()
            user = person(ctx.user())
            branch = ctx.branch()
            branch = branch, repo.repo.branchtags().get(branch) == ctx.node()
            data.append((node, vtx, edges, desc, user, age, branch, ctx.tags()))
    
        c.jsdata = dumps(data) 
        c.canvasheight = canvasheight