Turbogears2 migration: paging failures in changelog
Mads Kiilerich
mads at kiilerich.com
Sun Jul 17 22:52:08 UTC 2016
On 07/15/2016 09:32 PM, Thomas De Schampheleire wrote:
> On Tue, Jul 12, 2016 at 12:55 PM, Mads Kiilerich <mads at kiilerich.com> wrote:
>> On 06/30/2016 08:11 PM, Thomas De Schampheleire wrote:
>>
>> I'm now looking at the other tests. One specific failure is easy to
>> reproduce, either:
>>
>> $ py.test kallithea/tests/functional/test_changelog.py
>>
>> or interactively by launching kallithea with the test.ini:
>>
>> $ paster serve kallithea/tests/test.ini
>> then browsing to one of either repos vce_test_hg/git and then to
>> 'Changelog'.
>>
>> This renders a 500 Server Error without traceback or further information.
>> I was able to zoom in on the problem with manual traces, and found it
>> is related to pagination. If I remove the pagination block from the
>> template (see patch below) then the Changelog page works fine (except
>> for pagination, of course).
>>
>> diff --git a/kallithea/templates/changelog/changelog.html
>> b/kallithea/templates/changelog/changelog.html
>> --- a/kallithea/templates/changelog/changelog.html
>> +++ b/kallithea/templates/changelog/changelog.html
>> @@ -160,7 +160,6 @@
>> </div>
>>
>> <div class="pagination-wh pagination-left">
>> - ${c.pagination.pager('$link_previous ~2~ $link_next')}
>> </div>
>> </div>
>> </div>
>>
>>
>> However, it is unclear to me how to proceed. What is the problem with
>> this pagination, why is it a problem under Turbogears2 and not under
>> Pylons? How to see more details about the failures?
>>
>>
>> I think that I am missing some debugging skills in python - Kallithea
>> - mako - Turbogears2. I would be grateful if others with more
>> experience could help me on that. In this problem, it looks like there
>> is some kind of template rendering problem, but without any hint in
>> the logs.
>>
>> Thanks,
>> Thomas
I tried to test it but encountered some problems trying to follow
https://bitbucket.org/conservancy/kallithea/wiki/Turbogears2Migration.md .
It seems like it really wants "setup.py develop"? "pip install -e ."
doesn't work? Do you know ... what is the story around that?
Also, it took me a while to figure out that even though the config file
and database must be created with another installation, the ini file
must be changed to use sqlalchemy.url without db1 . Any other changes to
watch out for?
Please consider clarifying the wiki page.
Anyway, I do get a nice traceback on stdout when encountering the 500
from the pager:
File "/home/mk/kallithea-tg/kallithea/controllers/changelog.py", line
176, in index
return render('changelog/changelog.html')
File "/home/mk/kallithea-tg/kallithea/lib/base.py", line 65, in render
return render_template({'url': url}, 'mako', template_path)
File
"/home/mk/kallithea-venv/lib/python2.7/site-packages/tg/render.py", line
212, in render
kwargs['result'] = render_function(template_name, tg_vars, **kwargs)
File
"/home/mk/kallithea-venv/lib/python2.7/site-packages/tg/renderers/mako.py",
line 126, in __call__
cache_type=cache_type, cache_expire=cache_expire)
File
"/home/mk/kallithea-venv/lib/python2.7/site-packages/tg/render.py", line
278, in cached_template
return render_func()
File
"/home/mk/kallithea-venv/lib/python2.7/site-packages/tg/renderers/mako.py",
line 123, in render_template
return Markup(template.render_unicode(**template_vars))
File
"/home/mk/kallithea-venv/lib/python2.7/site-packages/Mako-1.0.0-py2.7.egg/mako/template.py",
line 452, in render_unicode
as_unicode=True)
File
"/home/mk/kallithea-venv/lib/python2.7/site-packages/Mako-1.0.0-py2.7.egg/mako/runtime.py",
line 803, in _render
**_kwargs_for_callable(callable_, data))
File
"/home/mk/kallithea-venv/lib/python2.7/site-packages/Mako-1.0.0-py2.7.egg/mako/runtime.py",
line 835, in _render_context
_exec_template(inherit, lclcontext, args=args, kwargs=kwargs)
File
"/home/mk/kallithea-venv/lib/python2.7/site-packages/Mako-1.0.0-py2.7.egg/mako/runtime.py",
line 860, in _exec_template
callable_(context, *args, **kwargs)
File "_base_root_html", line 203, in render_body
File "_base_base_html", line 41, in render_body
File "changelog_changelog_html", line 218, in render_main
File "/home/mk/kallithea-tg/kallithea/lib/helpers.py", line 1020, in
pager
result = re.sub(r'~(\d+)~', self._range, format)
File "/usr/lib64/python2.7/re.py", line 155, in sub
return _compile(pattern, flags).sub(repl, string, count)
File "/home/mk/kallithea-tg/kallithea/lib/helpers.py", line 977, in
_range
nav_items.append(self._pagerlink(thispage, text_))
File
"/home/mk/kallithea-venv/lib/python2.7/site-packages/WebHelpers-1.3-py2.7.egg/webhelpers/paginate.py",
line 841, in _pagerlink
link_url = url_generator(**link_params)
File
"/home/mk/kallithea-venv/lib/python2.7/site-packages/Routes-1.13-py2.7.egg/routes/util.py",
line 269, in url_for
(args, kargs))
GenerationException: url_for could not generate URL. Called with args:
() {'page': 2}
One reason I get a nice traceback might be that I use pip for installing
as much as possible and thus don't get the annoying eggs but readable
python.
It seems like the problem is that this helpers.py pager function ends up
in webhelpers/paginate.py which has some pylons specific code and uses
url_generator = pylons.url.current when using Pylons.
It can apparently be worked around with
--- a/kallithea/lib/helpers.py
+++ b/kallithea/lib/helpers.py
@@ -911,6 +911,10 @@ class Page(_Page):
Custom pager to match rendering style with YUI paginator
"""
+ def __init__(self, *args, **kwargs):
+ kwargs.setdefault('url', url.current)
+ _Page.__init__(self, *args, **kwargs)
+
def _get_pos(self, cur_page, max_page, items):
edge = (items / 2) + 1
if (cur_page <= edge):
@@ -1050,11 +1054,12 @@ class Page(_Page):
class RepoPage(Page):
def __init__(self, collection, page=1, items_per_page=20,
- item_count=None, url=None, **kwargs):
+ item_count=None, url=url.current, **kwargs):
"""Create a "RepoPage" instance. special pager for paging
repository
"""
+ # FIXME: Why not calling baseclass __init__?
self._url_generator = url
# Safe the kwargs class-wide so they can be used in the
pager() method
This could probably just be upstreamed now, already while still using
Pylons.
Closing comment: This made me look at the Page code. Now I feel sad. But
the TG stuff generally seems to work. That makes me happy.
/Mads
More information about the kallithea-general
mailing list