Here's perhaps a better example of when the problem occurs. I've posted the needed files on pastebin.
views/default/index.html http://pastebin.com/eqyegpQH views/bare.html http://pastebin.com/jT8hEASR views/right-col.html http://pastebin.com/ziL9V55p views/base.html http://pastebin.com/6R1uTV8N So, if you modify template.py, the issue is fixed. Or if you replace {{ include 'right-col.html' }} with the contents of 'right-col.html', then it also works. Note that this is just a silly example and as such I'm not even sure where the side-nav and live-nav "menus" would appear, but the point is that they don't. PS: I'm testing HTML5 stuff, hence the <nav> and <section> elements, but that should have absolutely no bearing on the template parsing. -Kas On May 5, 2:53 pm, kasapo <[email protected]> wrote: > First off -- let me say that my usage of the templating in this case > is somewhat peculiar, and if they are not supposed to work like this, > that is fine. > > After reviewing my app, I only have one instance of code like this, > and it is "vestigial" and should be removed anyhow. But I thought it > strange that it broke, and I'm wondering if I might have another > include/block problem. > > Solution: > > diff -r fe58378e989b gluon/template.py > --- a/gluon/template.py Wed May 04 18:58:40 2011 -0500 > +++ b/gluon/template.py Thu May 05 14:46:21 2011 -0500 > @@ -454,7 +454,8 @@ > writer = self.writer, > delimiters = self.delimiters) > > - content.append(str(t.content)) > + content.append(t.content) > + #content.append(str(t.content)) > > def extend(self, filename): > """ > > Read on for how I got there and a strange LDAP_auth issue... > > On May 5, 1:37 pm, Massimo Di Pierro <[email protected]> > wrote: > > > Hello kasapo, > > > I do not completely follow you code. If I do, you have two blocks. The > > code included in one of the blocks seems to extend a block included > > in another block. I am unsure this is supposed to work. Anyway, let's > > try figure out what has changed that broke and then we may be able to > > revert the previous behavior. > > So I have this structure: > > bare (defines html, head, style, script (jquery includes), body > sections, and some containing blocks) -- ancestor to almost all > templates > > right-col (included by bare, defines blocks which base will extend -- > base extends bare, bare includes right-col so therefore base should be > able to see blocks defined by bare) > > base (defines styles, background, etc -- the base template for most > things -- defines actual markup for blocks which are DEFINED in right- > col) > > page (extends base, does not use blocks -- the menu rendered on the > page view is defined in base inside of a block that is defined in bare > via right-col include) > page-no-side-nav ( extends base, uses {{ block right-col }}{{end}} to > delete the right column ) > > > Can you try: > > > hg revert -r 1488 gluon/template.py > ~/Downloads/template.diff > > Sadly, I am on RHEL and mercurial isn't present... so I will use my > local machine (Macintosh). > > First off, I use LDAP authentication for a login method, and (this > happened on 1.95.1 on RHEL server as well) I get this error: > > Traceback (most recent call last): > File "/Users/csburreson/web2py/gluon/restricted.py", line 181, in > restricted > exec ccode in environment > File "/Users/csburreson/web2py/applications/icecube/models/ > 0_init.py", line 42, in <module> > from gluon.contrib.login_methods.ldap_auth import ldap_auth > File "/Users/csburreson/web2py/gluon/custom_import.py", line 80, in > _web2py__import__ > return _old__import__(name, globals, locals, fromlist, level) > File "/Users/csburreson/web2py/gluon/contrib/login_methods/ > ldap_auth.py", line 5, in <module> > except e: > NameError: name 'e' is not defined > > So I just copied the working ldap_auth.py from the 1.89 version of > web2py... problem solved (could this somehow create an issue with > templates?) > > Then I realized I did not have python-ldap installed, so I did > easy_install python-ldap and all was good. > > [I did exactly these same things earlier today when installing the > TEST server] > > SO, now the application is again working, and I check out my code into > the applications folder using SVN. > > The menu is not present :( > > Then I run : > > hg revert -r 1488 gluon/template.py > > And check my app and the side menu IS present > > So, I go back to 1.95.1 (with the exception of the old ldap_auth.py > from 1.89) > > and try > > hg diff -r 1488 gluon/template.py > > This bugger seems to be the culprit: > > @@ -455,7 +454,7 @@ > ... > + content.append(str(t.content)) > - content.append(t.content) > > After changing it, i verified that I had not changed anything else by > re-diffing the file against the repo: > > bash-3.2$ hg diff gluon/template.py > diff -r fe58378e989b gluon/template.py > --- a/gluon/template.py Wed May 04 18:58:40 2011 -0500 > +++ b/gluon/template.py Thu May 05 14:46:21 2011 -0500 > @@ -454,7 +454,8 @@ > writer = self.writer, > delimiters = self.delimiters) > > - content.append(str(t.content)) > + content.append(t.content) > + #content.append(str(t.content)) > > def extend(self, filename): > """ > > So, that seems to be the problem. > > Is there a case where not explicitly calling str() on the content > causes something else undesirable to happen? > > Well, thanks very much Massimo, mystery solved. I'll leave it to you > whether this is actually an issue that should be patched or an > unnecessary mis-use of templates and {{block}}s > > I plan to remove the include of right-col since in the end I really > don't need it. > > -Kasapo > > > > > > > > > Dow it work? > > > If yes, download the latest web2py again and do > > > hg diff -r 1488 gluon/template.py > ~/Downloads/template.diff > > > you will see what has changed in the file. mostly comments. > > Try manually revert each of the changes. Which ones causes the > > problem? > > > On May 5, 11:55 am, kasapo <[email protected]> wrote: > > > > Hi all, > > > > I recently setup another instance of web2py for testing on a new > > > system, and noticed something strange with blocks. > > > > Basically, I have three slightly different versions of web2py running: > > > 1.89.3 (DEMO server), 1.91.6 (DEV server) and 1.95.1 which I just > > > installed with the auto-upgrade feature (TEST server -- soon to be the > > > Production server). > > > > The problem is, i have an include directive inside of a block/end > > > block pair. The included file (right-col.html) then goes on to define > > > a couple other blocks (for navigation mainly) which are filled in by > > > different templates associated with different areas of the site. > > > > However, templates which extend the file which includes right-col.html > > > do not have access to BLOCKs that are defined INSIDE of right- > > > col.html, but this behavior occurs only on the TEST server (v1.95.1) > > > > This code WORKED before 1.95.1 (on DEMO and DEV): > > > > ################# > > > # views/bare.html > > > ################# > > > <html> > > > ... (abbreviated for brevity's sake) > > > <div id='content'> > > > {{ block content }}{{ end }} > > > </div> > > > > {{ block right-col }} > > > {{ include 'base/right-col.html' }} > > > {{ end }} > > > > ... > > > </html> > > > #EOF bare.html > > > > ####################### > > > # views/base/right-col.html > > > ####################### > > > <div id='right-col'> > > > {{ block nav }} > > > {{ end }} > > > > <section id='social'> > > > {{ block social }}{{end}} > > > </section> > > > > </div> > > > #EOF > > > > ################# > > > # views/base.html > > > ################# > > > {{ extends 'bare.html }} > > > > {{ block content }} > > > {{ include }} > > > {{ end }} > > > > <!-- defines stuff inside of right-col --> > > > {{ block nav }} > > > <nav id='side-nav'> > > > {{=MENU(get_menu(request.controller) or standard_menu)}} > > > </nav> > > > {{ end }} > > > > {{ block social }} > > > ... stuff to do with social networking > > > {{ end }} > > > #EOF > > > > #################### > > > # view/some-page.html > > > #################### > > > {{ extends 'base.html' }} > > > > Blah blah blah. Wait, my side menu is missing. Crap. > > > > But the outline of the sidebar is still there since div#right-col is > > > present.... > > > > #EOF > > > > What I had to do to get it to work with the TEST version was to take > > > away the include statement for right-col.html and move the contents of > > > the file inside the right-col block in bare.html. This works fine. > > > > The strange thing is that the <div id='right-col'><section > > > id='social'></section></div> (the markup in right-col.html) shows up > > > -- even if I wrap it in a block within the included file. The problem > > > is just that the template blocks defined in the right-col.html file > > > seem to be forgotten later on in the template. So even though > > > bare.html includes right-col, the base file, which extends bare, > > > cannot access the blocks defined in the right-col file. Thus, when > > > rendering "some-page" which extends "base", the contents of the right > > > column aren't included. > > > > So, the question: > > > > Is my usage of blocks improper? Or is this an undesired outcome of > > > code updates? > > > > I just checked the code.google.com page and did not see any issues, > > > open or closed, that mentioned anything about this. > > > > Thanks, > > > Faithful web2py user > > > > PS: > > > > I think the reason I did this was to be able to reuse HTML chunks > > > which might be included in different places on the page, or even among > > > different templates from the site (e.g. bare.html is the ancestor of > > > most public pages, but user.html is the ancestor of another, and both > > > should be able to use right-col.html). > > > > Also, I would love to see the include directive supported within for > > > loops, though I think I see why it is not. I think the include > > > directives are always handled first and the file is included before > > > the template is parsed, thus template variables are not available and > > > loops cannot be iterated. Oh well.

