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))