From e15de01cfaf7586390ee8d0c38ac9c0686bb2782 Mon Sep 17 00:00:00 2001 From: Matthew Grove Date: Fri, 20 Jan 2023 17:46:21 +0000 Subject: [PATCH] [FEAT] Enable PWA functionality --- breccia_mapper/settings.py | 49 +++++++++++++++++++++- breccia_mapper/static/js/serviceworker.js | 24 +++++++++++ breccia_mapper/templates/base.html | 5 +++ breccia_mapper/urls.py | 3 ++ media/icon-192x192.png | Bin 0 -> 6234 bytes media/icon.png | Bin 0 -> 18575 bytes people/fixtures/email_templates.json | 4 +- requirements.txt | 1 + 8 files changed, 82 insertions(+), 4 deletions(-) create mode 100644 breccia_mapper/static/js/serviceworker.js create mode 100644 media/icon-192x192.png create mode 100644 media/icon.png diff --git a/breccia_mapper/settings.py b/breccia_mapper/settings.py index 4ddf406..cdade2c 100644 --- a/breccia_mapper/settings.py +++ b/breccia_mapper/settings.py @@ -146,6 +146,7 @@ THIRD_PARTY_APPS = [ 'post_office', 'bootstrap_datepicker_plus', 'hijack', + 'pwa', ] FIRST_PARTY_APPS = [ @@ -348,9 +349,17 @@ CONSTANCE_CONFIG = { 'RELATIONSHIP_FORM_HELP': ( '', 'Help text to display at the top of relationship forms.'), - 'DEPLOYMENT_URL': ( + 'SITE_URL': ( 'http://localhost', 'URL at which this mapper tool is accessible - do NOT include a trailing forward slash'), + 'SITE_ICON': ( + 'icon.png', + 'Site icon', + 'image_field'), + 'SITE_ICON_192x192': ( + 'icon-192x192.png', + 'Site icon', + 'image_field'), 'PARENT_PROJECT_NAME': ( '', 'Parent project name'), @@ -449,7 +458,9 @@ CONSTANCE_CONFIG_FIELDSETS = { 'RELATIONSHIP_FORM_HELP', ), 'Deployment': ( - 'DEPLOYMENT_URL', + 'SITE_URL', + 'SITE_ICON', + 'SITE_ICON_192x192', ), } # yapf: disable @@ -503,6 +514,40 @@ BOOTSTRAP_DATEPICKER_PLUS = { } } +# PWA settings + +PWA_SERVICE_WORKER_PATH = BASE_DIR.joinpath('static/js', 'serviceworker.js') + +PWA_APP_NAME = 'networkmapper' +PWA_APP_DESCRIPTION = "Network Mapper" +PWA_APP_THEME_COLOR = '#000000' +PWA_APP_BACKGROUND_COLOR = '#ffffff' +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': 'media/icon-192x192.png', + 'sizes': '160x160' + } +] +PWA_APP_ICONS_APPLE = [ + { + 'src': 'media/icon-192x192.png', + 'sizes': '160x160' + } +] +PWA_APP_SPLASH_SCREEN = [ + { + 'src': 'media/icon.png', + 'media': '(device-width: 320px) and (device-height: 568px) and (-webkit-device-pixel-ratio: 2)' + } +] +PWA_APP_DIR = 'ltr' +PWA_APP_LANG = 'en-GB' + # Database default automatic primary key DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' diff --git a/breccia_mapper/static/js/serviceworker.js b/breccia_mapper/static/js/serviceworker.js new file mode 100644 index 0000000..9ed99a2 --- /dev/null +++ b/breccia_mapper/static/js/serviceworker.js @@ -0,0 +1,24 @@ +var staticCacheName = "djangopwa-v1"; + +self.addEventListener("install", function (event) { + event.waitUntil( + caches.open(staticCacheName).then(function (cache) { + return cache.addAll([""]); + }) + ); +}); + +self.addEventListener("fetch", function (event) { + var requestUrl = new URL(event.request.url); + if (requestUrl.origin === location.origin) { + if (requestUrl.pathname === "/") { + event.respondWith(caches.match("")); + return; + } + } + event.respondWith( + caches.match(event.request).then(function (response) { + return response || fetch(event.request); + }) + ); +}); diff --git a/breccia_mapper/templates/base.html b/breccia_mapper/templates/base.html index a7ef1fc..49cc7de 100755 --- a/breccia_mapper/templates/base.html +++ b/breccia_mapper/templates/base.html @@ -6,6 +6,11 @@ {% endif %} +{% load pwa %} +{% progressive_web_app_meta %} + + + diff --git a/breccia_mapper/urls.py b/breccia_mapper/urls.py index c5d5b9f..915b373 100644 --- a/breccia_mapper/urls.py +++ b/breccia_mapper/urls.py @@ -54,4 +54,7 @@ urlpatterns = [ path('', include('activities.urls')), + + path('', + include('pwa.urls')), ] # yapf: disable diff --git a/media/icon-192x192.png b/media/icon-192x192.png new file mode 100644 index 0000000000000000000000000000000000000000..311b68fe6fcbe0488fc005303d1b99cc44e724a6 GIT binary patch literal 6234 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 config.PROJECT_LONG_NAME }}

Dear user,


Welcome to {{ config.PROJECT_LONG_NAME }}. You can set your password here.


Thanks,

The {{ config.PROJECT_SHORT_NAME }} team

", + "content": "Dear user,\r\n\r\nWelcome to {{ config.PROJECT_LONG_NAME }}. You can set your password at {{ config.SITE_URL }}/password_reset/.\r\n\r\nThanks,\r\n\r\nThe {{ config.PROJECT_SHORT_NAME }} team", + "html_content": "

{{ config.PROJECT_LONG_NAME }}


Dear user,


Welcome to {{ config.PROJECT_LONG_NAME }}. You can set your password here.


Thanks,

The {{ config.PROJECT_SHORT_NAME }} team

", "language": "", "default_template": null } diff --git a/requirements.txt b/requirements.txt index 33d0c1f..4c53580 100755 --- a/requirements.txt +++ b/requirements.txt @@ -12,6 +12,7 @@ django-filter==22.1 django-hijack==3.2.6 django-picklefield==3.1 django-post-office==3.6.3 +django-pwa==1.1.0 django-select2==8.0.0 django-settings-export==1.2.1 djangorestframework==3.14.0