|
2 | 2 |
|
3 | 3 | from django.conf import settings
|
4 | 4 | from django.contrib import admin
|
| 5 | +from django.contrib.auth import get_user_model |
| 6 | +from django.db import models |
5 | 7 | from django.db.models import QuerySet
|
6 | 8 | from django.http import HttpRequest
|
7 | 9 | from django.utils.module_loading import import_string
|
| 10 | +from etc.admin import CustomModelPage, admins |
8 | 11 |
|
9 | 12 | from firebase_push.models import FCMDevice, FCMTopic
|
10 | 13 |
|
11 | 14 |
|
| 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 | + |
12 | 60 | @admin.register(FCMDevice)
|
13 | 61 | class FCMDeviceAdmin(admin.ModelAdmin):
|
14 | 62 | ordering = ("updated_at",)
|
|
0 commit comments