Compare commits
18 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 11ea32ef6e | |||
|
|
0ff60e7afa | ||
|
|
e38a9307eb | ||
|
|
257f2f2922 | ||
|
|
a410a6575a | ||
|
|
5f50788bf4 | ||
|
|
991a6ee8c2 | ||
|
|
0d4488a0c5 | ||
|
|
8e39aebe17 | ||
|
|
43a8131e8e | ||
|
|
61cdbf6727 | ||
|
|
67cf917a08 | ||
|
|
63139af3f3 | ||
|
|
3c36673a21 | ||
|
|
82f1abb342 | ||
|
|
83fa72fcac | ||
|
|
4f641bc79a | ||
|
|
447aa7c06d |
@@ -58,4 +58,10 @@
|
||||
### Added
|
||||
- Updated manifest.json by adding scope parameter.
|
||||
- Updated serviceworker.js add scope dynamic parameter
|
||||
|
||||
|
||||
## 1.0.7
|
||||
|
||||
### Fixed
|
||||
- Fix PWA if app is not mounted in root of webserver
|
||||
### Added
|
||||
- Allow use of view names in PWA_APP_SCOPE, PWA_START_URL, PWA_APP_FETCH_URL and PWA_APP_ROOT
|
||||
|
||||
@@ -54,12 +54,19 @@ PWA_APP_DISPLAY = 'standalone'
|
||||
PWA_APP_SCOPE = '/'
|
||||
PWA_APP_ORIENTATION = 'any'
|
||||
PWA_APP_START_URL = '/'
|
||||
PWA_APP_STATUS_BAR_COLOR = 'default'
|
||||
PWA_APP_ICONS = [
|
||||
{
|
||||
'src': '/static/images/my_app_icon.png',
|
||||
'sizes': '160x160'
|
||||
}
|
||||
]
|
||||
PWA_APP_ICONS_APPLE = [
|
||||
{
|
||||
'src': '/static/images/my_apple_icon.png',
|
||||
'sizes': '160x160'
|
||||
}
|
||||
]
|
||||
PWA_APP_SPLASH_SCREEN = [
|
||||
{
|
||||
'src': '/static/images/icons/splash-640x1136.png',
|
||||
|
||||
@@ -1,7 +1,16 @@
|
||||
""" Settings required by django-app. """
|
||||
from django.conf import settings
|
||||
from django.shortcuts import resolve_url
|
||||
from django.urls import get_script_prefix
|
||||
from django.utils.functional import lazy
|
||||
import os
|
||||
|
||||
# Lazy-evaluate URLs so including pwa.urls in root urlconf works
|
||||
resolve_url = lazy(resolve_url, str)
|
||||
|
||||
# Get script prefix for apps not mounted under /
|
||||
_PWA_SCRIPT_PREFIX = get_script_prefix()
|
||||
|
||||
# Path to the service worker implementation. Default implementation is empty.
|
||||
PWA_SERVICE_WORKER_PATH = getattr(settings, 'PWA_SERVICE_WORKER_PATH',
|
||||
os.path.join(os.path.abspath(os.path.dirname(__file__)), 'templates',
|
||||
@@ -9,15 +18,16 @@ PWA_SERVICE_WORKER_PATH = getattr(settings, 'PWA_SERVICE_WORKER_PATH',
|
||||
# App parameters to include in manifest.json and appropriate meta tags
|
||||
PWA_APP_NAME = getattr(settings, 'PWA_APP_NAME', 'MyApp')
|
||||
PWA_APP_DESCRIPTION = getattr(settings, 'PWA_APP_DESCRIPTION', 'My Progressive Web App')
|
||||
PWA_APP_ROOT_URL = getattr(settings, 'PWA_APP_ROOT_URL', '/')
|
||||
PWA_APP_ROOT_URL = resolve_url(getattr(settings, 'PWA_APP_ROOT_URL', _PWA_SCRIPT_PREFIX))
|
||||
PWA_APP_THEME_COLOR = getattr(settings, 'PWA_APP_THEME_COLOR', '#000')
|
||||
PWA_APP_BACKGROUND_COLOR = getattr(settings, 'PWA_APP_BACKGROUND_COLOR', '#fff')
|
||||
PWA_APP_DISPLAY = getattr(settings, 'PWA_APP_DISPLAY', 'standalone')
|
||||
PWA_APP_SCOPE = getattr(settings, 'PWA_APP_SCOPE', '/')
|
||||
PWA_APP_SCOPE = resolve_url(getattr(settings, 'PWA_APP_SCOPE', _PWA_SCRIPT_PREFIX))
|
||||
PWA_APP_DEBUG_MODE = getattr(settings, 'PWA_APP_DEBUG_MODE', True)
|
||||
PWA_APP_ORIENTATION = getattr(settings, 'PWA_APP_ORIENTATION', 'any')
|
||||
PWA_APP_START_URL = getattr(settings, 'PWA_APP_START_URL', '/')
|
||||
PWA_APP_FETCH_URL = getattr(settings, 'PWA_APP_FETCH_URL', '/')
|
||||
PWA_APP_START_URL = resolve_url(getattr(settings, 'PWA_APP_START_URL', _PWA_SCRIPT_PREFIX))
|
||||
PWA_APP_FETCH_URL = resolve_url(getattr(settings, 'PWA_APP_FETCH_URL', _PWA_SCRIPT_PREFIX))
|
||||
PWA_APP_STATUS_BAR_COLOR = getattr(settings, 'PWA_APP_STATUS_BAR_COLOR', 'default')
|
||||
PWA_APP_ICONS = getattr(settings, 'PWA_APP_ICONS', [
|
||||
{
|
||||
'src': '/static/images/icons/icon-72x72.png',
|
||||
@@ -97,5 +107,3 @@ PWA_APP_SPLASH_SCREEN = getattr(settings, 'PWA_APP_SPLASH_SCREEN', [
|
||||
])
|
||||
PWA_APP_DIR = getattr(settings, 'PWA_APP_DIR', 'auto')
|
||||
PWA_APP_LANG = getattr(settings, 'PWA_APP_LANG', 'en-US')
|
||||
|
||||
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
"orientation": {{ PWA_APP_ORIENTATION|js }},
|
||||
"background_color": {{ PWA_APP_BACKGROUND_COLOR|js }},
|
||||
"theme_color": {{ PWA_APP_THEME_COLOR|js }},
|
||||
"status_bar": {{ PWA_APP_STATUS_BAR_COLOR|js }},
|
||||
"icons": {{ PWA_APP_ICONS|js }},
|
||||
"dir": {{ PWA_APP_DIR|js }},
|
||||
"lang": {{ PWA_APP_LANG|js }}
|
||||
|
||||
@@ -12,13 +12,20 @@
|
||||
<!-- Add to homescreen for Safari on iOS -->
|
||||
<meta name="apple-mobile-web-app-capable" content="yes">
|
||||
<meta name="apple-mobile-web-app-title" content="{{ PWA_APP_NAME }}">
|
||||
<meta name="apple-mobile-web-app-status-bar-style" content="default">
|
||||
{% for icon in PWA_APP_ICONS %}
|
||||
<link rel="apple-touch-icon" href="{{ icon.src }}" sizes="{{ icon.size }}">
|
||||
{% endfor %}
|
||||
<meta name="apple-mobile-web-app-status-bar-style" content="{{ PWA_APP_STATUS_BAR_COLOR }}">
|
||||
|
||||
{% if PWA_APP_ICONS_APPLE %}
|
||||
{% for icon in PWA_APP_ICONS_APPLE %}
|
||||
<link rel="apple-touch-icon" href="{{ icon.src }}" sizes="{{ icon.size }}">
|
||||
{% endfor %}
|
||||
{% else %}
|
||||
{% for icon in PWA_APP_ICONS %}
|
||||
<link rel="apple-touch-icon" href="{{ icon.src }}" sizes="{{ icon.size }}">
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
|
||||
|
||||
{% for splash in PWA_APP_SPLASH_SCREEN%}
|
||||
{% for splash in PWA_APP_SPLASH_SCREEN %}
|
||||
<link href="{{ splash.src }}" media="{{ splash.media }}" rel="apple-touch-startup-image"/>
|
||||
{% endfor %}
|
||||
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
from django.conf.urls import url
|
||||
from django.urls import re_path
|
||||
|
||||
from .views import manifest, service_worker, offline
|
||||
|
||||
# Serve up serviceworker.js and manifest.json at the root
|
||||
urlpatterns = [
|
||||
url('^serviceworker.js$', service_worker, name='serviceworker'),
|
||||
url('^manifest.json$', manifest, name='manifest'),
|
||||
url('^offline/$', offline, name='offline')
|
||||
re_path(r'^serviceworker\.js$', service_worker, name='serviceworker'),
|
||||
re_path(r'^manifest\.json$', manifest, name='manifest'),
|
||||
re_path('^offline/$', offline, name='offline')
|
||||
]
|
||||
|
||||
@@ -14,7 +14,7 @@ def manifest(request):
|
||||
setting_name: getattr(app_settings, setting_name)
|
||||
for setting_name in dir(app_settings)
|
||||
if setting_name.startswith('PWA_')
|
||||
})
|
||||
}, content_type='application/json')
|
||||
|
||||
|
||||
def offline(request):
|
||||
|
||||
@@ -1,2 +1,2 @@
|
||||
pypandoc==1.3.3
|
||||
tox==3.2.1
|
||||
pypandoc==1.5
|
||||
tox==3.16.1
|
||||
5
setup.py
5
setup.py
@@ -4,9 +4,7 @@ from setuptools import find_packages, setup
|
||||
short_description = 'A Django app to include a manifest.json and Service Worker instance to enable progressive web ' \
|
||||
'app behavior '
|
||||
|
||||
# noinspection PyBroadException
|
||||
try:
|
||||
# noinspection PyPackageRequirements
|
||||
import pypandoc
|
||||
|
||||
long_description = pypandoc.convert('README.md', 'rst')
|
||||
@@ -22,7 +20,7 @@ install_requirements = [
|
||||
|
||||
setup(
|
||||
name='django-pwa',
|
||||
version='1.0.6',
|
||||
version='1.0.10',
|
||||
packages=find_packages(),
|
||||
install_requires=install_requirements,
|
||||
include_package_data=True,
|
||||
@@ -52,6 +50,7 @@ setup(
|
||||
'Programming Language :: Python :: 3.5',
|
||||
'Programming Language :: Python :: 3.6',
|
||||
'Programming Language :: Python :: 3.7',
|
||||
'Programming Language :: Python :: 3.8',
|
||||
'Topic :: Internet :: WWW/HTTP',
|
||||
'Topic :: Internet :: WWW/HTTP :: Dynamic Content',
|
||||
],
|
||||
|
||||
@@ -19,7 +19,8 @@ class AppSettingsTest(TestCase):
|
||||
'PWA_APP_FETCH_URL',
|
||||
'PWA_APP_ICONS',
|
||||
'PWA_APP_DIR',
|
||||
'PWA_APP_LANG'
|
||||
'PWA_APP_LANG',
|
||||
'PWA_APP_STATUS_BAR_COLOR'
|
||||
]
|
||||
for attr in attributes:
|
||||
with self.subTest():
|
||||
|
||||
@@ -19,6 +19,10 @@ class ManifestTest(TestCase):
|
||||
"""GET /manifest.json Should return status code 200"""
|
||||
self.assertEqual(self.response.status_code, 200)
|
||||
|
||||
def test_content_type_json(self):
|
||||
"""The content type Must be JSON"""
|
||||
self.assertEqual(self.response['content-type'], 'application/json')
|
||||
|
||||
def test_template(self):
|
||||
"""Must have the template manifest.json"""
|
||||
self.assertTemplateUsed(self.response, 'manifest.json')
|
||||
@@ -37,7 +41,8 @@ class ManifestTest(TestCase):
|
||||
'"orientation":',
|
||||
'"icons":',
|
||||
'"dir":',
|
||||
'"lang":'
|
||||
'"lang":',
|
||||
'"status_bar":'
|
||||
]
|
||||
for expected in contents:
|
||||
with self.subTest():
|
||||
|
||||
4
tox.ini
4
tox.ini
@@ -6,6 +6,7 @@ envlist =
|
||||
py37-django{20}
|
||||
py37-django{21}
|
||||
py37-django{30}
|
||||
py38-django{30}
|
||||
|
||||
[testenv]
|
||||
commands = python runtests.py
|
||||
@@ -16,6 +17,7 @@ basepython =
|
||||
py35: python3.5
|
||||
py36: python3.6
|
||||
py37: python3.7
|
||||
py38: python3.8
|
||||
deps =
|
||||
django18: django==1.8
|
||||
django19: django==1.9
|
||||
@@ -25,4 +27,4 @@ deps =
|
||||
django21: Django==2.1
|
||||
django30: Django==3.0
|
||||
|
||||
pypandoc==1.3.3
|
||||
pypandoc==1.5
|
||||
Reference in New Issue
Block a user