Skip to content

Commit

Permalink
Exibe somente conteúdos com imagens no portlet de carrossel de imagens.
Browse files Browse the repository at this point in the history
Quando um usuário adicionava uma coleção, que possuia um conteúdo sem
imagem, no portlet de carrossel de imagens, ocorria o erro:

    AttributeError: 'NoneType' object has no attribute 'url'

Agora exibimos somente conteúdos que com certeza possuem imagens.

Fixes #8
  • Loading branch information
idgserpro committed Sep 29, 2016
1 parent 7269cde commit 2ee8eca
Show file tree
Hide file tree
Showing 5 changed files with 89 additions and 37 deletions.
5 changes: 2 additions & 3 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
*.log
*.mo
*.py?
*.pyc
*.swp
# dirs
.settings
Expand All @@ -15,7 +16,6 @@ include/
lib/
local/
parts/
src/*
test.plone_addon/
var/
# files
Expand All @@ -34,5 +34,4 @@ report.html
!.gitattributes
!.gitignore
!.gitkeep
!.travis.yml
!src/brasil.gov.portlets
!.travis.yml
6 changes: 5 additions & 1 deletion CHANGES.rst
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,8 @@ Changelog
1.0rc2 (unreleased)
-------------------

- Nothing changed yet.
- Exibe somente conteúdos com imagens no portlet de carrossel de imagens (closes `#8`_).
[idgserpro]


1.0rc1 (2016-06-09)
Expand All @@ -20,3 +21,6 @@ Changelog
------------------

- Versão inicial.


.. _`#8`: https://github.com/plonegovbr/brasil.gov.portlets/issues/8
29 changes: 19 additions & 10 deletions src/brasil/gov/portlets/portlets/mediacarousel.py
Original file line number Diff line number Diff line change
Expand Up @@ -174,7 +174,8 @@ def __init__(self, *args):
def css_class(self):
header = self.data.header
normalizer = getUtility(IIDNormalizer)
return 'brasil-gov-portlets-mediacarousel-{0}'.format(normalizer.normalize(header))
return 'brasil-gov-portlets-mediacarousel-{0}'.format(
normalizer.normalize(header))

@memoize
def results(self):
Expand All @@ -193,7 +194,12 @@ def results(self):
results = collection.queryCatalog(**query)
if limit and limit > 0:
results = results[:limit]
return [b.getObject() for b in results]
list_results = []
for result in results:
obj = result.getObject()
if self.thumbnail(obj): # somente retorna conteúdos com imagens
list_results.append(obj)
return list_results

@memoize
def collection(self):
Expand Down Expand Up @@ -229,23 +235,26 @@ def header(self):
hx = getattr(E, self.data.header_type)(self.data.header)
return html.tostring(hx)

@memoize
def thumbnail(self, item):
if self._has_image_field(item):
scales = item.restrictedTraverse('@@images')
thumb = scales.scale('image', width=45, height=36)
return {
'src': thumb.url,
'alt': item.Description() or item.Title(),
}
if thumb: # conteúdo possui imagem
return {
'src': thumb.url,
'alt': item.Description() or item.Title(),
}

def scale(self, item):
if self._has_image_field(item):
scales = item.restrictedTraverse('@@images')
thumb = scales.scale('image', width=242, height=166)
return {
'src': thumb.url,
'alt': item.Description() or item.Title(),
}
if thumb: # conteúdo possui imagem
return {
'src': thumb.url,
'alt': item.Description() or item.Title(),
}


class AddForm(base.AddForm):
Expand Down
7 changes: 4 additions & 3 deletions src/brasil/gov/portlets/testing.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@


class CreateTestContent(object):
test_date_order = [3, 1, 2]
test_date_order = [3, 1, 2, 4]
test_startdate_order = [3, 2, 1]
YOUTUBE_EMBED = """
<iframe width="459" height="344" \
Expand Down Expand Up @@ -79,7 +79,7 @@ def create_news(self):
title='News Folder',
container=self.portal
)
for i in xrange(1, 4):
for i in xrange(1, 5):
o = api.content.create(
type='News Item',
title='New {0}'.format(i),
Expand All @@ -96,7 +96,8 @@ def create_news(self):
'2014/05/0{0} 14:23:38.334118 GMT-3'
.format(self.test_date_order[i - 1])
))
o.setImage(self._generate_jpeg(50, 50))
if i != 4: # Cria notícia sem imagem
o.setImage(self._generate_jpeg(50, 50))
api.content.create(
type='Collection',
title='News Collection',
Expand Down
79 changes: 59 additions & 20 deletions src/brasil/gov/portlets/tests/test_mediacarousel_portlet.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,15 +25,25 @@ def setUp(self):
setRoles(self.portal, TEST_USER_ID, ['Manager'])

self.images = {}
self.images['collection'] = self.portal['images-folder']['images-collection']
self.images['path'] = '/' + '/'.join(self.images['collection'].getPhysicalPath()[2:])
self.images['collection'] = \
self.portal['images-folder']['images-collection']
self.images['path'] = '/' + '/'.join(
self.images['collection'].getPhysicalPath()[2:])
self.images['url'] = self.images['collection'].absolute_url()

self.files = {}
self.files['collection'] = self.portal['files-folder']['files-collection']
self.files['path'] = '/' + '/'.join(self.files['collection'].getPhysicalPath()[2:])
self.files['collection'] = \
self.portal['files-folder']['files-collection']
self.files['path'] = '/' + '/'.join(
self.files['collection'].getPhysicalPath()[2:])
self.files['url'] = self.files['collection'].absolute_url()

self.news = {}
self.news['collection'] = self.portal['news-folder']['news-collection']
self.news['path'] = '/' + '/'.join(
self.news['collection'].getPhysicalPath()[2:])
self.news['url'] = self.news['collection'].absolute_url()

def _renderer(self, context=None, request=None, view=None, manager=None,
assignment=None):
context = context or self.portal
Expand All @@ -56,7 +66,7 @@ def _assigned_renderer(self, col):
footer=u'Mais...',
footer_url=col['url'],
show_rights=True,
limit=3,
limit=4,
collection=col['path']
)
r = self._renderer(context=self.portal,
Expand All @@ -66,11 +76,13 @@ def _assigned_renderer(self, col):
return r

def test_portlet_type_registered(self):
portlet = getUtility(IPortletType, name='brasil.gov.portlets.mediacarousel')
portlet = getUtility(IPortletType,
name='brasil.gov.portlets.mediacarousel')
self.assertEqual(portlet.addview, 'brasil.gov.portlets.mediacarousel')

def test_registered_interfaces(self):
portlet = getUtility(IPortletType, name='brasil.gov.portlets.mediacarousel')
portlet = getUtility(IPortletType,
name='brasil.gov.portlets.mediacarousel')
registered_interfaces = [_getDottedName(i) for i in portlet.for_]
registered_interfaces.sort()
self.assertEqual(
Expand All @@ -85,19 +97,24 @@ def test_interfaces(self):
self.assertTrue(IPortletDataProvider.providedBy(portlet.data))

def test_invoke_addview(self):
portlet = getUtility(IPortletType, name='brasil.gov.portlets.mediacarousel')
mapping = self.portal.restrictedTraverse('++contextportlets++plone.leftcolumn')
portlet = getUtility(IPortletType,
name='brasil.gov.portlets.mediacarousel')
mapping = self.portal.restrictedTraverse(
'++contextportlets++plone.leftcolumn')
for m in mapping.keys():
del mapping[m]
addview = mapping.restrictedTraverse('+/' + portlet.addview)
addview.createAndAdd(data={})

self.assertEqual(len(mapping), 1)
self.assertTrue(isinstance(mapping.values()[0], mediacarousel.Assignment))
self.assertTrue(isinstance(mapping.values()[0],
mediacarousel.Assignment))

def test_portlet_properties(self):
portlet = getUtility(IPortletType, name='brasil.gov.portlets.mediacarousel')
mapping = self.portal.restrictedTraverse('++contextportlets++plone.leftcolumn')
portlet = getUtility(IPortletType,
name='brasil.gov.portlets.mediacarousel')
mapping = self.portal.restrictedTraverse(
'++contextportlets++plone.leftcolumn')
for m in mapping.keys():
del mapping[m]
addview = mapping.restrictedTraverse('+/' + portlet.addview)
Expand Down Expand Up @@ -157,14 +174,21 @@ def test_renderer_cssclass(self):
r1 = self._assigned_renderer(self.images)

self.assertEqual(r1.css_class(),
'brasil-gov-portlets-mediacarousel-portal-padrao-carrossel-de-imagens')
'brasil-gov-portlets-mediacarousel-portal'
'-padrao-carrossel-de-imagens')

def test_renderer_results(self):
r = self._assigned_renderer(self.images)

results = [b.id for b in r.results()]
self.assertEqual(results, ['image-2', 'image-3', 'image-1'])

def test_renderer_results_col_news_without_img(self):
r = self._assigned_renderer(self.news)

results = [b.id for b in r.results()]
self.assertEqual(results, ['new-2', 'new-3', 'new-1'])

def test_renderer_collection(self):
r = self._assigned_renderer(self.images)

Expand All @@ -173,14 +197,15 @@ def test_renderer_collection(self):
def test_renderer_header(self):
r = self._assigned_renderer(self.images)

self.assertEqual(r.header(), u'<h2>Portal Padr&#227;o Carrossel de Imagens</h2>')
self.assertEqual(r.header(),
u'<h2>Portal Padr&#227;o Carrossel de Imagens</h2>')

def test_renderer_thumbnail(self):
r1 = self._assigned_renderer(self.files)
r2 = self._assigned_renderer(self.images)

images = [r1.thumbnail(o) for o in r1.results()]
self.assertEqual(images, [None, None, None])
self.assertEqual(images, [])

images = [r2.thumbnail(o) for o in r2.results()]
img_order = [2, 3, 1]
Expand All @@ -189,8 +214,8 @@ def test_renderer_thumbnail(self):
self.assertTrue(img['src'])
self.assertIn('alt', img)
self.assertEqual(img['alt'],
('Image {0} description - Lorem ipsum dolor sit ' +
'amet, consectetur adipiscing elit. Donec ' +
('Image {0} description - Lorem ipsum dolor ' +
'sit amet, consectetur adipiscing elit. Donec ' +
'eleifend hendrerit interdum.')
.format(img_order[i]))

Expand All @@ -199,7 +224,7 @@ def test_renderer_scale(self):
r2 = self._assigned_renderer(self.images)

images = [r1.scale(o) for o in r1.results()]
self.assertEqual(images, [None, None, None])
self.assertEqual(images, [])

images = [r2.scale(o) for o in r2.results()]
img_order = [2, 3, 1]
Expand All @@ -208,7 +233,21 @@ def test_renderer_scale(self):
self.assertTrue(img['src'])
self.assertIn('alt', img)
self.assertEqual(img['alt'],
('Image {0} description - Lorem ipsum dolor sit ' +
'amet, consectetur adipiscing elit. Donec ' +
('Image {0} description - Lorem ipsum dolor ' +
'sit amet, consectetur adipiscing elit. Donec ' +
'eleifend hendrerit interdum.')
.format(img_order[i]))

def test_renderer_thumbnail_news_without_img(self):
r1 = self._assigned_renderer(self.news)

news_without_img = self.portal['news-folder']['new-4']
thumbnail = r1.thumbnail(news_without_img)
self.assertIsNone(thumbnail)

def test_renderer_scale_news_without_img(self):
r1 = self._assigned_renderer(self.news)

news_without_img = self.portal['news-folder']['new-4']
scale = r1.scale(news_without_img)
self.assertIsNone(scale)

0 comments on commit 2ee8eca

Please sign in to comment.