-
Notifications
You must be signed in to change notification settings - Fork 2.6k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Browse files
Browse the repository at this point in the history
* Initial work on #15621 * Signal receiver should ignore models which don't support notifications * Flesh out NotificationGroup functionality * Add NotificationGroup filters for users & groups * Separate read & dimiss actions * Enable one-click dismissals from notifications list * Include total notification count in dropdown * Drop 'kind' field from Notification model * Register event types in the registry; add colors & icons * Enable event rules to target notification groups * Define dynamic choices for Notification.event_name * Move event registration to core * Add more job events * Misc cleanup * Misc cleanup * Correct absolute URLs for notifications & subscriptions * Optimize subscriber notifications * Use core event types when queuing events * Standardize queued event attribute to event_type; change content_type to object_type * Rename Notification.event_name to event_type * Restore NotificationGroupBulkEditView * Add API tests * Add view & filterset tests * Add model documentation * Fix tests * Update notification bell when notifications have been cleared * Ensure subscribe button appears only on relevant models * Notifications/subscriptions cannot be ordered by object * Misc cleanup * Add event icon & type to notifications table * Adjust icon sizing * Mute color of read notifications * Misc cleanup
- Loading branch information
1 parent
1c2336b
commit b0e7294
Showing
59 changed files
with
1,913 additions
and
90 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,17 @@ | ||
# Notification | ||
|
||
A notification alerts a user that a specific action has taken place in NetBox, such as an object being modified or a background job completing. A notification may be generated via a user's [subscription](./subscription.md) to a particular object, or by an event rule targeting a [notification group](./notificationgroup.md) of which the user is a member. | ||
|
||
## Fields | ||
|
||
### User | ||
|
||
The recipient of the notification. | ||
|
||
### Object | ||
|
||
The object to which the notification relates. | ||
|
||
### Event Type | ||
|
||
The type of event indicated by the notification. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,17 @@ | ||
# Notification Group | ||
|
||
A set of NetBox users and/or groups of users identified as recipients for certain [notifications](./notification.md). | ||
|
||
## Fields | ||
|
||
### Name | ||
|
||
The name of the notification group. | ||
|
||
### Users | ||
|
||
One or more users directly designated as members of the notification group. | ||
|
||
### Groups | ||
|
||
All users of any selected groups are considered as members of the notification group. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,15 @@ | ||
# Subscription | ||
|
||
A record indicating that a user is to be notified of any changes to a particular NetBox object. A notification maps exactly one user to exactly one object. | ||
|
||
When an object to which a user is subscribed changes, a [notification](./notification.md) is generated for the user. | ||
|
||
## Fields | ||
|
||
### User | ||
|
||
The subscribed user. | ||
|
||
### Object | ||
|
||
The object to which the user is subscribed. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,33 @@ | ||
from django.utils.translation import gettext as _ | ||
|
||
from netbox.events import * | ||
|
||
__all__ = ( | ||
'JOB_COMPLETED', | ||
'JOB_ERRORED', | ||
'JOB_FAILED', | ||
'JOB_STARTED', | ||
'OBJECT_CREATED', | ||
'OBJECT_DELETED', | ||
'OBJECT_UPDATED', | ||
) | ||
|
||
# Object events | ||
OBJECT_CREATED = 'object_created' | ||
OBJECT_UPDATED = 'object_updated' | ||
OBJECT_DELETED = 'object_deleted' | ||
|
||
# Job events | ||
JOB_STARTED = 'job_started' | ||
JOB_COMPLETED = 'job_completed' | ||
JOB_FAILED = 'job_failed' | ||
JOB_ERRORED = 'job_errored' | ||
|
||
# Register core events | ||
Event(name=OBJECT_CREATED, text=_('Object created')).register() | ||
Event(name=OBJECT_UPDATED, text=_('Object updated')).register() | ||
Event(name=OBJECT_DELETED, text=_('Object deleted')).register() | ||
Event(name=JOB_STARTED, text=_('Job started')).register() | ||
Event(name=JOB_COMPLETED, text=_('Job completed'), type=EVENT_TYPE_SUCCESS).register() | ||
Event(name=JOB_FAILED, text=_('Job failed'), type=EVENT_TYPE_WARNING).register() | ||
Event(name=JOB_ERRORED, text=_('Job errored'), type=EVENT_TYPE_DANGER).register() |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,82 @@ | ||
from drf_spectacular.utils import extend_schema_field | ||
from rest_framework import serializers | ||
|
||
from core.models import ObjectType | ||
from extras.models import Notification, NotificationGroup, Subscription | ||
from netbox.api.fields import ContentTypeField, SerializedPKRelatedField | ||
from netbox.api.serializers import ValidatedModelSerializer | ||
from users.api.serializers_.users import GroupSerializer, UserSerializer | ||
from users.models import Group, User | ||
from utilities.api import get_serializer_for_model | ||
|
||
__all__ = ( | ||
'NotificationSerializer', | ||
'NotificationGroupSerializer', | ||
'SubscriptionSerializer', | ||
) | ||
|
||
|
||
class NotificationSerializer(ValidatedModelSerializer): | ||
object_type = ContentTypeField( | ||
queryset=ObjectType.objects.with_feature('notifications'), | ||
) | ||
object = serializers.SerializerMethodField(read_only=True) | ||
user = UserSerializer(nested=True) | ||
|
||
class Meta: | ||
model = Notification | ||
fields = [ | ||
'id', 'url', 'display', 'object_type', 'object_id', 'object', 'user', 'created', 'read', 'event_type', | ||
] | ||
brief_fields = ('id', 'url', 'display', 'object_type', 'object_id', 'user', 'read', 'event_type') | ||
|
||
@extend_schema_field(serializers.JSONField(allow_null=True)) | ||
def get_object(self, instance): | ||
serializer = get_serializer_for_model(instance.object) | ||
context = {'request': self.context['request']} | ||
return serializer(instance.object, nested=True, context=context).data | ||
|
||
|
||
class NotificationGroupSerializer(ValidatedModelSerializer): | ||
groups = SerializedPKRelatedField( | ||
queryset=Group.objects.all(), | ||
serializer=GroupSerializer, | ||
nested=True, | ||
required=False, | ||
many=True | ||
) | ||
users = SerializedPKRelatedField( | ||
queryset=User.objects.all(), | ||
serializer=UserSerializer, | ||
nested=True, | ||
required=False, | ||
many=True | ||
) | ||
|
||
class Meta: | ||
model = NotificationGroup | ||
fields = [ | ||
'id', 'url', 'display', 'display_url', 'name', 'description', 'groups', 'users', | ||
] | ||
brief_fields = ('id', 'url', 'display', 'name', 'description') | ||
|
||
|
||
class SubscriptionSerializer(ValidatedModelSerializer): | ||
object_type = ContentTypeField( | ||
queryset=ObjectType.objects.with_feature('notifications'), | ||
) | ||
object = serializers.SerializerMethodField(read_only=True) | ||
user = UserSerializer(nested=True) | ||
|
||
class Meta: | ||
model = Subscription | ||
fields = [ | ||
'id', 'url', 'display', 'object_type', 'object_id', 'object', 'user', 'created', | ||
] | ||
brief_fields = ('id', 'url', 'display', 'object_type', 'object_id', 'user') | ||
|
||
@extend_schema_field(serializers.JSONField(allow_null=True)) | ||
def get_object(self, instance): | ||
serializer = get_serializer_for_model(instance.object) | ||
context = {'request': self.context['request']} | ||
return serializer(instance.object, nested=True, context=context).data |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.