notifications/apps/push_notifications/models.py
Sayyid Hamid Mahdavi a5f1e1340a add celery
2025-07-17 12:03:18 +03:30

66 lines
2.2 KiB
Python

from django.db import models
from oauth2_provider.settings import oauth2_settings
from apps.users.models import User
from utils.models import BaseModel
from utils.clients import gotify
from django.utils.translation import gettext_lazy as _
class PushUserQuerySet(models.QuerySet):
def submit(self, user):
push_user, created = self.get_or_create(user=user)
push_user: PushUser = push_user
push_user.submit_user()
push_user.submit_client()
push_user.submit_application()
return push_user
class PushUser(BaseModel):
user = models.ForeignKey(User, on_delete=models.PROTECT)
client_token = models.CharField(max_length=32, null=True, blank=True)
application_token = models.CharField(max_length=32, null=True, blank=True)
app_id = None
objects = PushUserQuerySet.as_manager()
def submit_user(self):
response = gotify.submit_user(str(self.user.uuid))
def submit_client(self):
if not self.client_token:
response = gotify.submit_client(str(self.user.uuid))
self.client_token = response.token
self.save()
def submit_application(self):
if not self.application_token:
response = gotify.submit_application(self.client_token, str(self.user.uuid))
self.application_token = response.token
self.save()
def send_push(self):
return
class PushMessage(BaseModel):
class StateChoices(models.IntegerChoices):
INIT = 0, _('init')
START = 1, _('Start')
DONE = 2, _('done')
TIMEOUT = 3, _('timeout')
FAILED = 4, _('failed')
push_user = models.ForeignKey(PushUser, on_delete=models.PROTECT)
application = models.ForeignKey(oauth2_settings.APPLICATION_MODEL, on_delete=models.PROTECT,
related_name='+', null=True, blank=True)
title = models.CharField(max_length=128)
message = models.TextField()
priority = models.IntegerField(default=5)
extras = models.JSONField(default=dict)
stats = models.IntegerField(default=StateChoices.INIT, choices=StateChoices.choices)
def send_push(self):
from apps.push_notifications.tasks import send_push_notification
send_push_notification.delay(str(self.uuid))