Parcourir la source

Adding favicon url path and view (#230)

* Adding favicon url path and view

* Support wagtail-modeltranslation (#236)

* Compatibility with wagtail_modeltranslation

* Adding How-Tos / Translation section in docs

* Editing documentation

* Updating release notes

* tests & docs
Vince Salvino il y a 5 ans
Parent
commit
f146104d11

+ 3 - 0
.gitignore

@@ -27,3 +27,6 @@ htmlcov/
 junit/
 coverage.xml
 testproject*/
+testmedia*/
+teststatic*/
+*.sqlite3

+ 1 - 3
coderedcms/search_urls.py

@@ -1,8 +1,6 @@
 from django.urls import re_path
-from wagtailcache.cache import cache_page
-
 from coderedcms.views import search
 
 urlpatterns = [
-    re_path(r'', cache_page(search), name='codered_search'),
+    re_path(r'', search, name='codered_search'),
 ]

+ 2 - 2
coderedcms/tests/settings.py

@@ -165,10 +165,10 @@ STATICFILES_FINDERS = [
 ]
 
 STATIC_ROOT = os.path.join(BASE_DIR, 'static')
-STATIC_URL = '/static/'
+STATIC_URL = '/teststatic/'
 
 MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
-MEDIA_URL = '/media/'
+MEDIA_URL = '/testmedia/'
 
 
 # Login

+ 37 - 0
coderedcms/tests/test_urls.py

@@ -0,0 +1,37 @@
+import pytest
+import unittest
+from django.test import Client
+from coderedcms.models import LayoutSettings
+from wagtail.core.models import Site
+from wagtail.images.tests.utils import Image, get_test_image_file
+
+
+@pytest.mark.django_db
+class TestFavicon(unittest.TestCase):
+    def test_404(self):
+        client = Client()
+        # Get the default site
+        site = Site.objects.filter(is_default_site=True)[0]
+        # Ensure the favicon is blank
+        layout = LayoutSettings.for_site(site)
+        layout.favicon = None
+        layout.save()
+        # Expect a 404
+        response = client.get("/favicon.ico")
+        self.assertEqual(response.status_code, 404)
+
+    def test_301(self):
+        client = Client()
+        # Get the default site
+        site = Site.objects.filter(is_default_site=True)[0]
+        # Set a dummy favicon
+        layout = LayoutSettings.for_site(site)
+        img = Image.objects.create(
+            title="Test image",
+            file=get_test_image_file(),
+        )
+        layout.favicon = img
+        layout.save()
+        # Expect a 301 redirect
+        response = client.get("/favicon.ico")
+        self.assertEqual(response.status_code, 301)

+ 4 - 4
coderedcms/urls.py

@@ -1,14 +1,13 @@
 from django.urls import include, path, re_path
 from wagtail.contrib.sitemaps.views import sitemap
 from wagtail.core import urls as wagtailcore_urls
-from wagtailcache.cache import cache_page
-
 from coderedcms.settings import cr_settings
 from coderedcms.views import (
     event_generate_ical_for_calendar,
     event_generate_recurring_ical_for_event,
     event_generate_single_ical_for_event,
     event_get_calendar_events,
+    favicon,
     robots,
     serve_protected_file
 )
@@ -16,8 +15,9 @@ from coderedcms.views import (
 
 urlpatterns = [
     # CodeRed custom URLs
-    re_path(r'^sitemap\.xml$', cache_page(sitemap), name='codered_sitemap'),
-    re_path(r'^robots\.txt$', cache_page(robots), name='codered_robots'),
+    re_path(r'^favicon\.ico$', favicon, name='codered_favicon'),
+    re_path(r'^robots\.txt$', robots, name='codered_robots'),
+    re_path(r'^sitemap\.xml$', sitemap, name='codered_sitemap'),
     re_path(r'^{0}(?P<path>.*)$'.format(
         cr_settings['PROTECTED_MEDIA_URL'].lstrip('/')),
         serve_protected_file,

+ 15 - 6
coderedcms/views.py

@@ -1,24 +1,26 @@
 import mimetypes
 import os
-
 from itertools import chain
-
 from datetime import datetime
-from django.http import Http404, HttpResponse, JsonResponse
+from django.http import Http404, HttpResponse, HttpResponsePermanentRedirect, JsonResponse
 from django.contrib.auth.decorators import login_required
 from django.contrib.contenttypes.models import ContentType
 from django.core.paginator import Paginator, InvalidPage, EmptyPage, PageNotAnInteger
 from django.shortcuts import redirect, render
 from django.utils.translation import ungettext, ugettext_lazy as _
 from icalendar import Calendar
-
 from wagtail.admin import messages
 from wagtail.search.backends import db, get_search_backend
 from wagtail.search.models import Query
-
 from coderedcms import utils
 from coderedcms.forms import SearchForm
-from coderedcms.models import CoderedPage, CoderedEventPage, get_page_models, GeneralSettings
+from coderedcms.models import (
+    CoderedPage,
+    CoderedEventPage,
+    get_page_models,
+    GeneralSettings,
+    LayoutSettings
+)
 from coderedcms.importexport import convert_csv_to_json, import_pages, ImportPagesFromCSVFileForm
 from coderedcms.settings import cr_settings
 
@@ -121,6 +123,13 @@ def serve_protected_file(request, path):
     raise Http404()
 
 
+def favicon(request):
+    icon = LayoutSettings.for_site(request.site).favicon
+    if icon:
+        return HttpResponsePermanentRedirect(icon.get_rendition('original').url)
+    raise Http404()
+
+
 def robots(request):
     return render(
         request,

+ 2 - 0
docs/releases/v0.16.0.rst

@@ -20,6 +20,8 @@ Bug fixes
 * Improved HTML5 validity by removing space within tags and ``href`` attributes.
 * Improved accessibility by adding title attribute to embedded iframes.
 * Specify language in HTML tag. See :doc:`/getting_started/customize_develop`.
+* The commonly crawled URL ``/favicon.ico`` now issues a redirect to the Favicon
+  set in Layout Settings.
 
 
 Maintenance