Ich habe eine E-Mail-/SMS-Benachrichtigungs-Engine erstellt. Eine Person oder Gruppe kann ein Objekt abonnieren und wenn das Objekt aktualisiert wird, werden die Personen/Gruppen per E-Mail/SMS über die Änderung informiert.Django: Erstellen einer Benachrichtigungs-Engine
Derzeit habe ich es, wie unten ausgeführt:
models.py
class Subscription(models.Model):
# subscribers
people = models.ManyToManyField(Person)
groups = models.ManyToManyField(Group)
# mandatory fields for generic relation
content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
object_id = models.PositiveIntegerField()
content_object = GenericForeignKey()
mixins.py
class NotificationMixin(object):
def perform_update(self, serializer):
model_name = str.lower(serializer.Meta.model)
old_obj = model.objects.get(id=serializer.data['id'])
obj = serializer.save()
self.notify(model_name, old_obj, obj)
def notify(self, model_name, old_obj, obj):
# All models have a GenericRelation field for reverse searching
subscriptions = Subscription.objects.filter(**{ model_name: obj })
// *rest of logic to iterate over subscriptions and email people/groups
generische Beziehungen Mit der django Content, kann ich eine Person abonnieren/Gruppe zu einem beliebigen Objekt.
Ich möchte die Möglichkeit hinzufügen, globale Subskriptionen mit demselben Abonnementmodell zu erstellen, sodass sie alle in derselben Tabelle gespeichert werden. Ein globales Abonnement verfügt nicht über ein Objekt, das verfolgt wird. Wenn jedoch ein Objekt eines bestimmten Modells ausgelöst wird, werden E-Mails gesendet.
Ich habe Probleme mit der Generalisierung meines Subskriptionsmodells, um eine Modellinstanz oder das Modell zum Auslösen einer Antwort akzeptieren zu können.
Die Funktionalität Ich möchte:
Globale Abonnements
- Leute/aktualisiert Gruppen durch, wenn jedes Objekt des Modells X
Objektebene Abonnements
geändert wird- Leute/aktualisiert Gruppen, wenn bestimmte Objekt aktualisiert
Ist die aktuelle Modell/Architektur, dass er eine gute Möglichkeit, um dieses Problem zu gehen, oder soll ich das anders angehen?
Hinweis Das Frontend befindet sich in AngularJs, so dass es ausschließlich mit unserer Django API interagiert.