From 55731c63ce9ddb705323ea4d3e7a0838e7ecc0fa Mon Sep 17 00:00:00 2001 From: Danielle McLean Date: Sat, 28 Oct 2017 14:29:07 +1100 Subject: [PATCH] Add support for generating a simple Web App Manifest file, which helps mobile browsers display the site smartly --- Pipfile | 1 + Pipfile.lock | 21 +++++++++++++++- lemoncurry/templates/lemoncurry/layout.html | 1 + lemoncurry/theme.py | 11 ++++++++ wellknowns/urls.py | 1 + wellknowns/views/__init__.py | 1 + wellknowns/views/manifest.py | 28 +++++++++++++++++++++ 7 files changed, 63 insertions(+), 1 deletion(-) create mode 100644 lemoncurry/theme.py create mode 100644 wellknowns/views/manifest.py diff --git a/Pipfile b/Pipfile index 64d2ca9..0b7f1de 100644 --- a/Pipfile +++ b/Pipfile @@ -27,6 +27,7 @@ bleach = "*" django-debug-toolbar = "*" xrd = "*" django-push = "*" +pyyaml = "*" [dev-packages] diff --git a/Pipfile.lock b/Pipfile.lock index 52e2a88..942a002 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "bf80c6036fc124e9afa1aa029b73d614b477dba02cf948696dd8eb1fa50dc745" + "sha256": "dc4aa7d01f78e031ce0e169c70b3056b8a436bfc3195126b6a801943ee39e2fb" }, "host-environment-markers": { "implementation_name": "cpython", @@ -344,6 +344,25 @@ ], "version": "==2017.2" }, + "pyyaml": { + "hashes": [ + "sha256:3262c96a1ca437e7e4763e2843746588a965426550f3797a79fca9c6199c431f", + "sha256:16b20e970597e051997d90dc2cddc713a2876c47e3d92d59ee198700c5427736", + "sha256:e863072cdf4c72eebf179342c94e6989c67185842d9997960b3e69290b2fa269", + "sha256:bc6bced57f826ca7cb5125a10b23fd0f2fff3b7c4701d64c439a300ce665fff8", + "sha256:c01b880ec30b5a6e6aa67b09a2fe3fb30473008c85cd6a67359a1b15ed6d83a4", + "sha256:827dc04b8fa7d07c44de11fabbc888e627fa8293b695e0f99cb544fdfa1bf0d1", + "sha256:592766c6303207a20efc445587778322d7f73b161bd994f227adaa341ba212ab", + "sha256:5f84523c076ad14ff5e6c037fe1c89a7f73a3e04cf0377cb4d017014976433f3", + "sha256:0c507b7f74b3d2dd4d1322ec8a94794927305ab4cebbe89cc47fe5e81541e6e8", + "sha256:b4c423ab23291d3945ac61346feeb9a0dc4184999ede5e7c43e1ffb975130ae6", + "sha256:ca233c64c6e40eaa6c66ef97058cdc80e8d0157a443655baa1b2966e812807ca", + "sha256:4474f8ea030b5127225b8894d626bb66c01cda098d47a2b0d3429b6700af9fd8", + "sha256:326420cbb492172dec84b0f65c80942de6cedb5233c413dd824483989c000608", + "sha256:5ac82e411044fb129bae5cfbeb3ba626acb2af31a8d17d175004b70862a741a7" + ], + "version": "==3.12" + }, "qrcode": { "hashes": [ "sha256:60222a612b83231ed99e6cb36e55311227c395d0d0f62e41bb51ebbb84a9a22b", diff --git a/lemoncurry/templates/lemoncurry/layout.html b/lemoncurry/templates/lemoncurry/layout.html index 01c88c4..1584152 100644 --- a/lemoncurry/templates/lemoncurry/layout.html +++ b/lemoncurry/templates/lemoncurry/layout.html @@ -9,6 +9,7 @@ + diff --git a/lemoncurry/theme.py b/lemoncurry/theme.py new file mode 100644 index 0000000..fe87aac --- /dev/null +++ b/lemoncurry/theme.py @@ -0,0 +1,11 @@ +from django.conf import settings +from os.path import join +from yaml import safe_load + +path = join( + settings.BASE_DIR, + 'lemoncurry', 'static', + 'base16-materialtheme-scheme', 'material-darker.yaml', +) +with open(path, 'r') as f: + theme = safe_load(f) diff --git a/wellknowns/urls.py b/wellknowns/urls.py index 2764545..cf24570 100644 --- a/wellknowns/urls.py +++ b/wellknowns/urls.py @@ -7,5 +7,6 @@ urlpatterns = [ url(r'^keybase.txt$', views.keybase, name='keybase'), url(r'^host-meta$', views.host_meta_xml, name='host-meta'), url(r'^host-meta.json$', views.host_meta_json, name='host-meta.json'), + url(r'^manifest.json$', views.manifest, name='manifest'), url(r'^webfinger$', views.webfinger, name='webfinger'), ] diff --git a/wellknowns/views/__init__.py b/wellknowns/views/__init__.py index d50efaf..dd2ff0f 100644 --- a/wellknowns/views/__init__.py +++ b/wellknowns/views/__init__.py @@ -1,3 +1,4 @@ from .static import keybase from .host_meta import host_meta_xml, host_meta_json +from .manifest import manifest from .webfinger import webfinger diff --git a/wellknowns/views/manifest.py b/wellknowns/views/manifest.py new file mode 100644 index 0000000..cc55f28 --- /dev/null +++ b/wellknowns/views/manifest.py @@ -0,0 +1,28 @@ +from django.conf import settings +from django.http import JsonResponse +from favicon.models import FaviconImg +from lemoncurry import utils +from lemoncurry.theme import theme +from urllib.parse import urljoin + + +def manifest(request): + origin = utils.origin(request) + app = { + 'name': settings.LEMONCURRY_SITE_NAME, + 'background_color': '#' + theme['base00'], + 'theme_color': '#' + theme['base02'], + } + + rels = ('shortcut icon', 'apple-touch-icon') + icons = FaviconImg.objects.filter( + faviconFK__isFavicon=True, + rel__in=rels, + ).order_by('size') + app['icons'] = [{ + 'type': 'image/png', + 'size': '{0}x{0}'.format(icon.size), + 'src': urljoin(origin, icon.faviconImage.url), + } for icon in icons] + + return JsonResponse(app, content_type='application/manifest+json')