瀏覽代碼

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 5 年之前
父節點
當前提交
f146104d11
共有 7 個文件被更改,包括 64 次插入15 次删除
  1. 3 0
      .gitignore
  2. 1 3
      coderedcms/search_urls.py
  3. 2 2
      coderedcms/tests/settings.py
  4. 37 0
      coderedcms/tests/test_urls.py
  5. 4 4
      coderedcms/urls.py
  6. 15 6
      coderedcms/views.py
  7. 2 0
      docs/releases/v0.16.0.rst

+ 3 - 0
.gitignore

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

+ 1 - 3
coderedcms/search_urls.py

@@ -1,8 +1,6 @@
 from django.urls import re_path
 from django.urls import re_path
-from wagtailcache.cache import cache_page
-
 from coderedcms.views import search
 from coderedcms.views import search
 
 
 urlpatterns = [
 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_ROOT = os.path.join(BASE_DIR, 'static')
-STATIC_URL = '/static/'
+STATIC_URL = '/teststatic/'
 
 
 MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
 MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
-MEDIA_URL = '/media/'
+MEDIA_URL = '/testmedia/'
 
 
 
 
 # Login
 # 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 django.urls import include, path, re_path
 from wagtail.contrib.sitemaps.views import sitemap
 from wagtail.contrib.sitemaps.views import sitemap
 from wagtail.core import urls as wagtailcore_urls
 from wagtail.core import urls as wagtailcore_urls
-from wagtailcache.cache import cache_page
-
 from coderedcms.settings import cr_settings
 from coderedcms.settings import cr_settings
 from coderedcms.views import (
 from coderedcms.views import (
     event_generate_ical_for_calendar,
     event_generate_ical_for_calendar,
     event_generate_recurring_ical_for_event,
     event_generate_recurring_ical_for_event,
     event_generate_single_ical_for_event,
     event_generate_single_ical_for_event,
     event_get_calendar_events,
     event_get_calendar_events,
+    favicon,
     robots,
     robots,
     serve_protected_file
     serve_protected_file
 )
 )
@@ -16,8 +15,9 @@ from coderedcms.views import (
 
 
 urlpatterns = [
 urlpatterns = [
     # CodeRed custom URLs
     # 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(
     re_path(r'^{0}(?P<path>.*)$'.format(
         cr_settings['PROTECTED_MEDIA_URL'].lstrip('/')),
         cr_settings['PROTECTED_MEDIA_URL'].lstrip('/')),
         serve_protected_file,
         serve_protected_file,

+ 15 - 6
coderedcms/views.py

@@ -1,24 +1,26 @@
 import mimetypes
 import mimetypes
 import os
 import os
-
 from itertools import chain
 from itertools import chain
-
 from datetime import datetime
 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.auth.decorators import login_required
 from django.contrib.contenttypes.models import ContentType
 from django.contrib.contenttypes.models import ContentType
 from django.core.paginator import Paginator, InvalidPage, EmptyPage, PageNotAnInteger
 from django.core.paginator import Paginator, InvalidPage, EmptyPage, PageNotAnInteger
 from django.shortcuts import redirect, render
 from django.shortcuts import redirect, render
 from django.utils.translation import ungettext, ugettext_lazy as _
 from django.utils.translation import ungettext, ugettext_lazy as _
 from icalendar import Calendar
 from icalendar import Calendar
-
 from wagtail.admin import messages
 from wagtail.admin import messages
 from wagtail.search.backends import db, get_search_backend
 from wagtail.search.backends import db, get_search_backend
 from wagtail.search.models import Query
 from wagtail.search.models import Query
-
 from coderedcms import utils
 from coderedcms import utils
 from coderedcms.forms import SearchForm
 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.importexport import convert_csv_to_json, import_pages, ImportPagesFromCSVFileForm
 from coderedcms.settings import cr_settings
 from coderedcms.settings import cr_settings
 
 
@@ -121,6 +123,13 @@ def serve_protected_file(request, path):
     raise Http404()
     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):
 def robots(request):
     return render(
     return render(
         request,
         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 HTML5 validity by removing space within tags and ``href`` attributes.
 * Improved accessibility by adding title attribute to embedded iframes.
 * Improved accessibility by adding title attribute to embedded iframes.
 * Specify language in HTML tag. See :doc:`/getting_started/customize_develop`.
 * 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
 Maintenance