comparison pylons_app/controllers/hg.py @ 93:aec4c0071cb3

added empty controllers for branches tags files graph, routing and test for them
author Marcin Kuzminski <marcin@python-works.com>
date Wed, 21 Apr 2010 00:26:11 +0200
parents 670713507d03
children 8b06c420491d
comparison
equal deleted inserted replaced
92:2968fb635787 93:aec4c0071cb3
1 #!/usr/bin/python 1 #!/usr/bin/python
2 # -*- coding: utf-8 -*- 2 # -*- coding: utf-8 -*-
3 import logging 3 from mako.template import Template
4 from mercurial.hg import repository
5 from mercurial.hgweb import hgweb
6 from mercurial.hgweb.request import wsgiapplication
7 from mercurial.localrepo import localrepository
8 from operator import itemgetter
4 from pylons import tmpl_context as c, app_globals as g, session, request, config 9 from pylons import tmpl_context as c, app_globals as g, session, request, config
10 from pylons.controllers.util import abort
5 from pylons_app.lib import helpers as h 11 from pylons_app.lib import helpers as h
6 from pylons_app.lib.base import BaseController, render 12 from pylons_app.lib.base import BaseController, render
7 from mako.template import Template
8 from pylons.controllers.util import abort
9 from pylons_app.lib.utils import get_repo_slug 13 from pylons_app.lib.utils import get_repo_slug
10 from operator import itemgetter
11 from pylons_app.model.hg_model import HgModel 14 from pylons_app.model.hg_model import HgModel
15 import logging
16 import os
17 from beaker.cache import cache_region
12 log = logging.getLogger(__name__) 18 log = logging.getLogger(__name__)
13 19
14 class HgController(BaseController): 20 class HgController(BaseController):
15 21
16 def __before__(self): 22 def __before__(self):
17 c.repos_prefix = config['repos_name'] 23 c.repos_prefix = config['repos_name']
18 c.staticurl = g.statics 24 c.staticurl = g.statics
19 c.repo_name = get_repo_slug(request) 25 c.repo_name = get_repo_slug(request)
20 26
21 def index(self): 27 def index(self):
28
29
22 hg_model = HgModel() 30 hg_model = HgModel()
23 c.repos_list = list(hg_model.get_repos()) 31 @cache_region('short_term', 'repo_list')
32 def _list():
33 return list(hg_model.get_repos())
34
35 c.repos_list = _list()
24 c.current_sort = request.GET.get('sort', 'name') 36 c.current_sort = request.GET.get('sort', 'name')
25 37
26 cs = c.current_sort 38 cs = c.current_sort
27 c.cs_slug = cs.replace('-', '') 39 c.cs_slug = cs.replace('-', '')
28 sortables = ['name', 'description', 'last_change', 'tip', 'contact'] 40 sortables = ['name', 'description', 'last_change', 'tip', 'contact']
34 else: 46 else:
35 c.repos_list.sort(key=itemgetter(sort_key), reverse=False) 47 c.repos_list.sort(key=itemgetter(sort_key), reverse=False)
36 48
37 return render('/index.html') 49 return render('/index.html')
38 50
39 def view(self, *args, **kwargs): 51 def view(self, environ, start_response, path_info):
40 #TODO: reimplement this not tu use hgwebdir 52 print path_info
41
42 response = g.hgapp(request.environ, self.start_response)
43 53
54 def app_maker():
55
56 path = os.path.join(g.base_path, c.repo_name)
57 repo = repository(g.baseui, path)
58 hgwebapp = hgweb(repo, c.repo_name)
59 return hgwebapp
60
61 a = wsgiapplication(app_maker)
62 resp = a(environ, start_response)
63
44 http_accept = request.environ.get('HTTP_ACCEPT', False) 64 http_accept = request.environ.get('HTTP_ACCEPT', False)
45 if not http_accept: 65 if not http_accept:
46 return abort(status_code=400, detail='no http accept in header') 66 return abort(status_code=400, detail='no http accept in header')
47 67
48 #for mercurial protocols and raw files we can't wrap into mako 68 #for mercurial protocols and raw files we can't wrap into mako
49 if http_accept.find("mercurial") != -1 or \ 69 if http_accept.find("mercurial") != -1 or \
50 request.environ['PATH_INFO'].find('raw-file') != -1: 70 request.environ['PATH_INFO'].find('raw-file') != -1:
51 return response 71 return resp
52 try: 72 try:
53 tmpl = u''.join(response) 73 tmpl = u''.join(resp)
54 template = Template(tmpl, lookup=request.environ['pylons.pylons']\ 74 template = Template(tmpl, lookup=request.environ['pylons.pylons']\
55 .config['pylons.app_globals'].mako_lookup) 75 .config['pylons.app_globals'].mako_lookup)
56 76
57 except (RuntimeError, UnicodeDecodeError): 77 except (RuntimeError, UnicodeDecodeError):
58 log.info('disabling unicode due to encoding error') 78 log.info('disabling unicode due to encoding error')
59 response = g.hgapp(request.environ, self.start_response) 79 resp = g.hgapp(request.environ, self.start_response)
60 tmpl = ''.join(response) 80 tmpl = ''.join(resp)
61 template = Template(tmpl, lookup=request.environ['pylons.pylons']\ 81 template = Template(tmpl, lookup=request.environ['pylons.pylons']\
62 .config['pylons.app_globals'].mako_lookup, disable_unicode=True) 82 .config['pylons.app_globals'].mako_lookup, disable_unicode=True)
63 83
64
65 return template.render(g=g, c=c, session=session, h=h) 84 return template.render(g=g, c=c, session=session, h=h)