Re: Conditionally render viewlet

Jonathan Bowlas <j.bowlas-hclig2XLE9Zaa/[email protected]> Wed, 8 Jun 2011 12:35:26 +0100
Newsgroups gmane.comp.web.zope.silva.devel
Message-ID <[email protected]>
Sorry but it's still not working, I did this:

class LeftColumn(silvaviews.ViewletManager):
    """Left Content Area
    """
    def filter(self):
         viewlets =3D super(LeftColumn, self).filter()
         return [v for v in viewlets if v.available()]

But it returns this traceback:

2011-06-08 12:30:35,868 ERROR [infrae.wsgi]
Error while rendering error message
Object class: Products.Silva.Root.Root
Object path: /silva
Request URL: http://localhost:8080/silva/test/@@index.html
Request method: GET
User: admin
User-agent: Mozilla/5.0 (Windows NT 6.0; rv:2.0.1) Gecko/20100101 Firefox/4=
.0.1
Refer: http://localhost:8080/silva/test
Traceback (innermost last):
  Module infrae.wsgi.publisher, line 183, in error
  Module silva.core.views.views, line 73, in __call__
  Module infrae.layout.components, line 105, in __call__
   - Published class: silva.core.layout.porto.errors.OtherErrorPage
   - Object path: /silva
   - Object type: Silva Root
  Module infrae.layout.components, line 77, in __call__
  Module infrae.layout.components, line 70, in render
  Module infrae.layout.components, line 67, in _render_template
  Module five.grok.components, line 133, in render
  Module zope.pagetemplate.pagetemplate, line 113, in pt_render
  Module zope.tal.talinterpreter, line 271, in __call__
  Module zope.tal.talinterpreter, line 343, in interpret
  Module zope.tal.talinterpreter, line 531, in do_optTag_tal
  Module zope.tal.talinterpreter, line 513, in no_tag
  Module zope.tal.talinterpreter, line 343, in interpret
  Module zope.tal.talinterpreter, line 742, in do_insertStructure_tal
  Module Products.PageTemplates.Expressions, line 220, in evaluateStructure
  Module zope.tales.tales, line 696, in evaluate
   - URL: c:\silva-2.3.1\eggs\silva.core.layout-2.3.2-py2.6.egg\silva\core\=
layout\porto\porto_templates\mainlayout.pt
   - Line 29, Column 4
   - Expression: <StringExpr u'layout'>
   - Names:
      {'args': (),
       'container': <Root at /silva>,
       'context': <Root at /silva>,
       'default': <object object at 0x01AD1720>,
       'here': <Root at /silva>,
       'layout':
<silvatheme.uclcorporateidentity.uclcorporateidentity.MainErrorLayout
object at 0x0722CE10>,
       'loop': {},
       'nothing': None,
       'options': {},
       'repeat': <Products.PageTemplates.Expressions.SafeMapping
object at 0x0721D660>,
       'request': <WSGIRequest,
URL=3Dhttp://localhost:8080/silva/test/@@index.html>,
       'root': <Application at >,
       'static': <silva.resourceinclude.resource.ResourceView object
at 0x0722C750>,
       'template':
<Products.Five.browser.pagetemplatefile.ViewPageTemplateFile object at
0x06364A90>,
       'traverse_subpath': [],
       'user': <User 'admin'>,
       'view': <silva.core.layout.porto.errors.OtherErrorPage object
at 0x06A63BF0>,
       'views': <Products.Five.browser.pagetemplatefile.ViewMapper
object at 0x0723A6D0>}
  Module zope.contentprovider.tales, line 80, in __call__
  Module grokcore.viewlet.components, line 80, in render
  Module five.grok.components, line 133, in render
  Module zope.pagetemplate.pagetemplate, line 113, in pt_render
  Module zope.tal.talinterpreter, line 271, in __call__
  Module zope.tal.talinterpreter, line 343, in interpret
  Module zope.tal.talinterpreter, line 533, in do_optTag_tal
  Module zope.tal.talinterpreter, line 518, in do_optTag
  Module zope.tal.talinterpreter, line 513, in no_tag
  Module zope.tal.talinterpreter, line 343, in interpret
  Module zope.tal.talinterpreter, line 852, in do_condition
  Module zope.tal.talinterpreter, line 343, in interpret
  Module zope.tal.talinterpreter, line 531, in do_optTag_tal
  Module zope.tal.talinterpreter, line 513, in no_tag
  Module zope.tal.talinterpreter, line 343, in interpret
  Module zope.tal.talinterpreter, line 742, in do_insertStructure_tal
  Module Products.PageTemplates.Expressions, line 220, in evaluateStructure
  Module zope.tales.tales, line 696, in evaluate
   - URL: c:\silva-2.3.1\src\silvatheme.uclcorporateidentity\silvatheme\ucl=
corporateidentity\uclcorporateidentity_templates\layout.pt
   - Line 5, Column 8
   - Expression: <StringExpr u'threecolumn'>
   - Names:
      {'args': (),
       'container': <Root at /silva>,
       'context': <Root at /silva>,
       'default': <object object at 0x01AD1720>,
       'here': <Root at /silva>,
       'layout':
<silvatheme.uclcorporateidentity.uclcorporateidentity.MainErrorLayout
object at 0x0722CE10>,
       'loop': {},
       'nothing': None,
       'options': {},
       'provider':
<silvatheme.uclcorporateidentity.uclcorporateidentity.Layout object at
0x072033F0>,
       'repeat': <Products.PageTemplates.Expressions.SafeMapping
object at 0x0721D690>,
       'request': <WSGIRequest,
URL=3Dhttp://localhost:8080/silva/test/@@index.html>,
       'root': <Application at >,
       'static': <silva.resourceinclude.resource.ResourceView object
at 0x07234D30>,
       'template':
<Products.Five.browser.pagetemplatefile.ViewPageTemplateFile object at
0x063EF510>,
       'traverse_subpath': [],
       'user': <User 'admin'>,
       'view': <silva.core.layout.porto.errors.OtherErrorPage object
at 0x06A63BF0>,
       'viewletmanager':
<silvatheme.uclcorporateidentity.uclcorporateidentity.Layout object at
0x072033F0>,
       'views': <Products.Five.browser.pagetemplatefile.ViewMapper
object at 0x07234DB0>}
  Module zope.contentprovider.tales, line 80, in __call__
  Module grokcore.viewlet.components, line 80, in render
  Module five.grok.components, line 133, in render
  Module zope.pagetemplate.pagetemplate, line 113, in pt_render
  Module zope.tal.talinterpreter, line 271, in __call__
  Module zope.tal.talinterpreter, line 343, in interpret
  Module zope.tal.talinterpreter, line 531, in do_optTag_tal
  Module zope.tal.talinterpreter, line 513, in no_tag
  Module zope.tal.talinterpreter, line 343, in interpret
  Module zope.tal.talinterpreter, line 742, in do_insertStructure_tal
  Module Products.PageTemplates.Expressions, line 220, in evaluateStructure
  Module zope.tales.tales, line 696, in evaluate
   - URL: c:\silva-2.3.1\src\silvatheme.uclcorporateidentity\silvatheme\ucl=
corporateidentity\uclcorporateidentity_templates\threecolumn.pt
   - Line 6, Column 12
   - Expression: <StringExpr u'leftcolumn'>
   - Names:
      {'args': (),
       'container': <Root at /silva>,
       'context': <Root at /silva>,
       'default': <object object at 0x01AD1720>,
       'here': <Root at /silva>,
       'layout':
<silvatheme.uclcorporateidentity.uclcorporateidentity.MainErrorLayout
object at 0x0722CE10>,
       'loop': {},
       'nothing': None,
       'options': {},
       'provider':
<silvatheme.uclcorporateidentity.uclcorporateidentity.ThreeColumn
object at 0x07234ED0>,
       'repeat': <Products.PageTemplates.Expressions.SafeMapping
object at 0x0721D6F0>,
       'request': <WSGIRequest,
URL=3Dhttp://localhost:8080/silva/test/@@index.html>,
       'root': <Application at >,
       'static': <silva.resourceinclude.resource.ResourceView object
at 0x07234F30>,
       'template':
<Products.Five.browser.pagetemplatefile.ViewPageTemplateFile object at
0x063EF7D0>,
       'traverse_subpath': [],
       'user': <User 'admin'>,
       'view': <silva.core.layout.porto.errors.OtherErrorPage object
at 0x06A63BF0>,
       'viewletmanager':
<silvatheme.uclcorporateidentity.uclcorporateidentity.ThreeColumn
object at 0x07234ED0>,
       'views': <Products.Five.browser.pagetemplatefile.ViewMapper
object at 0x07234F50>}
  Module zope.contentprovider.tales, line 77, in __call__
  Module zope.viewlet.manager, line 104, in update
TypeError: filter() takes exactly 1 argument (2 given)

Any Ideas?


On 8 June 2011 11:43, Antonin AMAND <[email protected]> wrote:
>>> The viewlet still rendered even though theres no index_left.
>>> Then I checked the documentation here
>>> http://pypi.python.org/pypi/zope.viewlet, specifically the
>>> 'ConditionalViewletManager' section where it states that Viewlets have
>>> an 'available' attribute (not a method), so I tried setting available
>>> =3D False, =A0but still the viewlet rendered.
>
> You're right, Viewlet have no available method, I've been mistaken.
> What we usually do is this:
>
> In the viewlet manager we override the filters method :
>
> class MyViewletManager(...):
> =A0 ...
> =A0 def filter(self):
> =A0 =A0 =A0viewlets =3D super(MyViewletManager, self).filter()
> =A0 =A0 =A0return [v for v in viewlets if v.available()]
>
> Then define an available method on all viewlets of this ViewletManager.
>
> BTW, be carefull with hasattr(self.context, 'index_left'), it checks
> with acquisition.
>
> Antonin
> _______________________________________________
> silva-dev mailing list
> silva-dev-IAPFreCvJWM6s/[email protected]
> https://lists.infrae.com/mailman/listinfo/silva-dev
>



-- =

Jonathan Bowlas
Web Support Officer
Media Services
University College London
Email: j.bowlas-hclig2XLE9Zaa/[email protected]