# -*- coding: utf-8 -*-
'''
Device
============
È stata creata la classe Device estendendo la classe AbstractDevice (di django-fcm)
per ridefinirne alcuni attributi e per aggiungere funzionalità
* :class:`Device` (``AbstractDevice``, ``UserModel``, ``DateModel``, ``OrderedModel``)
Modelli
========
.. autoclass:: Device
:members:
'''
from __future__ import unicode_literals
from django.conf import settings
from django.db import models
from django.utils import timezone
from django.utils.translation import ugettext_lazy as _
from fcm.models import AbstractDevice
from thx.core.models import UserModel, CleanModel, DateModel, OrderedModel
[documenti]class Device(AbstractDevice, UserModel, DateModel, OrderedModel):
"""``Device`` è una classe che estende ``AbstractDevice`` di ``django-fcm`` e
``CleanModel``, ``UserModel``, ``DateModel``, ``OrderedModel`` di thx-core_.
Alla classe vengono aggiunti alcuni attributi per raccogliere ulteriori informazioni dei vari
device che vengono registrati; il campo ``reference`` può essere utilizzato per indicare per
esempio l'utente o un codice univoco per individuare il device associato ad esso.
Infine sono stati aggiunti i metodi sotto riportati.
Le notifiche possono essere inviate partendo da una istanza device precisa, oppure da un queryset.
.. _thx-core: https://docs.thux.it/thx-core
"""
dev_id = models.CharField(
blank=True, null=True,
verbose_name=_("device id"),
max_length=150
)
platform = models.CharField(
verbose_name=_("platform"),
max_length=50
)
version = models.CharField(
verbose_name=_("version"),
max_length=150
)
reference = models.CharField(
blank=True, null=True,
max_length=150,
verbose_name=_('reference'),
)
class Meta:
verbose_name = _('device')
verbose_name_plural = _('devices')
ordering = ('ordering', '-date_last_modify')
permissions = (
("list_device", "Can list device"),
("detail_device", "Can detail device"),
("disable_device", "Can disable device"),
)
def __str__(self):
return '{}: {} {}...'.format(
self.reference,
self.dev_id or '',
self.reg_id[0:10]
)
[documenti] @classmethod
def get_test_data_for_push(cls):
"genera payload di esempio per il campo data (sezione custom della notifica)"
return {
"text": "Test FCM send <strong> YES! </strong> test length test length test length test length.",
"label": f"Test FCM send {timezone.now()}",
"date": "16:33",
"link": {
"label": 'Go to your badges',
"url": 'notification-center'
},
"display": False,
"icon": 'statics/svg-icons/profile-trophy.svg'
}
[documenti] @classmethod
def get_test_notification_for_push(cls):
"genera payload di esempio per il campo notification (sezione base per la notifica)"
return {
"message": "Message: Test FCM send",
"title": "Title: Test FCM send",
"body": f"Body: Test FCM send {timezone.now()}",
"icon": "https://adrenalinik.quasar.thux.dev/statics/icons/android-icon-192x192.png"
}
[documenti] def mark_inactive(self, **kwargs):
"metodo ingaggiato dal sistema quando si ottiene una risposta di device invalido da FCM"
super(Device, self).mark_inactive(**kwargs)
if getattr(settings, 'THX_FCM_DEVICE_DELETE_INVALID_REG_ID', False):
self.delete()
[documenti] def send_test_push_message(self, data=None, notification=None, extra_option=None):
"""invia notifica di test tramite FCM
:arg data: payload customizzato da inviare con la notifica; se non valorizzata verrà impostata col metodo get_test_data_for_push
:arg notification: payload di base della notifica; se non valorizzata verrà impostata col metodo get_test_notification_for_push
:arg extra_options: payload extra da inviare con la notifica; se non valorizzata verrà impostata col metodo get_test_extra_option_for_push
"""
if not data:
data = self.get_test_data_for_push()
if not notification:
notification = self.get_test_notification_for_push()
if not extra_option:
extra_option = self.get_test_extra_option_for_push()
self.send_message(data=data, notification=notification, **extra_option)