Skip to content

Commit e224795

Browse files
committed
Add User interface to admin to send push notifications
1 parent 557217a commit e224795

File tree

5 files changed

+63
-5
lines changed

5 files changed

+63
-5
lines changed

.gitignore

+3-1
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,6 @@ static/
55

66
demo/settings/local.py
77

8-
__pycache__
8+
__pycache__
9+
10+
serviceaccount.json

Pipfile

+1
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ redis = "*"
1515
psycopg2 = "*"
1616
python-dotenv = "*"
1717
watchfiles = "*"
18+
django-etc = "*"
1819

1920
[dev-packages]
2021
black = "*"

Pipfile.lock

+9-2
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

firebase_push/admin.py

+48
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,61 @@
22

33
from django.conf import settings
44
from django.contrib import admin
5+
from django.contrib.auth import get_user_model
6+
from django.db import models
57
from django.db.models import QuerySet
68
from django.http import HttpRequest
79
from django.utils.module_loading import import_string
10+
from etc.admin import CustomModelPage, admins
811

912
from firebase_push.models import FCMDevice, FCMTopic
1013

1114

15+
UserModel = settings.FCM_USER_MODEL or settings.AUTH_USER_MODEL
16+
User = get_user_model()
17+
18+
19+
class PushSenderAdmin(admins.CustomPageModelAdmin):
20+
fields = ("title", "body", "link", "user", "topic")
21+
autocomplete_fields = ("user", "topic")
22+
23+
24+
class PushSender(CustomModelPage):
25+
app_label = "firebase_push"
26+
27+
# Define some fields.
28+
title = models.CharField("Push Notification Title", max_length=100, blank=True)
29+
body = models.CharField("Push Notification Body", max_length=1024, blank=True)
30+
link = models.CharField("Push Notification Deeplink", max_length=1024, blank=True)
31+
32+
user = models.ForeignKey(UserModel, on_delete=models.CASCADE)
33+
topic = models.ForeignKey(FCMTopic, null=True, blank=True, on_delete=models.CASCADE)
34+
35+
admin_cls = PushSenderAdmin # set admin class for this page
36+
37+
class Meta:
38+
verbose_name = "Send Push Notification"
39+
40+
def save(self):
41+
from firebase_push.message import PushMessage
42+
43+
link = self.link if self.link else None
44+
pm = PushMessage(self.title, self.body, link=link)
45+
pm.add_user(self.user)
46+
if self.topic:
47+
pm.add_topic(self.topic)
48+
pm.send()
49+
50+
# self.bound_admin has some useful methods.
51+
# self.bound_request allows you to access current HTTP request.
52+
self.bound_admin.message_success(self.bound_request, "Notification queued!")
53+
54+
super().save()
55+
56+
57+
PushSender.register()
58+
59+
1260
@admin.register(FCMDevice)
1361
class FCMDeviceAdmin(admin.ModelAdmin):
1462
ordering = ("updated_at",)

firebase_push/tasks.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,15 @@
77

88
from firebase_push.models import FCMHistoryBase
99

10-
from .message import PushMessageBase
11-
1210

1311
FCM_RETRY_EXCEPTIONS = (HTTPError, Timeout)
1412
firebase = firebase_admin.initialize_app()
1513

1614

1715
@shared_task(autoretry_for=FCM_RETRY_EXCEPTIONS, retry_backoff=True)
1816
def send_message(message: str):
17+
from .message import PushMessageBase
18+
1919
message = PushMessageBase.from_json(message)
2020
messages = message.fanout()
2121
for history_items, message in messages:

0 commit comments

Comments
 (0)