From 0331a0e0305b0a0294531d0bcfba7397b93db0fd Mon Sep 17 00:00:00 2001 From: Juda Kaleta Date: Sat, 22 Feb 2014 10:04:41 +0100 Subject: [PATCH] Handling timeout in template tags --- .travis.yml | 1 + CHANGES.rst | 6 +++++- docs/development/testing.rst | 5 +++-- embed_video/backends.py | 2 +- embed_video/templatetags/embed_video_tags.py | 19 +++++++++++++++---- embed_video/tests/tests_tags.py | 17 +++++++++++++++-- 6 files changed, 40 insertions(+), 10 deletions(-) diff --git a/.travis.yml b/.travis.yml index 80dca5f..195f907 100644 --- a/.travis.yml +++ b/.travis.yml @@ -12,6 +12,7 @@ install: - pip install mock --use-mirrors - pip install south --use-mirrors - pip install nose + - pip install testfixtures script: - python setup.py build - nosetests --with-coverage --cover-package=embed_video --cover-tests --cover-erase diff --git a/CHANGES.rst b/CHANGES.rst index 7356e93..4d1c2d3 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -3,7 +3,11 @@ Release 0.8 (dev) - Add ``EMBED_VIDEO_TIMEOUT`` to settings. -- Fix renderering template tag if no url is provided (`#18 `_) +- Fix renderering template tag if no url is provided + (`#18 `_) + +- If ``EMBED_VIDEO_TIMEOUT`` timeout is reached in templates, no exception is + raised, error is just logged. Release 0.7 (Dec. 21, 2013) diff --git a/docs/development/testing.rst b/docs/development/testing.rst index 9b52251..3c5dc2e 100644 --- a/docs/development/testing.rst +++ b/docs/development/testing.rst @@ -4,8 +4,8 @@ Testing Requirements ------------ -The library needs ``Django`` and ``requests`` and ``nose``, ``mock`` and -``south`` libraries to run tests. +The library needs ``Django`` and ``requests`` and ``nose``, ``mock``, +``south`` and ``textfixtures`` libraries to run tests. :: @@ -14,6 +14,7 @@ The library needs ``Django`` and ``requests`` and ``nose``, ``mock`` and pip install nose pip install mock pip install south + pip install textfixtures Running tests diff --git a/embed_video/backends.py b/embed_video/backends.py index 951195a..6c76135 100644 --- a/embed_video/backends.py +++ b/embed_video/backends.py @@ -238,7 +238,7 @@ class SoundCloudBackend(VideoBackend): } r = requests.get(self.base_url, data=params, timeout=EMBED_VIDEO_TIMEOUT) - + return json.loads(r.text) def get_thumbnail_url(self): diff --git a/embed_video/templatetags/embed_video_tags.py b/embed_video/templatetags/embed_video_tags.py index 20509ed..e721cf3 100644 --- a/embed_video/templatetags/embed_video_tags.py +++ b/embed_video/templatetags/embed_video_tags.py @@ -1,11 +1,15 @@ from django.template import Library, Node, TemplateSyntaxError from django.utils.safestring import mark_safe import re +import logging +import requests from ..backends import detect_backend, VideoBackend register = Library() +logger = logging.getLogger(__name__) + @register.tag('video') class VideoNode(Node): @@ -82,11 +86,18 @@ class VideoNode(Node): return self.embed(url, size, context=context) def __render_block(self, url, context): + output = '' as_var = self.bits[-1] - context.push() - context[as_var] = self.get_backend(url, context=context) - output = self.nodelist_file.render(context) - context.pop() + + try: + context.push() + context[as_var] = self.get_backend(url, context=context) + output = self.nodelist_file.render(context) + context.pop() + except requests.Timeout: + logger.exception('Timeout reached during rendering embed ' + 'video (`{0}`)'.format(url)) + return output @staticmethod diff --git a/embed_video/tests/tests_tags.py b/embed_video/tests/tests_tags.py index e9775d7..d7bfc03 100644 --- a/embed_video/tests/tests_tags.py +++ b/embed_video/tests/tests_tags.py @@ -1,11 +1,12 @@ from unittest import TestCase from django.test.client import RequestFactory -from mock import Mock +from mock import Mock, patch from django.template import TemplateSyntaxError from django.http import HttpRequest from django.template.base import Template from django.template.context import RequestContext +from testfixtures import LogCapture from embed_video.templatetags.embed_video_tags import VideoNode @@ -160,4 +161,16 @@ class EmbedVideoNodeTestCase(TestCase): """) self.assertEqual(template.render(self._grc()).strip(), '') - + @patch('embed_video.backends.EMBED_VIDEO_TIMEOUT', 0.000001) + def test_empty_if_timeout(self): + template = Template(""" + {% load embed_video_tags %} + {% video "http://vimeo.com/72304002" as my_video %} + {{ my_video.thumbnail }} + {% endvideo %} + """) + with LogCapture() as logs: + self.assertEqual(template.render(self._grc()).strip(), '') + log = logs.records[-1] + self.assertEqual(log.name, 'embed_video.templatetags.embed_video_tags') + self.assertEqual(log.msg, 'Timeout reached during rendering embed video (`http://vimeo.com/72304002`)')