@@ -29,6 +40,9 @@
{% trans "Bookmarks" %}
+
+ {% trans "Subscriptions" %}
+
{% trans "Preferences" %}
diff --git a/netbox/users/filtersets.py b/netbox/users/filtersets.py
index 14c02ed37..96121b7c4 100644
--- a/netbox/users/filtersets.py
+++ b/netbox/users/filtersets.py
@@ -5,6 +5,7 @@ from django.db.models import Q
from django.utils.translation import gettext as _
from core.models import ObjectType
+from extras.models import NotificationGroup
from netbox.filtersets import BaseFilterSet
from users.models import Group, ObjectPermission, Token
from utilities.filters import ContentTypeFilter
@@ -32,6 +33,11 @@ class GroupFilterSet(BaseFilterSet):
queryset=ObjectPermission.objects.all(),
label=_('Permission (ID)'),
)
+ notification_group_id = django_filters.ModelMultipleChoiceFilter(
+ field_name='notification_groups',
+ queryset=NotificationGroup.objects.all(),
+ label=_('Notification group (ID)'),
+ )
class Meta:
model = Group
@@ -67,6 +73,11 @@ class UserFilterSet(BaseFilterSet):
queryset=ObjectPermission.objects.all(),
label=_('Permission (ID)'),
)
+ notification_group_id = django_filters.ModelMultipleChoiceFilter(
+ field_name='notification_groups',
+ queryset=NotificationGroup.objects.all(),
+ label=_('Notification group (ID)'),
+ )
class Meta:
model = get_user_model()
diff --git a/netbox/utilities/templates/buttons/bookmark.html b/netbox/utilities/templates/buttons/bookmark.html
index 832da9e90..df2645177 100644
--- a/netbox/utilities/templates/buttons/bookmark.html
+++ b/netbox/utilities/templates/buttons/bookmark.html
@@ -10,7 +10,7 @@
{% else %}
{% endif %}
diff --git a/netbox/utilities/templates/buttons/subscribe.html b/netbox/utilities/templates/buttons/subscribe.html
new file mode 100644
index 000000000..fff3c49c2
--- /dev/null
+++ b/netbox/utilities/templates/buttons/subscribe.html
@@ -0,0 +1,18 @@
+{% load i18n %}
+{% if form_url %}
+
+{% endif %}
diff --git a/netbox/utilities/templatetags/buttons.py b/netbox/utilities/templatetags/buttons.py
index 30d55d10c..675fa98eb 100644
--- a/netbox/utilities/templatetags/buttons.py
+++ b/netbox/utilities/templatetags/buttons.py
@@ -3,7 +3,8 @@ from django.contrib.contenttypes.models import ContentType
from django.urls import NoReverseMatch, reverse
from core.models import ObjectType
-from extras.models import Bookmark, ExportTemplate
+from extras.models import Bookmark, ExportTemplate, Subscription
+from netbox.models.features import NotificationsMixin
from utilities.querydict import prepare_cloned_fields
from utilities.views import get_viewname
@@ -17,6 +18,7 @@ __all__ = (
'edit_button',
'export_button',
'import_button',
+ 'subscribe_button',
'sync_button',
)
@@ -94,6 +96,41 @@ def delete_button(instance):
}
+@register.inclusion_tag('buttons/subscribe.html', takes_context=True)
+def subscribe_button(context, instance):
+ # Skip for objects which don't support notifications
+ if not (issubclass(instance.__class__, NotificationsMixin)):
+ return {}
+
+ # Check if this user has already subscribed to the object
+ content_type = ContentType.objects.get_for_model(instance)
+ subscription = Subscription.objects.filter(
+ object_type=content_type,
+ object_id=instance.pk,
+ user=context['request'].user
+ ).first()
+
+ # Compile form URL & data
+ if subscription:
+ form_url = reverse('extras:subscription_delete', kwargs={'pk': subscription.pk})
+ form_data = {
+ 'confirm': 'true',
+ }
+ else:
+ form_url = reverse('extras:subscription_add')
+ form_data = {
+ 'object_type': content_type.pk,
+ 'object_id': instance.pk,
+ }
+
+ return {
+ 'subscription': subscription,
+ 'form_url': form_url,
+ 'form_data': form_data,
+ 'return_url': instance.get_absolute_url(),
+ }
+
+
@register.inclusion_tag('buttons/sync.html')
def sync_button(instance):
viewname = get_viewname(instance, 'sync')