##// END OF EJS Templates
implemented Shortlog as seperate controller,...
Marcin Kuzminski -
r83:db39d0ca default
parent child Browse files
Show More
@@ -0,0 +1,35 b''
1 import logging
2
3 from pylons import tmpl_context as c, app_globals as g, session, request, config, url
4 from pylons.controllers.util import abort, redirect
5
6 from pylons_app.lib.base import BaseController, render
7 from pylons_app.lib.utils import get_repo_slug
8 from pylons_app.model.hg_model import HgModel
9 from webhelpers.paginate import Page
10 log = logging.getLogger(__name__)
11
12 class ShortlogController(BaseController):
13 def __before__(self):
14 c.repos_prefix = config['repos_name']
15 c.staticurl = g.statics
16 c.repo_name = get_repo_slug(request)
17
18
19 def index(self):
20 hg_model = HgModel()
21 lim = 20
22 p = int(request.params.get('page', 1))
23 repo = hg_model.get_repo(c.repo_name)
24 cnt = repo.revisions[-1]
25 gen = repo.get_changesets(None)
26 repo_changesets = list(gen)
27 repo_changesets2 = list(gen)
28 repo_changesets3 = list(gen)
29 repo_changesets4 = list(gen)
30
31 c.repo_changesets = Page(repo_changesets, page=p, item_count=cnt, items_per_page=lim)
32 c.shortlog_data = render('shortlog_data.html')
33 if request.params.get('partial'):
34 return c.shortlog_data
35 return render('/shortlog.html')
@@ -0,0 +1,38 b''
1 <%inherit file="base/base.html"/>
2
3 <%def name="title()">
4 ${_('Repository managment')}
5 </%def>
6 <%def name="breadcrumbs()">
7 ${h.link_to(u'Home',h.url('/'))}
8 /
9 ${h.link_to(c.repo_name,h.url('shortlog_home',repo_name=c.repo_name))}
10 /
11 ${_('shortlog')}
12 </%def>
13 <%def name="page_nav()">
14 <form action="log">
15 <dl class="search">
16 <dt><label>Search: </label></dt>
17 <dd><input type="text" name="rev" /></dd>
18 </dl>
19 </form>
20
21 <ul class="page-nav">
22 <li>${h.link(_('summary'),h.url('summary_home',repo_name=c.repo_name))}</li>
23 <li class="current">${_('shortlog')}</li>
24 <li><a href="log">changelog</a></li>
25 <li><a href="graph/{node|short}">graph</a></li>
26 <li><a href="tags">tags</a></li>
27 <li><a href="branches">branches</a></li>
28 <li><a href="file/{node|short}">files</a></li>
29 </ul>
30 </%def>
31 <%def name="main()">
32
33 <h2 class="no-link no-border">${_('Shortlog')}</h2>
34
35 <div id="shortlog_data">
36 ${c.shortlog_data}
37 </div>
38 </%def> No newline at end of file
@@ -0,0 +1,32 b''
1 ## -*- coding: utf-8 -*-
2 <%!
3 from pylons_app.lib import filters
4 %>
5 <table>
6 %for cnt,cs in enumerate(c.repo_changesets):
7 <tr class="parity${cnt%2}">
8 <td>${cs._ctx.date()|n,filters.age}</td>
9 <td title="${cs.author}">${cs.author|n,filters.person}</td>
10 <td>${h.link_to(cs.message,h.url('rev/'+str(cs._ctx)))}</td>
11 <td class="nowrap">
12 ${h.link_to(_('changeset'),h.url('file/'+str(cs._ctx)))}
13 |
14 ${h.link_to(_('files'),h.url('file/'+str(cs._ctx)))}
15 </td>
16 </tr>
17 %endfor
18 <tr>
19 <script type="text/javascript">
20 var data_div = 'shortlog_data';
21 YAHOO.util.Event.onDOMReady(function(){
22 YAHOO.util.Event.addListener(YAHOO.util.Dom.getElementsByClassName('pager_link'),"click",function(){
23 YAHOO.util.Dom.setStyle('shortlog_data','opacity','0.3');});});
24 </script>
25 <td>${c.repo_changesets.pager('$link_previous ~2~ $link_next',
26 onclick="""YAHOO.util.Connect.asyncRequest('GET','$partial_url',{
27 success:function(o){YAHOO.util.Dom.get(data_div).innerHTML=o.responseText;
28 YAHOO.util.Event.addListener(YAHOO.util.Dom.getElementsByClassName('pager_link'),"click",function(){
29 YAHOO.util.Dom.setStyle(data_div,'opacity','0.3');});
30 YAHOO.util.Dom.setStyle(data_div,'opacity','1');}},null); return false;""")}</td>
31 </tr>
32 </table> No newline at end of file
@@ -0,0 +1,7 b''
1 from pylons_app.tests import *
2
3 class TestShortlogController(TestController):
4
5 def test_index(self):
6 response = self.app.get(url(controller='shortlog', action='index'))
7 # Test response...
@@ -1,118 +1,119 b''
1 ################################################################################
1 ################################################################################
2 ################################################################################
2 ################################################################################
3 # pylons_app - Pylons environment configuration #
3 # pylons_app - Pylons environment configuration #
4 # #
4 # #
5 # The %(here)s variable will be replaced with the parent directory of this file#
5 # The %(here)s variable will be replaced with the parent directory of this file#
6 ################################################################################
6 ################################################################################
7
7
8 [DEFAULT]
8 [DEFAULT]
9 debug = true
9 debug = true
10 ############################################
10 ############################################
11 ## Uncomment and replace with the address ##
11 ## Uncomment and replace with the address ##
12 ## which should receive any error reports ##
12 ## which should receive any error reports ##
13 ############################################
13 ############################################
14 #email_to = marcin.kuzminski@etelko.pl
14 #email_to = marcin.kuzminski@etelko.pl
15 #smtp_server = mail.etelko.pl
15 #smtp_server = mail.etelko.pl
16 #error_email_from = paste_error@localhost
16 #error_email_from = paste_error@localhost
17 #smtp_username =
17 #smtp_username =
18 #smtp_password =
18 #smtp_password =
19 #error_message = 'mercurial crash !'
19 #error_message = 'mercurial crash !'
20
20
21 [server:main]
21 [server:main]
22 threadpool_workers = 5
22 use = egg:Paste#http
23 use = egg:Paste#http
23 host = 127.0.0.1
24 host = 127.0.0.1
24 port = 5000
25 port = 5000
25
26
26 [app:main]
27 [app:main]
27 use = egg:pylons_app
28 use = egg:pylons_app
28 full_stack = true
29 full_stack = true
29 static_files = true
30 static_files = true
30 lang=en
31 lang=en
31 cache_dir = %(here)s/data
32 cache_dir = %(here)s/data
32 repos_name = Python-works
33 repos_name = Python-works
33
34
34 ####################################
35 ####################################
35 ### BEAKER CACHE ####
36 ### BEAKER CACHE ####
36 ####################################
37 ####################################
37 beaker.cache.data_dir=/tmp/cache/data
38 beaker.cache.data_dir=/tmp/cache/data
38 beaker.cache.lock_dir=/tmp/cache/lock
39 beaker.cache.lock_dir=/tmp/cache/lock
39 beaker.cache.regions=short_term
40 beaker.cache.regions=short_term
40 beaker.cache.short_term.type=memory
41 beaker.cache.short_term.type=memory
41 beaker.cache.short_term.expire=3600
42 beaker.cache.short_term.expire=3600
42
43
43 ################################################################################
44 ################################################################################
44 ## WARNING: *THE LINE BELOW MUST BE UNCOMMENTED ON A PRODUCTION ENVIRONMENT* ##
45 ## WARNING: *THE LINE BELOW MUST BE UNCOMMENTED ON A PRODUCTION ENVIRONMENT* ##
45 ## Debug mode will enable the interactive debugging tool, allowing ANYONE to ##
46 ## Debug mode will enable the interactive debugging tool, allowing ANYONE to ##
46 ## execute malicious code after an exception is raised. ##
47 ## execute malicious code after an exception is raised. ##
47 ################################################################################
48 ################################################################################
48 #set debug = false
49 #set debug = false
49
50
50 ##################################
51 ##################################
51 ### LOGVIEW CONFIG ###
52 ### LOGVIEW CONFIG ###
52 ##################################
53 ##################################
53 logview.sqlalchemy = #faa
54 logview.sqlalchemy = #faa
54 logview.pylons.templating = #bfb
55 logview.pylons.templating = #bfb
55 logview.pylons.util = #eee
56 logview.pylons.util = #eee
56
57
57 #########################################################
58 #########################################################
58 ### DB CONFIGS - EACH DB WILL HAVE IT'S OWN CONFIG ###
59 ### DB CONFIGS - EACH DB WILL HAVE IT'S OWN CONFIG ###
59 #########################################################
60 #########################################################
60 sqlalchemy.db1.url = sqlite:///%(here)s/hg_app.db
61 sqlalchemy.db1.url = sqlite:///%(here)s/hg_app.db
61 #sqlalchemy.db1.echo = True
62 #sqlalchemy.db1.echo = True
62 #sqlalchemy.db1.pool_recycle = 3600
63 #sqlalchemy.db1.pool_recycle = 3600
63 sqlalchemy.convert_unicode = true
64 sqlalchemy.convert_unicode = true
64
65
65 ################################
66 ################################
66 ### LOGGING CONFIGURATION ####
67 ### LOGGING CONFIGURATION ####
67 ################################
68 ################################
68 [loggers]
69 [loggers]
69 keys = root, routes, pylons_app, sqlalchemy
70 keys = root, routes, pylons_app, sqlalchemy
70
71
71 [handlers]
72 [handlers]
72 keys = console
73 keys = console
73
74
74 [formatters]
75 [formatters]
75 keys = generic
76 keys = generic
76
77
77 #############
78 #############
78 ## LOGGERS ##
79 ## LOGGERS ##
79 #############
80 #############
80 [logger_root]
81 [logger_root]
81 level = NOTSET
82 level = NOTSET
82 handlers = console
83 handlers = console
83
84
84 [logger_routes]
85 [logger_routes]
85 level = DEBUG
86 level = DEBUG
86 handlers = console
87 handlers = console
87 qualname = routes.middleware
88 qualname = routes.middleware
88 # "level = DEBUG" logs the route matched and routing variables.
89 # "level = DEBUG" logs the route matched and routing variables.
89
90
90 [logger_pylons_app]
91 [logger_pylons_app]
91 level = DEBUG
92 level = DEBUG
92 handlers = console
93 handlers = console
93 qualname = pylons_app
94 qualname = pylons_app
94
95
95
96
96 [logger_sqlalchemy]
97 [logger_sqlalchemy]
97 level = DEBUG
98 level = DEBUG
98 handlers = console
99 handlers = console
99 qualname = sqlalchemy.engine
100 qualname = sqlalchemy.engine
100
101
101 ##############
102 ##############
102 ## HANDLERS ##
103 ## HANDLERS ##
103 ##############
104 ##############
104
105
105 [handler_console]
106 [handler_console]
106 class = StreamHandler
107 class = StreamHandler
107 args = (sys.stderr,)
108 args = (sys.stderr,)
108 level = NOTSET
109 level = NOTSET
109 formatter = generic
110 formatter = generic
110
111
111 ################
112 ################
112 ## FORMATTERS ##
113 ## FORMATTERS ##
113 ################
114 ################
114
115
115 [formatter_generic]
116 [formatter_generic]
116 format = %(asctime)s,%(msecs)03d %(levelname)-5.5s [%(name)s] %(message)s
117 format = %(asctime)s,%(msecs)03d %(levelname)-5.5s [%(name)s] %(message)s
117 datefmt = %Y-%m-%d %H:%M:%S
118 datefmt = %Y-%m-%d %H:%M:%S
118
119
@@ -1,118 +1,119 b''
1 ################################################################################
1 ################################################################################
2 ################################################################################
2 ################################################################################
3 # pylons_app - Pylons environment configuration #
3 # pylons_app - Pylons environment configuration #
4 # #
4 # #
5 # The %(here)s variable will be replaced with the parent directory of this file#
5 # The %(here)s variable will be replaced with the parent directory of this file#
6 ################################################################################
6 ################################################################################
7
7
8 [DEFAULT]
8 [DEFAULT]
9 debug = true
9 debug = true
10 ############################################
10 ############################################
11 ## Uncomment and replace with the address ##
11 ## Uncomment and replace with the address ##
12 ## which should receive any error reports ##
12 ## which should receive any error reports ##
13 ############################################
13 ############################################
14 #email_to = marcin.kuzminski@etelko.pl
14 #email_to = marcin.kuzminski@etelko.pl
15 #smtp_server = mail.etelko.pl
15 #smtp_server = mail.etelko.pl
16 #error_email_from = paste_error@localhost
16 #error_email_from = paste_error@localhost
17 #smtp_username =
17 #smtp_username =
18 #smtp_password =
18 #smtp_password =
19 #error_message = 'mercurial crash !'
19 #error_message = 'mercurial crash !'
20
20
21 [server:main]
21 [server:main]
22 threadpool_workers = 10
22 use = egg:Paste#http
23 use = egg:Paste#http
23 host = 127.0.0.1
24 host = 127.0.0.1
24 port = 8001
25 port = 8001
25
26
26 [app:main]
27 [app:main]
27 use = egg:pylons_app
28 use = egg:pylons_app
28 full_stack = true
29 full_stack = true
29 static_files = true
30 static_files = true
30 lang=en
31 lang=en
31 cache_dir = %(here)s/data
32 cache_dir = %(here)s/data
32 repos_name = Python-works
33 repos_name = Python-works
33
34
34 ####################################
35 ####################################
35 ### BEAKER CACHE ####
36 ### BEAKER CACHE ####
36 ####################################
37 ####################################
37 beaker.cache.data_dir=/tmp/cache/data
38 beaker.cache.data_dir=/tmp/cache/data
38 beaker.cache.lock_dir=/tmp/cache/lock
39 beaker.cache.lock_dir=/tmp/cache/lock
39 beaker.cache.regions=short_term
40 beaker.cache.regions=short_term
40 beaker.cache.short_term.type=memory
41 beaker.cache.short_term.type=memory
41 beaker.cache.short_term.expire=3600
42 beaker.cache.short_term.expire=3600
42
43
43 ################################################################################
44 ################################################################################
44 ## WARNING: *THE LINE BELOW MUST BE UNCOMMENTED ON A PRODUCTION ENVIRONMENT* ##
45 ## WARNING: *THE LINE BELOW MUST BE UNCOMMENTED ON A PRODUCTION ENVIRONMENT* ##
45 ## Debug mode will enable the interactive debugging tool, allowing ANYONE to ##
46 ## Debug mode will enable the interactive debugging tool, allowing ANYONE to ##
46 ## execute malicious code after an exception is raised. ##
47 ## execute malicious code after an exception is raised. ##
47 ################################################################################
48 ################################################################################
48 #set debug = false
49 #set debug = false
49
50
50 ##################################
51 ##################################
51 ### LOGVIEW CONFIG ###
52 ### LOGVIEW CONFIG ###
52 ##################################
53 ##################################
53 logview.sqlalchemy = #faa
54 logview.sqlalchemy = #faa
54 logview.pylons.templating = #bfb
55 logview.pylons.templating = #bfb
55 logview.pylons.util = #eee
56 logview.pylons.util = #eee
56
57
57 #########################################################
58 #########################################################
58 ### DB CONFIGS - EACH DB WILL HAVE IT'S OWN CONFIG ###
59 ### DB CONFIGS - EACH DB WILL HAVE IT'S OWN CONFIG ###
59 #########################################################
60 #########################################################
60 sqlalchemy.db1.url = sqlite:///%(here)s/hg_app.db
61 sqlalchemy.db1.url = sqlite:///%(here)s/hg_app.db
61 #sqlalchemy.db1.echo = True
62 #sqlalchemy.db1.echo = True
62 #sqlalchemy.db1.pool_recycle = 3600
63 #sqlalchemy.db1.pool_recycle = 3600
63 sqlalchemy.convert_unicode = true
64 sqlalchemy.convert_unicode = true
64
65
65 ################################
66 ################################
66 ### LOGGING CONFIGURATION ####
67 ### LOGGING CONFIGURATION ####
67 ################################
68 ################################
68 [loggers]
69 [loggers]
69 keys = root, routes, pylons_app, sqlalchemy
70 keys = root, routes, pylons_app, sqlalchemy
70
71
71 [handlers]
72 [handlers]
72 keys = console
73 keys = console
73
74
74 [formatters]
75 [formatters]
75 keys = generic
76 keys = generic
76
77
77 #############
78 #############
78 ## LOGGERS ##
79 ## LOGGERS ##
79 #############
80 #############
80 [logger_root]
81 [logger_root]
81 level = INFO
82 level = INFO
82 handlers = console
83 handlers = console
83
84
84 [logger_routes]
85 [logger_routes]
85 level = INFO
86 level = INFO
86 handlers = console
87 handlers = console
87 qualname = routes.middleware
88 qualname = routes.middleware
88 # "level = DEBUG" logs the route matched and routing variables.
89 # "level = DEBUG" logs the route matched and routing variables.
89
90
90 [logger_pylons_app]
91 [logger_pylons_app]
91 level = DEBUG
92 level = DEBUG
92 handlers = console
93 handlers = console
93 qualname = pylons_app
94 qualname = pylons_app
94
95
95
96
96 [logger_sqlalchemy]
97 [logger_sqlalchemy]
97 level = DEBUG
98 level = DEBUG
98 handlers = console
99 handlers = console
99 qualname = sqlalchemy.engine
100 qualname = sqlalchemy.engine
100
101
101 ##############
102 ##############
102 ## HANDLERS ##
103 ## HANDLERS ##
103 ##############
104 ##############
104
105
105 [handler_console]
106 [handler_console]
106 class = StreamHandler
107 class = StreamHandler
107 args = (sys.stderr,)
108 args = (sys.stderr,)
108 level = NOTSET
109 level = NOTSET
109 formatter = generic
110 formatter = generic
110
111
111 ################
112 ################
112 ## FORMATTERS ##
113 ## FORMATTERS ##
113 ################
114 ################
114
115
115 [formatter_generic]
116 [formatter_generic]
116 format = %(asctime)s,%(msecs)03d %(levelname)-5.5s [%(name)s] %(message)s
117 format = %(asctime)s,%(msecs)03d %(levelname)-5.5s [%(name)s] %(message)s
117 datefmt = %Y-%m-%d %H:%M:%S
118 datefmt = %Y-%m-%d %H:%M:%S
118
119
@@ -1,38 +1,39 b''
1 """Routes configuration
1 """Routes configuration
2
2
3 The more specific and detailed routes should be defined first so they
3 The more specific and detailed routes should be defined first so they
4 may take precedent over the more generic routes. For more information
4 may take precedent over the more generic routes. For more information
5 refer to the routes manual at http://routes.groovie.org/docs/
5 refer to the routes manual at http://routes.groovie.org/docs/
6 """
6 """
7 from routes import Mapper
7 from routes import Mapper
8
8
9 def make_map(config):
9 def make_map(config):
10 """Create, configure and return the routes Mapper"""
10 """Create, configure and return the routes Mapper"""
11 map = Mapper(directory=config['pylons.paths']['controllers'],
11 map = Mapper(directory=config['pylons.paths']['controllers'],
12 always_scan=config['debug'])
12 always_scan=config['debug'])
13 map.minimization = False
13 map.minimization = False
14 map.explicit = False
14 map.explicit = False
15
15
16 # The ErrorController route (handles 404/500 error pages); it should
16 # The ErrorController route (handles 404/500 error pages); it should
17 # likely stay at the top, ensuring it can always be resolved
17 # likely stay at the top, ensuring it can always be resolved
18 map.connect('/error/{action}', controller='error')
18 map.connect('/error/{action}', controller='error')
19 map.connect('/error/{action}/{id}', controller='error')
19 map.connect('/error/{action}/{id}', controller='error')
20
20
21 # CUSTOM ROUTES HERE
21 # CUSTOM ROUTES HERE
22 map.connect('hg_home', '/', controller='hg', action='index')
22 map.connect('hg_home', '/', controller='hg', action='index')
23
23
24 map.resource('repo', 'repos', path_prefix='/_admin')
24 map.resource('repo', 'repos', path_prefix='/_admin')
25 map.resource('user', 'users', path_prefix='/_admin')
25 map.resource('user', 'users', path_prefix='/_admin')
26
26
27
27
28 with map.submapper(path_prefix='/_admin', controller='admin') as m:
28 with map.submapper(path_prefix='/_admin', controller='admin') as m:
29 m.connect('admin_home', '/', action='index')#main page
29 m.connect('admin_home', '/', action='index')#main page
30 m.connect('admin_add_repo', '/add_repo/{new_repo:[a-z0-9\. _-]*}', action='add_repo')
30 m.connect('admin_add_repo', '/add_repo/{new_repo:[a-z0-9\. _-]*}', action='add_repo')
31
31
32
32
33 map.connect('summary_home', '/{repo_name}/_summary', controller='summary')
33 map.connect('summary_home', '/{repo_name}/_summary', controller='summary')
34 map.connect('shortlog_home', '/{repo_name}/_shortlog', controller='shortlog')
34
35
35 map.connect('hg', '/{path_info:.*}', controller='hg',
36 map.connect('hg', '/{path_info:.*}', controller='hg',
36 action="view", path_info='/')
37 action="view", path_info='/')
37
38
38 return map
39 return map
@@ -1,14 +1,15 b''
1 from mercurial import util
1 from mercurial import util
2 from mercurial.templatefilters import age as _age
2 from mercurial.templatefilters import age as _age, person as _person
3
3
4 age = lambda context, x:_age(x)
4 age = lambda x:_age(x)
5 capitalize = lambda x: x.capitalize()
5 capitalize = lambda x: x.capitalize()
6 date = lambda x: util.datestr(x)
6 date = lambda x: util.datestr(x)
7 email = util.email
7 email = util.email
8 hgdate = lambda context, x: "%d %d" % x
8 person = lambda x: _person(x)
9 isodate = lambda context, x: util.datestr(x, '%Y-%m-%d %H:%M %1%2')
9 hgdate = lambda x: "%d %d" % x
10 isodatesec = lambda context, x: util.datestr(x, '%Y-%m-%d %H:%M:%S %1%2')
10 isodate = lambda x: util.datestr(x, '%Y-%m-%d %H:%M %1%2')
11 localdate = lambda context, x: (x[0], util.makedate()[1])
11 isodatesec = lambda x: util.datestr(x, '%Y-%m-%d %H:%M:%S %1%2')
12 rfc822date = lambda context, x: util.datestr(x, "%a, %d %b %Y %H:%M:%S %1%2")
12 localdate = lambda x: (x[0], util.makedate()[1])
13 rfc3339date = lambda context, x: util.datestr(x, "%Y-%m-%dT%H:%M:%S%1:%2")
13 rfc822date = lambda x: util.datestr(x, "%a, %d %b %Y %H:%M:%S %1%2")
14 time_ago = lambda context, x: util.datestr(_age(x), "%a, %d %b %Y %H:%M:%S %1%2")
14 rfc3339date = lambda x: util.datestr(x, "%Y-%m-%dT%H:%M:%S%1:%2")
15 time_ago = lambda x: util.datestr(_age(x), "%a, %d %b %Y %H:%M:%S %1%2")
@@ -1,29 +1,38 b''
1 ## -*- coding: utf-8 -*-
1 %if c.users_log:
2 %if c.users_log:
2 <table>
3 <table>
3 <tr>
4 <tr>
4 <td>${_('Username')}</td>
5 <td>${_('Username')}</td>
5 <td>${_('Repository')}</td>
6 <td>${_('Repository')}</td>
6 <td>${_('Action')}</td>
7 <td>${_('Action')}</td>
7 <td>${_('Date')}</td>
8 <td>${_('Date')}</td>
8 </tr>
9 </tr>
9
10
10 %for cnt,l in enumerate(c.users_log):
11 %for cnt,l in enumerate(c.users_log):
11 <tr class="parity${cnt%2}">
12 <tr class="parity${cnt%2}">
12 <td>${l.user.username}</td>
13 <td>${l.user.username}</td>
13 <td>${l.repository}</td>
14 <td>${l.repository}</td>
14 <td>${l.action}</td>
15 <td>${l.action}</td>
15 <td>${l.action_date}</td>
16 <td>${l.action_date}</td>
16 </tr>
17 </tr>
17 %endfor
18 %endfor
18
19
19 <tr>
20 <tr>
21 <script type="text/javascript">
22 var data_div = 'user_log';
23 YAHOO.util.Event.onDOMReady(function(){
24 YAHOO.util.Event.addListener(YAHOO.util.Dom.getElementsByClassName('pager_link'),"click",function(){
25 YAHOO.util.Dom.setStyle('shortlog_data','opacity','0.3');});});
26 </script>
20 <td>${c.users_log.pager('$link_previous ~2~ $link_next',
27 <td>${c.users_log.pager('$link_previous ~2~ $link_next',
21 onclick="""YAHOO.util.Connect.asyncRequest('GET','$partial_url',{
28 onclick="""YAHOO.util.Connect.asyncRequest('GET','$partial_url',{
22 success:function(o){YAHOO.util.Dom.get('user_log').innerHTML=o.responseText;}
29 success:function(o){YAHOO.util.Dom.get(data_div).innerHTML=o.responseText;
23 },null); return false;""")}</td>
30 YAHOO.util.Event.addListener(YAHOO.util.Dom.getElementsByClassName('pager_link'),"click",function(){
24 </tr>
31 YAHOO.util.Dom.setStyle(data_div,'opacity','0.3');});
32 YAHOO.util.Dom.setStyle(data_div,'opacity','1');}},null); return false;""")}</td>
33 </tr>
25 </table>
34 </table>
26
35
27 %else:
36 %else:
28 ${_('No actions yet')}
37 ${_('No actions yet')}
29 %endif
38 %endif
@@ -1,49 +1,46 b''
1 ## -*- coding: utf-8 -*-
1 ## -*- coding: utf-8 -*-
2 ##filters definition
3 <%namespace name="f" module="pylons_app.lib.filters" inheritable="True"/>
4
5 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
2 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
6 <html xmlns="http://www.w3.org/1999/xhtml">
3 <html xmlns="http://www.w3.org/1999/xhtml">
7 <head>
4 <head>
8 <link rel="icon" href="${c.staticurl}hgicon.png" type="image/png" />
5 <link rel="icon" href="${c.staticurl}hgicon.png" type="image/png" />
9 <meta name="robots" content="index, nofollow"/>
6 <meta name="robots" content="index, nofollow"/>
10 <link rel="stylesheet" href="${c.staticurl}style-monoblue.css" type="text/css" />
7 <link rel="stylesheet" href="${c.staticurl}style-monoblue.css" type="text/css" />
11 <title>${next.title()}</title>
8 <title>${next.title()}</title>
12 ${self.js()}
9 ${self.js()}
13 </head>
10 </head>
14
11
15 <body>
12 <body>
16 <div id="container">
13 <div id="container">
17 <div class="page-header">
14 <div class="page-header">
18 <h1>
15 <h1>
19 ${next.breadcrumbs()}
16 ${next.breadcrumbs()}
20 </h1>
17 </h1>
21 <ul class="page-nav">
18 <ul class="page-nav">
22 ${next.page_nav()}
19 ${next.page_nav()}
23 </ul>
20 </ul>
24 </div>
21 </div>
25 ${next.main()}
22 ${next.main()}
26 <div class="page-footer">
23 <div class="page-footer">
27 Mercurial App &copy; 2010
24 Mercurial App &copy; 2010
28 </div>
25 </div>
29
26
30 <div id="powered-by">
27 <div id="powered-by">
31 <p>
28 <p>
32 <a href="http://mercurial.selenic.com/" title="Mercurial">
29 <a href="http://mercurial.selenic.com/" title="Mercurial">
33 <img src="${c.staticurl}hglogo.png" width="75" height="90" alt="mercurial"/></a>
30 <img src="${c.staticurl}hglogo.png" width="75" height="90" alt="mercurial"/></a>
34 </p>
31 </p>
35 </div>
32 </div>
36
33
37 <div id="corner-top-left"></div>
34 <div id="corner-top-left"></div>
38 <div id="corner-top-right"></div>
35 <div id="corner-top-right"></div>
39 <div id="corner-bottom-left"></div>
36 <div id="corner-bottom-left"></div>
40 <div id="corner-bottom-right"></div>
37 <div id="corner-bottom-right"></div>
41
38
42 </div>
39 </div>
43 </body>
40 </body>
44 </html>
41 </html>
45
42
46
43
47 <%def name="js()">
44 <%def name="js()">
48 <script type="text/javascript" src="/js/yui/utilities/utilities.js"></script>
45 <script type="text/javascript" src="/js/yui/utilities/utilities.js"></script>
49 </%def> No newline at end of file
46 </%def>
@@ -1,58 +1,60 b''
1 ## -*- coding: utf-8 -*-
1 ## -*- coding: utf-8 -*-
2
2 <%!
3 from pylons_app.lib import filters
4 %>
3 <%inherit file="base/base.html"/>
5 <%inherit file="base/base.html"/>
4 <%def name="title()">
6 <%def name="title()">
5 ${c.repos_prefix} Mercurial Repositories
7 ${c.repos_prefix} Mercurial Repositories
6 </%def>
8 </%def>
7 <%def name="breadcrumbs()">
9 <%def name="breadcrumbs()">
8 ${c.repos_prefix} Mercurial Repositories
10 ${c.repos_prefix} Mercurial Repositories
9 </%def>
11 </%def>
10 <%def name="page_nav()">
12 <%def name="page_nav()">
11 <li class="current">${_('Home')}</li>
13 <li class="current">${_('Home')}</li>
12 <li>${h.link_to(u'Admin',h.url('admin_home'))}</li>
14 <li>${h.link_to(u'Admin',h.url('admin_home'))}</li>
13 </%def>
15 </%def>
14 <%def name="main()">
16 <%def name="main()">
15 <%def name="get_sort(name)">
17 <%def name="get_sort(name)">
16 <%name_slug = name.lower().replace(' ','_') %>
18 <%name_slug = name.lower().replace(' ','_') %>
17 %if name_slug == c.cs_slug:
19 %if name_slug == c.cs_slug:
18 <span style="font-weight: bold;color:#006699">${name}</span>
20 <span style="font-weight: bold;color:#006699">${name}</span>
19 %else:
21 %else:
20 <span style="font-weight: bold">${name}</span>
22 <span style="font-weight: bold">${name}</span>
21 %endif
23 %endif
22
24
23 <a href="?sort=${name_slug}">&darr;</a>
25 <a href="?sort=${name_slug}">&darr;</a>
24 <a href="?sort=-${name_slug}">&uarr;</a>
26 <a href="?sort=-${name_slug}">&uarr;</a>
25
27
26 </%def>
28 </%def>
27 <table>
29 <table>
28 <tr>
30 <tr>
29 <td>${get_sort(_('Name'))}</td>
31 <td>${get_sort(_('Name'))}</td>
30 <td>${get_sort(_('Description'))}</td>
32 <td>${get_sort(_('Description'))}</td>
31 <td>${get_sort(_('Last change'))}</td>
33 <td>${get_sort(_('Last change'))}</td>
32 <td>${get_sort(_('Tip'))}</td>
34 <td>${get_sort(_('Tip'))}</td>
33 <td>${get_sort(_('Contact'))}</td>
35 <td>${get_sort(_('Contact'))}</td>
34 <td></td>
36 <td></td>
35 <td></td>
37 <td></td>
36 </tr>
38 </tr>
37 %for cnt,repo in enumerate(c.repos_list):
39 %for cnt,repo in enumerate(c.repos_list):
38 <tr class="parity${cnt%2}">
40 <tr class="parity${cnt%2}">
39 <td>${h.link(repo['name'],h.url('summary_home',repo_name=repo['name']))}</td>
41 <td>${h.link(repo['name'],h.url('summary_home',repo_name=repo['name']))}</td>
40 <td>${repo['description']}</td>
42 <td>${repo['description']}</td>
41 <td>${repo['last_change']|n,self.f.age}</td>
43 <td>${repo['last_change']|n,filters.age}</td>
42 <td>r${repo['rev']}:<a href="/${repo['name']}/rev/${repo['tip']}/">${repo['tip']}</a></td>
44 <td>r${repo['rev']}:<a href="/${repo['name']}/rev/${repo['tip']}/">${repo['tip']}</a></td>
43 <td>${repo['contact']}</td>
45 <td>${repo['contact']}</td>
44 <td class="indexlinks">
46 <td class="indexlinks">
45 %for archive in repo['repo_archives']:
47 %for archive in repo['repo_archives']:
46 <a href="/${repo['name']}/archive/${archive['node']}${archive['extension']}">${archive['type']}</a>
48 <a href="/${repo['name']}/archive/${archive['node']}${archive['extension']}">${archive['type']}</a>
47 %endfor
49 %endfor
48 </td>
50 </td>
49 <td>
51 <td>
50 <div class="rss_logo">
52 <div class="rss_logo">
51 <a href="/${repo['name']}/rss-log">RSS</a>
53 <a href="/${repo['name']}/rss-log">RSS</a>
52 <a href="/${repo['name']}/atom-log">Atom</a>
54 <a href="/${repo['name']}/atom-log">Atom</a>
53 </div>
55 </div>
54 </td>
56 </td>
55 </tr>
57 </tr>
56 %endfor
58 %endfor
57 </table>
59 </table>
58 </%def>
60 </%def>
@@ -1,95 +1,97 b''
1 <%inherit file="base/base.html"/>
1 <%inherit file="base/base.html"/>
2
2 <%!
3 from pylons_app.lib import filters
4 %>
3 <%def name="title()">
5 <%def name="title()">
4 ${_('Repository managment')}
6 ${_('Repository managment')}
5 </%def>
7 </%def>
6 <%def name="breadcrumbs()">
8 <%def name="breadcrumbs()">
7 ${h.link_to(u'Home',h.url('/'))}
9 ${h.link_to(u'Home',h.url('/'))}
8 /
10 /
9 ${h.link_to(c.repo_name,h.url('summary_home',repo_name=c.repo_name))}
11 ${h.link_to(c.repo_name,h.url('summary_home',repo_name=c.repo_name))}
10 /
12 /
11 ${_('summary')}
13 ${_('summary')}
12 </%def>
14 </%def>
13 <%def name="page_nav()">
15 <%def name="page_nav()">
14 <form action="log">
16 <form action="log">
15 <dl class="search">
17 <dl class="search">
16 <dt><label>Search: </label></dt>
18 <dt><label>Search: </label></dt>
17 <dd><input type="text" name="rev" /></dd>
19 <dd><input type="text" name="rev" /></dd>
18 </dl>
20 </dl>
19 </form>
21 </form>
20
22
21 <ul class="page-nav">
23 <ul class="page-nav">
22 <li class="current">summary</li>
24 <li class="current">${_('summary')}</li>
23 <li><a href="shortlog">shortlog</a></li>
25 <li>${h.link(_('shortlog'),h.url('shortlog_home',repo_name=c.repo_name))}</li>
24 <li><a href="log">changelog</a></li>
26 <li><a href="log">changelog</a></li>
25 <li><a href="graph/{node|short}">graph</a></li>
27 <li><a href="graph/{node|short}">graph</a></li>
26 <li><a href="tags">tags</a></li>
28 <li><a href="tags">tags</a></li>
27 <li><a href="branches">branches</a></li>
29 <li><a href="branches">branches</a></li>
28 <li><a href="file/{node|short}">files</a></li>
30 <li><a href="file/{node|short}">files</a></li>
29 </ul>
31 </ul>
30 </%def>
32 </%def>
31 <%def name="main()">
33 <%def name="main()">
32
34
33 <h2 class="no-link no-border">${_('Mercurial Repository Overview')}</h2>
35 <h2 class="no-link no-border">${_('Mercurial Repository Overview')}</h2>
34 <dl class="overview">
36 <dl class="overview">
35 <dt>${_('name')}</dt>
37 <dt>${_('name')}</dt>
36 <dd>${c.repo_info.name}</dd>
38 <dd>${c.repo_info.name}</dd>
37 <dt>${_('description')}</dt>
39 <dt>${_('description')}</dt>
38 <dd>${c.repo_info.description}</dd>
40 <dd>${c.repo_info.description}</dd>
39 <dt>${_('contact')}</dt>
41 <dt>${_('contact')}</dt>
40 <dd>${c.repo_info.contact}</dd>
42 <dd>${c.repo_info.contact}</dd>
41 <dt>${_('last change')}</dt>
43 <dt>${_('last change')}</dt>
42 <dd>${c.repo_info.last_change|n,self.f.rfc822date} - ${c.repo_info.last_change|n,self.f.age}</dd>
44 <dd>${c.repo_info.last_change|n,filters.rfc822date} - ${c.repo_info.last_change|n,filters.age}</dd>
43 <dt>${_('url')}</dt>
45 <dt>${_('url')}</dt>
44 <dd><pre>$ hg clone <a href="${c.clone_repo_url}">${c.clone_repo_url}</a></pre></dd>
46 <dd><pre>$ hg clone <a href="${c.clone_repo_url}">${c.clone_repo_url}</a></pre></dd>
45 <dt>${_('Download')}</dt>
47 <dt>${_('Download')}</dt>
46 <dd>
48 <dd>
47 %for archive in c.repo_info._get_archives():
49 %for archive in c.repo_info._get_archives():
48 | <a href="/${c.repo_info.name}/archive/${archive['node']}${archive['extension']}">
50 | <a href="/${c.repo_info.name}/archive/${archive['node']}${archive['extension']}">
49 ${c.repo_info.name}.${archive['type']}
51 ${c.repo_info.name}.${archive['type']}
50 </a>
52 </a>
51 %endfor
53 %endfor
52 |
54 |
53 </dd>
55 </dd>
54 </dl>
56 </dl>
55
57
56 <h2><a href="{url}shortlog">Changes</a></h2>
58 <h2><a href="{url}shortlog">Changes</a></h2>
57 <table>
59 <table>
58 %for cnt,cs in enumerate(c.repo_changesets):
60 %for cnt,cs in enumerate(c.repo_changesets):
59 <tr class="parity${cnt%2}">
61 <tr class="parity${cnt%2}">
60 <td>${cs._ctx.date()|n,self.f.age}</td>
62 <td>${cs._ctx.date()|n,filters.age}</td>
61 <td>${cs.author}</td>
63 <td>${cs.author}</td>
62 <td>${h.link_to(cs.message,h.url('rev/'+str(cs._ctx)))}</td>
64 <td>${h.link_to(cs.message,h.url('rev/'+str(cs._ctx)))}</td>
63 <td class="nowrap">
65 <td class="nowrap">
64 ${h.link_to(_('changeset'),h.url('file/'+str(cs._ctx)))}
66 ${h.link_to(_('changeset'),h.url('file/'+str(cs._ctx)))}
65 |
67 |
66 ${h.link_to(_('files'),h.url('file/'+str(cs._ctx)))}
68 ${h.link_to(_('files'),h.url('file/'+str(cs._ctx)))}
67 </td>
69 </td>
68 </tr>
70 </tr>
69 %endfor
71 %endfor
70 <tr class="light">
72 <tr class="light">
71 <td colspan="4"><a class="list" href="shortlog">...</a></td>
73 <td colspan="4"><a class="list" href="shortlog">...</a></td>
72 </tr>
74 </tr>
73 </table>
75 </table>
74
76
75 <h2><a href="{url}tags">${_('Tags')}</a></h2>
77 <h2><a href="{url}tags">${_('Tags')}</a></h2>
76 <table>
78 <table>
77 %for tag in c.repo_tags:
79 %for tag in c.repo_tags:
78 ${tag}
80 ${tag}
79 %endfor
81 %endfor
80 <tr class="light">
82 <tr class="light">
81 <td colspan="3"><a class="list" href="tags">...</a></td>
83 <td colspan="3"><a class="list" href="tags">...</a></td>
82 </tr>
84 </tr>
83 </table>
85 </table>
84
86
85 <h2 class="no-link">Branches</h2>
87 <h2 class="no-link">Branches</h2>
86 <table>
88 <table>
87 %for branch in c.repo_branches:
89 %for branch in c.repo_branches:
88 ${branch}
90 ${branch}
89 %endfor
91 %endfor
90 <tr class="light">
92 <tr class="light">
91 <td colspan="4"><a class="list" href="branches">...</a></td>
93 <td colspan="4"><a class="list" href="branches">...</a></td>
92 </tr>
94 </tr>
93 </table>
95 </table>
94
96
95 </%def> No newline at end of file
97 </%def>
General Comments 0
You need to be logged in to leave comments. Login now