0.10.0 browser push messages
This commit is contained in:
@@ -1,14 +1,38 @@
|
||||
from django.http import HttpResponse, Http404, FileResponse
|
||||
from django.conf import settings
|
||||
|
||||
def get_inter_Dict(user):
|
||||
|
||||
from SubscribesApp.funcs import get_cur_user_subscribe
|
||||
user_subscribe = get_cur_user_subscribe(user)
|
||||
|
||||
return {'user_subscribe': user_subscribe}
|
||||
Dict = {
|
||||
'user_subscribe': user_subscribe,
|
||||
}
|
||||
from PushMessages.views import get_key_Dict
|
||||
Dict.update(get_key_Dict())
|
||||
|
||||
return Dict
|
||||
|
||||
def get_inter_http_respose(template_obj, context_Dict, request):
|
||||
|
||||
context_Dict.update(get_inter_Dict(request.user))
|
||||
|
||||
from PushMessages.views import send_push
|
||||
if request and 'page' in context_Dict:
|
||||
text = None
|
||||
title = None
|
||||
|
||||
if context_Dict['page'] == dict:
|
||||
if 'title' in context_Dict['page']:
|
||||
title = context_Dict['page']['title']
|
||||
if 'description' in context_Dict['page']:
|
||||
text = context_Dict['page']['description']
|
||||
else:
|
||||
title = getattr(context_Dict['page'], 'title', None)
|
||||
text = getattr(context_Dict['page'], 'description', None)
|
||||
|
||||
if text and title and not request.user.is_anonymous:
|
||||
send_push(user=request.user, title=title, text=text)
|
||||
|
||||
return HttpResponse(template_obj.render(context_Dict, request))
|
||||
@@ -89,6 +89,8 @@ def MainPage(request):
|
||||
'owner_type': 'mover'
|
||||
}
|
||||
|
||||
|
||||
|
||||
breadcrumbs_Dict = {
|
||||
}
|
||||
Dict.update({'breadcrumbs': breadcrumbs_Dict})
|
||||
|
||||
0
PushMessages/__init__.py
Normal file
0
PushMessages/__init__.py
Normal file
3
PushMessages/admin.py
Normal file
3
PushMessages/admin.py
Normal file
@@ -0,0 +1,3 @@
|
||||
from django.contrib import admin
|
||||
|
||||
# Register your models here.
|
||||
6
PushMessages/apps.py
Normal file
6
PushMessages/apps.py
Normal file
@@ -0,0 +1,6 @@
|
||||
from django.apps import AppConfig
|
||||
|
||||
|
||||
class PushmessagesConfig(AppConfig):
|
||||
default_auto_field = 'django.db.models.BigAutoField'
|
||||
name = 'PushMessages'
|
||||
0
PushMessages/migrations/__init__.py
Normal file
0
PushMessages/migrations/__init__.py
Normal file
3
PushMessages/models.py
Normal file
3
PushMessages/models.py
Normal file
@@ -0,0 +1,3 @@
|
||||
from django.db import models
|
||||
|
||||
# Create your models here.
|
||||
3
PushMessages/tests.py
Normal file
3
PushMessages/tests.py
Normal file
@@ -0,0 +1,3 @@
|
||||
from django.test import TestCase
|
||||
|
||||
# Create your tests here.
|
||||
16
PushMessages/urls.py
Normal file
16
PushMessages/urls.py
Normal file
@@ -0,0 +1,16 @@
|
||||
# coding=utf-8
|
||||
from django.urls import path, include
|
||||
# from AuthApp.js_views import *
|
||||
# from AuthApp.import_funcs import *
|
||||
from .views import *
|
||||
from django.contrib.auth import views
|
||||
from RoutesApp.js_views import new_route_view_ajax
|
||||
from django.views.generic import TemplateView
|
||||
|
||||
urlpatterns = [
|
||||
|
||||
path('send_push', send_push),
|
||||
path('webpush/', include('webpush.urls')),
|
||||
path('sw.js', TemplateView.as_view(template_name='sw.js', content_type='application/x-javascript')),
|
||||
|
||||
]
|
||||
39
PushMessages/views.py
Normal file
39
PushMessages/views.py
Normal file
@@ -0,0 +1,39 @@
|
||||
from django.http.response import JsonResponse, HttpResponse
|
||||
from django.views.decorators.http import require_GET, require_POST
|
||||
from django.contrib.auth.models import User
|
||||
from django.views.decorators.csrf import csrf_exempt
|
||||
from webpush import send_user_notification
|
||||
import json
|
||||
from django.shortcuts import render, get_object_or_404
|
||||
from django.conf import settings
|
||||
|
||||
|
||||
def get_key_Dict():
|
||||
webpush_settings = getattr(settings, 'WEBPUSH_SETTINGS', {})
|
||||
vapid_key = webpush_settings.get('VAPID_PUBLIC_KEY')
|
||||
Dict = {
|
||||
'vapid_key': vapid_key
|
||||
}
|
||||
return Dict
|
||||
|
||||
def send_push(user, title, text, img=None):
|
||||
try:
|
||||
# body = request.body
|
||||
# data = json.loads(body)
|
||||
#
|
||||
# if 'head' not in data or 'body' not in data or 'id' not in data:
|
||||
# return JsonResponse(status=400, data={"message": "Invalid data format"})
|
||||
#
|
||||
# user_id = data['id']
|
||||
# user = get_object_or_404(User, pk=user_id)
|
||||
Dict = {
|
||||
'head': title,
|
||||
'body': text
|
||||
}
|
||||
|
||||
# payload = {'head': data['head'], 'body': data['body']}
|
||||
send_user_notification(user=user, payload=Dict, ttl=1000)
|
||||
|
||||
return JsonResponse(status=200, data={"message": "Web push successful"})
|
||||
except TypeError:
|
||||
return JsonResponse(status=500, data={"message": "An error occurred"})
|
||||
@@ -29,6 +29,8 @@ urlpatterns = [
|
||||
path('', include('ArticlesApp.js_urls')),
|
||||
|
||||
path('test_404', Page404, name='page_404'),
|
||||
|
||||
path('', include('PushMessages.urls'))
|
||||
]
|
||||
|
||||
from django.conf.urls.i18n import i18n_patterns
|
||||
|
||||
@@ -10,4 +10,5 @@ channels==4.0.0
|
||||
daphne==4.0.0
|
||||
channels-redis==4.1.0
|
||||
django-colorfield
|
||||
django-webpush==0.3.5
|
||||
|
||||
|
||||
91
static/js/push/registerSw.js
Normal file
91
static/js/push/registerSw.js
Normal file
@@ -0,0 +1,91 @@
|
||||
const registerSw = async () => {
|
||||
if ('serviceWorker' in navigator) {
|
||||
const reg = await navigator.serviceWorker.register('/sw.js');
|
||||
initialiseState(reg)
|
||||
|
||||
} else {
|
||||
showNotAllowed("You can't send push notifications ☹️😢")
|
||||
}
|
||||
};
|
||||
|
||||
const initialiseState = (reg) => {
|
||||
if (!reg.showNotification) {
|
||||
showNotAllowed('Showing notifications isn\'t supported ☹️😢');
|
||||
return
|
||||
}
|
||||
if (Notification.permission === 'denied') {
|
||||
showNotAllowed('You prevented us from showing notifications ☹️🤔');
|
||||
return
|
||||
}
|
||||
if (!'PushManager' in window) {
|
||||
showNotAllowed("Push isn't allowed in your browser 🤔");
|
||||
return
|
||||
}
|
||||
subscribe(reg);
|
||||
}
|
||||
|
||||
const showNotAllowed = (message) => {
|
||||
const button = document.querySelector('form>button');
|
||||
button.innerHTML = `${message}`;
|
||||
button.setAttribute('disabled', 'true');
|
||||
};
|
||||
|
||||
function urlB64ToUint8Array(base64String) {
|
||||
const padding = '='.repeat((4 - base64String.length % 4) % 4);
|
||||
const base64 = (base64String + padding)
|
||||
.replace(/\-/g, '+')
|
||||
.replace(/_/g, '/');
|
||||
|
||||
const rawData = window.atob(base64);
|
||||
const outputArray = new Uint8Array(rawData.length);
|
||||
const outputData = outputArray.map((output, index) => rawData.charCodeAt(index));
|
||||
|
||||
return outputData;
|
||||
}
|
||||
|
||||
const subscribe = async (reg) => {
|
||||
const subscription = await reg.pushManager.getSubscription();
|
||||
if (subscription) {
|
||||
sendSubData(subscription);
|
||||
return;
|
||||
}
|
||||
|
||||
const vapidMeta = document.querySelector('meta[name="vapid-key"]');
|
||||
const key = vapidMeta.content;
|
||||
const options = {
|
||||
userVisibleOnly: true,
|
||||
// if key exists, create applicationServerKey property
|
||||
...(key && {applicationServerKey: urlB64ToUint8Array(key)})
|
||||
};
|
||||
|
||||
const sub = await reg.pushManager.subscribe(options);
|
||||
sendSubData(sub)
|
||||
};
|
||||
|
||||
const sendSubData = async (subscription) => {
|
||||
const browser = navigator.userAgent.match(/(firefox|msie|chrome|safari|trident)/ig)[0].toLowerCase();
|
||||
const data = {
|
||||
status_type: 'subscribe',
|
||||
subscription: subscription.toJSON(),
|
||||
browser: browser,
|
||||
user_agent: browser,
|
||||
};
|
||||
|
||||
const res = await fetch('/webpush/save_information', {
|
||||
method: 'POST',
|
||||
body: JSON.stringify(data),
|
||||
headers: {
|
||||
'content-type': 'application/json',
|
||||
|
||||
},
|
||||
credentials: "include"
|
||||
});
|
||||
|
||||
handleResponse(res);
|
||||
};
|
||||
|
||||
const handleResponse = (res) => {
|
||||
console.log(res.status);
|
||||
};
|
||||
|
||||
registerSw();
|
||||
18
templates/sw.js
Normal file
18
templates/sw.js
Normal file
@@ -0,0 +1,18 @@
|
||||
// Register event listener for the 'push' event.
|
||||
self.addEventListener('push', function (event) {
|
||||
// Retrieve the textual payload from event.data (a PushMessageData object).
|
||||
// Other formats are supported (ArrayBuffer, Blob, JSON), check out the documentation
|
||||
// on https://developer.mozilla.org/en-US/docs/Web/API/PushMessageData.
|
||||
const eventInfo = event.data.text();
|
||||
const data = JSON.parse(eventInfo);
|
||||
const head = data.head || 'New Notification 🕺🕺';
|
||||
const body = data.body || 'This is default content. Your notification didn\'t have one 🙄🙄';
|
||||
|
||||
// Keep the service worker alive until the notification is created.
|
||||
event.waitUntil(
|
||||
self.registration.showNotification(head, {
|
||||
body: body,
|
||||
icon: 'static/img/svg/Logo.svg'
|
||||
})
|
||||
);
|
||||
});
|
||||
Reference in New Issue
Block a user