plonegovbr/brasil.gov.tiles

Ao adicionar uma notícia (collective.nitf) sem imagem num MediaCarouselTile, a capa quebra no IDG 1.0.5 e Internal Server Error no 1.1.3

idgserpro opened this issue · 8 comments

Como simular:

  • Num portal 1.0.5/1.1.3.1, crie um diretório comum, adicionando 5 notícias (collective.nitf), com uma dessas notícias não contendo imagem;
  • Na capa, adicione um tile do tipo "Media Carousel" na aba layout;
  • Na aba compor da capa, arraste esse diretório criado com as notícias (e uma sem imagem) para o "Media Carousel".

Isso quebra a capa no 1.0.5 ficando dessa forma:

selecao_111

Esse é o traceback do 1.0.5:

2016-01-18 11:58:41 ERROR plone.subrequest Error handling subrequest to http://localhost:8080/Plone/home/@@mediacarousel/a23be7a48b7b43479a20c0e30d767efc
Traceback (most recent call last):
  File "/home/user/.buildout/eggs/plone.subrequest-1.6.8-py2.7.egg/plone/subrequest/__init__.py", line 124, in subrequest
    bind=1)
  File "/home/user/.buildout/eggs/Zope2-2.13.22-py2.7.egg/ZPublisher/mapply.py", line 78, in mapply
    else: return object(*args)
  File "/home/user/.buildout/eggs/plone.tiles-1.2-py2.7.egg/plone/tiles/esi.py", line 56, in __call__
    return self.index(*args, **kwargs)
  File "/home/user/.buildout/eggs/Zope2-2.13.22-py2.7.egg/Products/Five/browser/pagetemplatefile.py", line 125, in __call__
    return self.im_func(im_self, *args, **kw)
  File "/home/user/.buildout/eggs/Zope2-2.13.22-py2.7.egg/Products/Five/browser/pagetemplatefile.py", line 59, in __call__
    sourceAnnotations=getattr(debug_flags, 'sourceAnnotations', 0),
  File "/home/user/.buildout/eggs/zope.pagetemplate-3.6.3-py2.7.egg/zope/pagetemplate/pagetemplate.py", line 132, in pt_render
    strictinsert=0, sourceAnnotations=sourceAnnotations
  File "/home/user/.buildout/eggs/five.pt-2.2.2-py2.7.egg/five/pt/engine.py", line 93, in __call__
    return self.template.render(**kwargs)
  File "/home/user/.buildout/eggs/z3c.pt-3.0.0a1-py2.7.egg/z3c/pt/pagetemplate.py", line 163, in render
    return base_renderer(**context)
  File "/home/user/.buildout/eggs/Chameleon-2.16-py2.7.egg/chameleon/zpt/template.py", line 258, in render
    return super(PageTemplate, self).render(**vars)
  File "/home/user/.buildout/eggs/Chameleon-2.16-py2.7.egg/chameleon/template.py", line 188, in render
    raise_with_traceback(exc, tb)
  File "/home/user/.buildout/eggs/Chameleon-2.16-py2.7.egg/chameleon/template.py", line 170, in render
    self._render(stream, econtext, rcontext)
  File "6a47dc29ea89b45238891fc12bb2b259.py", line 547, in render
  File "/home/user/.buildout/eggs/brasil.gov.tiles-1.0.5-py2.7.egg/brasil/gov/tiles/tiles/mediacarousel.py", line 126, in get_media_url
    url = scale.url
AttributeError: 'NoneType' object has no attribute 'url'

 - Expression: "python: view.get_media_url(item)"
 - Filename:   ... .7.egg/brasil/gov/tiles/tiles/templates/mediacarousel.pt
 - Location:   (line 39: col 48)
 - Source:     ... attributes="href python: view.get_media_url(item)">
                                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 - Arguments:  default: <object - at 0xb74b7820L>
               repeat: {...} (0)
               template: <ViewPageTemplateFile - at 0xb14d144cL>
               views: <ViewMapper - at 0xb1384f4cL>
               modules: <instance - at 0xb62fcb8cL>
               args: <tuple - at 0xb749102cL>
               results: <list - at 0xb2ea762cL>
               here: <ImplicitAcquisitionWrapper home at 0xb2fb857cL>
               user: <ImplicitAcquisitionWrapper - at 0xb2fb8b94L>
               nothing: <NoneType - at 0x81ad6b4>
               tile_id: a23be7a48b7b43479a20c0e30d767efc
               conf_fields: {...} (8)
               container: <ImplicitAcquisitionWrapper home at 0xb2fb857cL>
               field: uuids
               items: <list - at 0xb1b0a68cL>
               request: <instance - at 0xb14f378cL>
               wrapped_repeat: <SafeMapping - at 0xb2fa2324L>
               traverse_subpath: <list - at 0xb1384f8cL>
               item: <ImplicitAcquisitionWrapper noticia-sem-imagem at 0xb385470cL>
               loop: {...} (2)
               context: <ImplicitAcquisitionWrapper home at 0xb2fb857cL>
               view: <MediaCarouselTile mediacarousel at 0xb2ea10ccL>
               collection: <ImplicitAcquisitionWrapper carrossel at 0xb2f5caccL>
               translate: <function translate at 0xb15a7cdcL>
               root: <ImplicitAcquisitionWrapper Zope at 0xb30044dcL>
               options: {...} (0)
               target_language: <NoneType - at 0x81ad6b4>
2016-01-18 11:58:41 ERROR plone.transformchain Unexpected error whilst trying to apply transform chain
Traceback (most recent call last):
  File "/home/user/.buildout/eggs/plone.transformchain-1.0.3-py2.7.egg/plone/transformchain/transformer.py", line 48, in __call__
    newResult = handler.transformIterable(result, encoding)
  File "/home/user/.buildout/eggs/plone.app.blocks-1.1.1-py2.7.egg/plone/app/blocks/transform.py", line 152, in transformIterable
    result.tree = tiles.renderTiles(self.request, result.tree)
  File "/home/user/.buildout/eggs/plone.app.blocks-1.1.1-py2.7.egg/plone/app/blocks/tiles.py", line 51, in renderTiles
    tileTree = utils.resolve(tileHref)
  File "/home/user/.buildout/eggs/plone.app.blocks-1.1.1-py2.7.egg/plone/app/blocks/utils.py", line 50, in resolve
    resolved = resolveResource(url)
  File "/home/user/.buildout/eggs/plone.app.blocks-1.1.1-py2.7.egg/plone/app/blocks/utils.py", line 73, in resolveResource
    raise RuntimeError(resolved)
RuntimeError: 'NoneType' object has no attribute 'url'

 - Expression: "python: view.get_media_url(item)"
 - Filename:   ... .7.egg/brasil/gov/tiles/tiles/templates/mediacarousel.pt
 - Location:   (line 39: col 48)
 - Source:     ... attributes="href python: view.get_media_url(item)">
                                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 - Arguments:  default: <object - at 0xb74b7820L>
               repeat: {...} (0)
               template: <ViewPageTemplateFile - at 0xb14d144cL>
               views: <ViewMapper - at 0xb1384f4cL>
               modules: <instance - at 0xb62fcb8cL>
               args: <tuple - at 0xb749102cL>
               results: <list - at 0xb2ea762cL>
               here: <ImplicitAcquisitionWrapper home at 0xb2fb857cL>
               user: <ImplicitAcquisitionWrapper - at 0xb2fb8b94L>
               nothing: <NoneType - at 0x81ad6b4>
               tile_id: a23be7a48b7b43479a20c0e30d767efc
               conf_fields: {...} (8)
               container: <ImplicitAcquisitionWrapper home at 0xb2fb857cL>
               field: uuids
               items: <list - at 0xb1b0a68cL>
               request: <instance - at 0xb14f378cL>
               wrapped_repeat: <SafeMapping - at 0xb2fa2324L>
               traverse_subpath: <list - at 0xb1384f8cL>
               item: <ImplicitAcquisitionWrapper noticia-sem-imagem at 0xb385470cL>
               loop: {...} (2)
               context: <ImplicitAcquisitionWrapper home at 0xb2fb857cL>
               view: <MediaCarouselTile mediacarousel at 0xb2ea10ccL>
               collection: <ImplicitAcquisitionWrapper carrossel at 0xb2f5caccL>
               translate: <function translate at 0xb15a7cdcL>
               root: <ImplicitAcquisitionWrapper Zope at 0xb30044dcL>
               options: {...} (0)
               target_language: <NoneType - at 0x81ad6b4>Traceback (innermost last):

  Module plone.subrequest, line 124, in subrequest

  Module ZPublisher.mapply, line 78, in mapply

  Module plone.tiles.esi, line 56, in __call__

  Module Products.Five.browser.pagetemplatefile, line 125, in __call__

  Module Products.Five.browser.pagetemplatefile, line 59, in __call__

  Module zope.pagetemplate.pagetemplate, line 132, in pt_render

  Module five.pt.engine, line 93, in __call__

  Module z3c.pt.pagetemplate, line 163, in render

  Module chameleon.zpt.template, line 258, in render

  Module chameleon.template, line 188, in render

  Module chameleon.template, line 170, in render

  Module 6a47dc29ea89b45238891fc12bb2b259.py, line 547, in render

  Module brasil.gov.tiles.tiles.mediacarousel, line 126, in get_media_url

AttributeError: (see above)

No 1.1.3 não chega a quebrar a capa pois o erro ocorre no momento da composição, ou seja, o item selecionado não é persistido. Esse é o traceback no 1.1.3:

2016-01-18 18:42:39 ERROR Zope.SiteErrorLog 1453149759.80.520841691485 http://localhost:8080/Plone/home/@@updatetilecontent
Traceback (innermost last):
  Module ZPublisher.Publish, line 138, in publish
  Module ZPublisher.mapply, line 77, in mapply
  Module ZPublisher.Publish, line 48, in call_object
  Module grokcore.view.components, line 151, in __call__
  Module zope.publisher.publish, line 107, in mapply
   - __traceback_info__: <bound method UpdateTileContent.render of <collective.cover.browser.cover.UpdateTileContent object at 0xb146cbcc>>
  Module zope.publisher.publish, line 113, in debug_call
  Module collective.cover.browser.cover, line 213, in render
  Module plone.tiles.esi, line 59, in __call__
  Module Products.Five.browser.pagetemplatefile, line 125, in __call__
  Module Products.Five.browser.pagetemplatefile, line 59, in __call__
  Module zope.pagetemplate.pagetemplate, line 132, in pt_render
  Module five.pt.engine, line 93, in __call__
  Module z3c.pt.pagetemplate, line 163, in render
  Module chameleon.zpt.template, line 258, in render
  Module chameleon.template, line 191, in render
  Module chameleon.template, line 171, in render
  Module fdd4bff9ed23f4ab285cdfb0789084c6.py, line 547, in render
  Module brasil.gov.tiles.tiles.mediacarousel, line 126, in get_media_url
AttributeError: 'NoneType' object has no attribute 'url'

 - Expression: "python: view.get_media_url(item)"
 - Filename:   ... .7.egg/brasil/gov/tiles/tiles/templates/mediacarousel.pt
 - Location:   (line 39: col 48)
 - Source:     ... attributes="href python: view.get_media_url(item)">
                                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 - Arguments:  default: <object - at 0xb7547858L>
               repeat: {...} (0)
               template: <ViewPageTemplateFile - at 0xb10af9ccL>
               views: <ViewMapper - at 0xb146ccecL>
               modules: <instance - at 0xb62e098cL>
               args: <tuple - at 0xb752102cL>
               results: <list - at 0xb2d6994cL>
               here: <ImplicitAcquisitionWrapper home at 0xb010ab6cL>
               user: <ImplicitAcquisitionWrapper - at 0xb010a9b4L>
               nothing: <NoneType - at 0x81ad6b4>
               tile_id: ce5d92d477ed426f8c6903020443f2be
               conf_fields: {...} (8)
               container: <ImplicitAcquisitionWrapper home at 0xb010ab6cL>
               field: uuids
               items: <list - at 0xb146ca4cL>
               request: <instance - at 0xb0bc84ccL>
               wrapped_repeat: <SafeMapping - at 0xb010a8c4L>
               traverse_subpath: <list - at 0xb1798a4cL>
               item: <ImplicitAcquisitionWrapper noticia-sem-imagem at 0xb0102a54L>
               loop: {...} (2)
               context: <ImplicitAcquisitionWrapper home at 0xb010ab6cL>
               view: <MediaCarouselTile mediacarousel at 0xb179850cL>
               collection: <ImplicitAcquisitionWrapper carrossel at 0xb0574a2cL>
               translate: <function translate at 0xb055c56cL>
               root: <ImplicitAcquisitionWrapper Zope at 0xb055d504L>
               options: {...} (0)
               target_language: <NoneType - at 0x81ad6b4>

O erro ocorre no tile mediacarousel.

Onde temos algo como:

    elif portal_type == 'collective.nitf.content':
        scale = self.scale(obj)
        url = scale.url

Deveria ser (por exemplo)

    elif portal_type == 'collective.nitf.content':
        scale = self.scale(obj)
        if scale is not None:
            url = scale.url
        else:
            url = obj.absolute_url()

Ou seja, deveria levar em consideração notícias que não possuem imagens ao invés de lançar uma exceção.

O problema é que ao fazer essa modificação no código, no carrossel não aparece sequer a notícia. Acredito que, além da correção acima, deveria ao menos aparecer o título da notícia mas sem nenhuma imagem, pois da forma como está confunde o usuário. Opiniões?

Além disso, outra coisa me intrigou: porque um erro num tile apenas quebrou toda a capa no IDG 1.0.5? No IDG 1.0.5 se quebra porque o tile não é atualizado em tempo de composição, e só após salvar que se renderizam todos os tiles: já no 1.1.3 é renderizado em tempo de composição (pois o collective.cover é o 1.0a11) e aí como não consegue renderizar e, por conseguinte, salvar, não quebra a capa: mas e outros tiles da capa? Sem contar que seria importante mostrar uma mensagem de erro pro usuário indicando que houve esse erro na atualização via ajax, mas acho que isso já é responsabilidade do collective.cover.

@hvelarde como você tem mais conhecimento do collective.cover, alguns questionamentos:

1 - É o caso de abrir um relato para tratar as requisições ajax que voltam erro 500 e indicar uma mensagem de erro ao usuário? Exemplo de url que deu erro nesse issue: http://localhost:8080/Plone/home/@@updatetilecontent?tile-type=mediacarousel&tile-id=ce5d92d477ed426f8c6903020443f2be&uid=e464e07c27504ba4aedc6f045ea3adf3
2- Esse comportamento de um tile com erro quebrar toda a capa foi corrigido em novas versões do collective.cover, ou seria o caso de abrir um issue por lá (ou é uma limitação técnica do componente e não há como consertar)? Não é possível simular isso no 1.1.3.1 já que ele dá update no tile, mas não tenho como afirmar que isso foi corrigido.

eu nunca entrei em detalhes de por que a capa quebrava com um erro no tile; acho que seria algo interessante de analisar.

também acho que é válido abrir relatos para resolver qualquer problema que afete a experiência do usuário.

não estou familiarizado com o código de esse tile e infelizmente não posso dedicar tempo agora para isso.

eu nunca entrei em detalhes de por que a capa quebrava com um erro no tile; acho que seria algo interessante de analisar.

No IDG 1.0.5, seguindo os passos descritos nesse issue, é possível demonstrar esse cenário.

Em resumo, se algum tile lança uma exceção na renderização, a capa quebra: na minha opinião, deveria aparecer um erro igual ocorre em portlets, "ocorreu um erro na renderização desse tile" ou algo do tipo mas não sei se há alguma limitação no collective.cover ou no Plone mesmo arquitetural que impeça essa forma de tratamento.

+1 seria uma melhoria fantástica; abre uma issue no collective.cover e vamos perguntar por ai

@hvelarde Atualizando o plone.app.blocks para 2.1.2 resolve o problema da capa "quebrar". Peguei o mesmo ambiente 1.0.5 que está com a capa quebrada, e mudei o versions.cfg do plone.app.blocks que estava 1.1.1 para 2.1.2.

Não sei se foi em 2.1.1:

Fix issue where tiles with empty response or syntax error broke tiles transform (add to log syntax errors instead) [datakurre]

ou em 2.0.0:

Fix issue with tile without body-tag breaking the tile composition (fixes issues with some p.a.standardtiles returning only in some conditions) [datakurre]

do plone.app.blocks que isso foi corrigido, mas isso é irrelevante porque versões mais atuais do collective.cover já pedem plone.app.blocks > 2.1.2, corrigindo o problema. Portanto, para fecharmos esse issue acho que o ideal é:

Sei que os dois últimos itens não dizem respeito a esse pacote e sim dependências, mas enquanto não for incorporado, esse erro continuará a acontecer. :(

muito interessante, obrigado pela pesquisa!

@hvelarde Apesar da capa "não quebrar" os tiles corretos também não são renderizados. Abrimos um outro relato na comunidade em plone/plone.app.blocks#27

@idgserpro obrigado! estou acompanhando

Fix by #138