[web2py] Re: problem with {{block}}s inside included files (v.1.95.1)

2011-05-05 Thread Massimo Di Pierro
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.

Can you try:

hg revert -r 1488 gluon/template.py  ~/Downloads/template.diff

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 kas...@gmail.com 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.


Re: [web2py] Re: problem with {{block}}s inside included files (v.1.95.1)

2011-05-05 Thread Thadeus Burgess
It should be possible to do this. The way templates handle include files has
been broken. This is what it should be doing

PARENT
LOAD include_filename
CREATE PARSE TREE
EXTEND PARSE TREE TO PARENT
CONTINUE

In effect, the entire tree of the included file gets grafted back onto the
parent tree as if the included file never existed.

tl;dr; Should work just fine, somethings broke, plz help fix!

--
Thadeus




On Thu, May 5, 2011 at 1:37 PM, Massimo Di Pierro 
massimo.dipie...@gmail.com wrote:

 uded in one of the blocks seems to extend a  block included
 in another block. I am unsure this is suppo



[web2py] Re: problem with {{block}}s inside included files (v.1.95.1)

2011-05-05 Thread kasapo
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 massimo.dipie...@gmail.com
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 

Re: [web2py] Re: problem with {{block}}s inside included files (v.1.95.1)

2011-05-05 Thread Thadeus Burgess
Take a look at the ``template.Content.__str__`` method, this is what is
responsible for flattening the tree.

Calling ``str()`` on any instance of Content effectively flattens it to
text, since there is only text in the parent tree, it has no knowledge of
any blocks that might have existed in the included tree.

The only point at which the tree should be flattened is at the very end of
the parsing when the entire tree is assembled.

--
Thadeus




On Thu, May 5, 2011 at 3:24 PM, Thadeus Burgess thade...@thadeusb.comwrote:

 Your code should work just fine kasapo, the template system was designed to
 do that.

 Someone at some point made a patch to the template that broke the way this
 is supposed to work.


 http://code.google.com/p/web2py/source/diff?spec=svnc6ff592d73ef81257a8d238a74b688c9b3a09360r=e6868622d71ec96947b4bb08a44c527c9722b062format=sidepath=/gluon/template.pyold_path=/gluon/template.pyold=8d5d7f6bd391d2e30888c2c9fc168c081d02877f

 Basically, instead of just copying the included templates tree into the
 parent templates tree, they changed it so it would flatten the tree to text,
 and just include the text into the parent tree. All contexts are lost when
 the tree gets flattened.

 --
 Thadeus





 On Thu, May 5, 2011 at 2:53 PM, kasapo kas...@gmail.com 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 massimo.dipie...@gmail.com
 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

[web2py] Re: problem with {{block}}s inside included files (v.1.95.1)

2011-05-05 Thread kasapo
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 kas...@gmail.com 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 massimo.dipie...@gmail.com
 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 @@
               

[web2py] Re: problem with {{block}}s inside included files (v.1.95.1)

2011-05-05 Thread Massimo Di Pierro
I have reverted the change the causes the problem (r1748). There must
have been a reason for the change but I do not remember it and there
is no detail in the log.

If anybody remembers why I changed:

-content.append(str(t.content))
+content.append(t.content)

in gluon/template.py in March 22, 2011.
This must have been a response to a bug report.
Please let me know.

Massimo



On May 5, 3:30 pm, kasapo kas...@gmail.com wrote:
 Here's perhaps a better example of when the problem occurs.

 I've posted the needed files on pastebin.

 views/default/index.htmlhttp://pastebin.com/eqyegpQH

 views/bare.htmlhttp://pastebin.com/jT8hEASR

 views/right-col.htmlhttp://pastebin.com/ziL9V55p

 views/base.htmlhttp://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 kas...@gmail.com 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 massimo.dipie...@gmail.com
  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