Skip to content

Commit

Permalink
Exibe somente conteúdos com imagens no portlet de carrossel de imagen…
Browse files Browse the repository at this point in the history
…s. (#14)

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 authored and hvelarde committed Oct 27, 2016
1 parent 8589c2f commit 9b66a14
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 9b66a14

Please sign in to comment.