diff --git a/docs/badges.rst b/docs/badges.rst index 94939e8e6a7..fcdb8dc76c7 100644 --- a/docs/badges.rst +++ b/docs/badges.rst @@ -40,19 +40,11 @@ since it will stay up to date with your Read the Docs project:: https://readthedocs.org/projects/pip/badge/ -Style ------ - -If you pass the ``style`` GET argument, -we will pass it along to shields.io as is. -This will allow you to have custom style badges. - .. _Read the Docs README: https://github.com/rtfd/readthedocs.org/blob/master/README.rst .. _project page: https://readthedocs.org/projects/pip/ -.. |green| image:: https://img.shields.io/badge/docs-latest-brightgreen.svg?style=flat -.. |red| image:: https://img.shields.io/badge/docs-release--1.6-red.svg?style=flat -.. |yellow| image:: https://img.shields.io/badge/docs-no%20builds-yellow.svg?style=flat -.. |nbsp| unicode:: 0xA0 +.. |green| image:: https://media.readthedocs.org/static/projects/badges/passing.svg +.. |red| image:: https://media.readthedocs.org/static/projects/badges/failing.svg +.. |yellow| image:: https://media.readthedocs.org/static/projects/badges/unknown.svg +.. |nbsp| unicode:: 0xA0 :trim: - diff --git a/readthedocs/projects/static/projects/badges/failing.svg b/readthedocs/projects/static/projects/badges/failing.svg new file mode 100644 index 00000000000..c9ff866c6f0 --- /dev/null +++ b/readthedocs/projects/static/projects/badges/failing.svg @@ -0,0 +1 @@ +docsdocsfailingfailing \ No newline at end of file diff --git a/readthedocs/projects/static/projects/badges/passing.svg b/readthedocs/projects/static/projects/badges/passing.svg new file mode 100644 index 00000000000..39ff2cbda3a --- /dev/null +++ b/readthedocs/projects/static/projects/badges/passing.svg @@ -0,0 +1 @@ +docsdocspassingpassing \ No newline at end of file diff --git a/readthedocs/projects/static/projects/badges/unknown.svg b/readthedocs/projects/static/projects/badges/unknown.svg new file mode 100644 index 00000000000..1514f0526ba --- /dev/null +++ b/readthedocs/projects/static/projects/badges/unknown.svg @@ -0,0 +1 @@ +docsdocsunknownunknown \ No newline at end of file diff --git a/readthedocs/projects/views/public.py b/readthedocs/projects/views/public.py index 9c652b9f61a..86222dbd84f 100644 --- a/readthedocs/projects/views/public.py +++ b/readthedocs/projects/views/public.py @@ -13,6 +13,7 @@ from django.conf import settings from django.contrib import messages from django.contrib.auth.models import User +from django.contrib.staticfiles.templatetags.staticfiles import static from django.http import HttpResponse, HttpResponseRedirect, Http404 from django.shortcuts import get_object_or_404, render_to_response from django.template import RequestContext @@ -105,36 +106,23 @@ def get_context_data(self, **kwargs): @never_cache def project_badge(request, project_slug): """Return a sweet badge for the project""" + badge_path = "projects/badges/%s.svg" version_slug = request.GET.get('version', LATEST) - style = request.GET.get('style', 'flat') - # Default to 24 hour cache lifetime - max_age = request.GET.get('maxAge', 86400) try: version = Version.objects.public(request.user).get( project__slug=project_slug, slug=version_slug) except Version.DoesNotExist: - url = ( - 'https://img.shields.io/badge/docs-unknown%20version-yellow.svg' - '?style={style}&maxAge={max_age}' - .format(style=style, max_age=max_age)) + url = static(badge_path % "unknown") return HttpResponseRedirect(url) version_builds = version.builds.filter(type='html', state='finished').order_by('-date') if not version_builds.exists(): - url = ( - 'https://img.shields.io/badge/docs-no%20builds-yellow.svg' - '?style={style}&maxAge={max_age}' - .format(style=style, max_age=max_age)) + url = static(badge_path % "unknown") return HttpResponseRedirect(url) last_build = version_builds[0] if last_build.success: - color = 'brightgreen' + url = static(badge_path % "passing") else: - color = 'red' - url = ( - 'https://img.shields.io/badge/docs-{version}-{color}.svg' - '?style={style}&maxAge={max_age}' - .format(version=version.slug.replace('-', '--'), color=color, - style=style, max_age=max_age)) + url = static(badge_path % "failing") return HttpResponseRedirect(url) diff --git a/readthedocs/rtd_tests/tests/test_project_views.py b/readthedocs/rtd_tests/tests/test_project_views.py index 7db6f696759..b52dbe40f75 100644 --- a/readthedocs/rtd_tests/tests/test_project_views.py +++ b/readthedocs/rtd_tests/tests/test_project_views.py @@ -4,7 +4,9 @@ from mock import patch from django.test import TestCase from django.contrib.auth.models import User +from django.contrib.staticfiles.templatetags.staticfiles import static from django.contrib.messages import constants as message_const +from django.core.urlresolvers import reverse from django.http.response import HttpResponseRedirect from django.views.generic.base import ContextMixin from django_dynamic_fixture import get @@ -12,12 +14,11 @@ import six -from readthedocs.core.models import UserProfile +from readthedocs.builds.models import Build, Version from readthedocs.rtd_tests.base import (WizardTestCase, MockBuildTestCase, RequestFactoryTestMixin) from readthedocs.oauth.models import RemoteRepository from readthedocs.projects.exceptions import ProjectSpamError -from readthedocs.projects.forms import ProjectBasicsForm from readthedocs.projects.models import Project, Domain from readthedocs.projects.views.private import ImportWizardView from readthedocs.projects.views.mixins import ProjectRelationMixin @@ -418,3 +419,30 @@ def get_project_queryset(self): self.assertEqual(view.get_project(), self.project) self.assertEqual(view.get_queryset().first(), self.domain) self.assertEqual(view.get_context_data()['project'], self.project) + + +class TestBadges(TestCase): + """Test a static badge asset is served for each build.""" + + def setUp(self): + self.BADGE_PATH = 'projects/badges/%s.svg' + self.project = get(Project, slug='badgey') + self.version = Version.objects.get(project=self.project) + self.badge_url = reverse('project_badge', args=[self.project.slug]) + + def test_unknown_badge(self): + res = self.client.get(self.badge_url, {'version': self.version.slug}) + static_badge = static(self.BADGE_PATH % 'unknown') + self.assertEquals(res.url, static_badge) + + def test_passing_badge(self): + get(Build, project=self.project, version=self.version, success=True) + res = self.client.get(self.badge_url, {'version': self.version.slug}) + static_badge = static(self.BADGE_PATH % 'passing') + self.assertEquals(res.url, static_badge) + + def test_failing_badge(self): + get(Build, project=self.project, version=self.version, success=False) + res = self.client.get(self.badge_url, {'version': self.version.slug}) + static_badge = static(self.BADGE_PATH % 'failing') + self.assertEquals(res.url, static_badge)