diff --git a/pillar/shortcodes.py b/pillar/shortcodes.py index b4fb8258..8febd23d 100644 --- a/pillar/shortcodes.py +++ b/pillar/shortcodes.py @@ -194,7 +194,7 @@ class Attachment: except self.NotSupported as ex: return html_module.escape('{attachment %s}' % ex) - return self.render(file_doc, kwargs) + return self.render(file_doc, pargs, kwargs) def sdk_file(self, slug: str, node_properties: dict) -> pillarsdk.File: """Return the file document for the attachment with this slug.""" @@ -222,7 +222,9 @@ class Attachment: sdk_file = pillarsdk.File.find(object_id, api=api) return sdk_file - def render(self, sdk_file: pillarsdk.File, tag_args: dict) -> str: + def render(self, sdk_file: pillarsdk.File, + pargs: typing.List[str], + kwargs: typing.Dict[str, str]) -> str: file_renderers = { 'image': self.render_image, 'video': self.render_video, @@ -230,21 +232,29 @@ class Attachment: mime_type_cat, _ = sdk_file.content_type.split('/', 1) renderer = file_renderers.get(mime_type_cat, self.render_generic) - return renderer(sdk_file, tag_args) + return renderer(sdk_file, pargs, kwargs) - def render_generic(self, sdk_file, tag_args): + def render_generic(self, sdk_file, + pargs: typing.List[str], + kwargs: typing.Dict[str, str]): import flask return flask.render_template('nodes/attachments/file_generic.html', - file=sdk_file, tag_args=tag_args) + file=sdk_file, tag_args=kwargs) - def render_image(self, sdk_file, tag_args): + def render_image(self, sdk_file, + pargs: typing.List[str], + kwargs: typing.Dict[str, str]): """Renders an image file.""" import flask + if 'link' in pargs: + kwargs['link'] = 'self' variations = {var.size: var for var in sdk_file.variations} return flask.render_template('nodes/attachments/file_image.html', - file=sdk_file, vars=variations, tag_args=tag_args) + file=sdk_file, vars=variations, tag_args=kwargs) - def render_video(self, sdk_file, tag_args): + def render_video(self, sdk_file, + pargs: typing.List[str], + kwargs: typing.Dict[str, str]): """Renders a video file.""" import flask try: @@ -255,7 +265,7 @@ class Attachment: return flask.render_template('nodes/attachments/file_generic.html', file=sdk_file) return flask.render_template('nodes/attachments/file_video.html', - file=sdk_file, var=default_variation, tag_args=tag_args) + file=sdk_file, var=default_variation, tag_args=kwargs) def _get_parser() -> typing.Tuple[shortcodes.Parser, shortcodes.Parser]: diff --git a/tests/test_shortcodes.py b/tests/test_shortcodes.py index ef6e6a03..4cfa5d94 100644 --- a/tests/test_shortcodes.py +++ b/tests/test_shortcodes.py @@ -155,3 +155,52 @@ class IFrameTest(AbstractPillarTest): with self.app.app_context(): self.login_api_as(uid, roles=roles) self.assertEqual(expect, render(md)) + + +class AttachmentTest(AbstractPillarTest): + def test_image(self): + from pillar.shortcodes import render + + oid, _ = self.ensure_file_exists(file_overrides={ + 'variations': [ + {'format': 'jpg', 'height': 2048, 'width': 2048, 'length': 819569, + 'link': 'https://i.imgur.com/FmbuPNe.jpg', + 'content_type': 'image/jpeg', + 'md5': '--', + 'file_path': 'c2a5c897769ce1ef0eb10f8fa1c472bcb8e2d5a4-h.jpg', + 'size': 'l'}, + ], + 'filename': 'cute_kitten.jpg', + }) + node_props = { + 'attachments': { + 'img': {'oid': oid}, + } + } + + # We have to get the file document again, because retrieving it via the + # API (which is what the shortcode rendering is doing) will change its + # link URL. + db_file = self.get(f'/api/files/{oid}').json() + link = db_file['variations'][0]['link'] + + with self.app.test_request_context(): + self.assertEqual( + f'cute_kitten.jpg', + render('{attachment img link}', context=node_props).strip() + ) + self.assertEqual( + f'cute_kitten.jpg', + render('{attachment img link=self}', context=node_props).strip() + ) + self.assertEqual( + f'cute_kitten.jpg', + render('{attachment img}', context=node_props).strip() + ) + + tag_link = 'https://i.imgur.com/FmbuPNe.jpg' + self.assertEqual( + f'' + f'cute_kitten.jpg', + render('{attachment img link=%r}' % tag_link, context=node_props).strip() + )