From cbffc24810f60072648be7d5b4b4275c1ecdb9d8 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Thu, 4 Jul 2024 16:37:18 -0400 Subject: [PATCH] Misc cleanup --- netbox/extras/filtersets.py | 20 +++++++++++--------- netbox/extras/forms/bulk_import.py | 24 ++++++++++++++++++++++-- netbox/extras/models/notifications.py | 4 ++-- netbox/extras/querysets.py | 3 +++ netbox/extras/tables/tables.py | 8 +++++++- netbox/netbox/settings.py | 5 +++++ 6 files changed, 50 insertions(+), 14 deletions(-) diff --git a/netbox/extras/filtersets.py b/netbox/extras/filtersets.py index b2bb5ac99..505c342b4 100644 --- a/netbox/extras/filtersets.py +++ b/netbox/extras/filtersets.py @@ -8,7 +8,7 @@ from core.models import DataSource, ObjectType from dcim.models import DeviceRole, DeviceType, Location, Platform, Region, Site, SiteGroup from netbox.filtersets import BaseFilterSet, ChangeLoggedModelFilterSet, NetBoxModelFilterSet from tenancy.models import Tenant, TenantGroup -from users.models import Group +from users.models import Group, User from utilities.filters import ContentTypeFilter, MultiValueCharFilter, MultiValueNumberFilter from virtualization.models import Cluster, ClusterGroup, ClusterType from .choices import * @@ -343,14 +343,16 @@ class NotificationGroupFilterSet(BaseFilterSet): method='search', label=_('Search'), ) - # user_id = django_filters.ModelMultipleChoiceFilter( - # queryset=get_user_model().objects.all(), - # label=_('User (ID)'), - # ) - # group_id = django_filters.ModelMultipleChoiceFilter( - # queryset=Group.objects.all(), - # label=_('Group (ID)'), - # ) + user_id = django_filters.ModelMultipleChoiceFilter( + field_name='users', + queryset=User.objects.all(), + label=_('User (ID)'), + ) + group_id = django_filters.ModelMultipleChoiceFilter( + field_name='groups', + queryset=Group.objects.all(), + label=_('Group (ID)'), + ) class Meta: model = NotificationGroup diff --git a/netbox/extras/forms/bulk_import.py b/netbox/extras/forms/bulk_import.py index 8391a665d..8dd91a980 100644 --- a/netbox/extras/forms/bulk_import.py +++ b/netbox/extras/forms/bulk_import.py @@ -10,9 +10,11 @@ from core.models import ObjectType from extras.choices import * from extras.models import * from netbox.forms import NetBoxModelImportForm +from users.models import Group, User from utilities.forms import CSVModelForm from utilities.forms.fields import ( - CSVChoiceField, CSVContentTypeField, CSVModelChoiceField, CSVMultipleContentTypeField, SlugField, + CSVChoiceField, CSVContentTypeField, CSVModelChoiceField, CSVModelMultipleChoiceField, CSVMultipleContentTypeField, + SlugField, ) __all__ = ( @@ -254,7 +256,25 @@ class JournalEntryImportForm(NetBoxModelImportForm): class NotificationGroupImportForm(CSVModelForm): + users = CSVModelMultipleChoiceField( + label=_('Users'), + queryset=User.objects.all(), + required=False, + to_field_name='username', + help_text=mark_safe( + _('User names separated by commas, encased with double quotes') + ) + ) + groups = CSVModelMultipleChoiceField( + label=_('Groups'), + queryset=Group.objects.all(), + required=False, + to_field_name='name', + help_text=mark_safe( + _('Group names separated by commas, encased with double quotes') + ) + ) class Meta: model = NotificationGroup - fields = ('name', 'description') + fields = ('name', 'description', 'users', 'groups') diff --git a/netbox/extras/models/notifications.py b/netbox/extras/models/notifications.py index 067dc28b9..954fe2c49 100644 --- a/netbox/extras/models/notifications.py +++ b/netbox/extras/models/notifications.py @@ -21,7 +21,7 @@ __all__ = ( ) -def get_event_type_choices(): +def get_event_name_choices(): """ Compile a list of choices from all registered event types """ @@ -60,7 +60,7 @@ class Notification(models.Model): event_name = models.CharField( verbose_name=_('event'), max_length=50, - choices=get_event_type_choices + choices=get_event_name_choices ) objects = NotificationQuerySet.as_manager() diff --git a/netbox/extras/querysets.py b/netbox/extras/querysets.py index a0ea9a3c2..9b3722eef 100644 --- a/netbox/extras/querysets.py +++ b/netbox/extras/querysets.py @@ -156,4 +156,7 @@ class ConfigContextModelQuerySet(RestrictedQuerySet): class NotificationQuerySet(RestrictedQuerySet): def unread(self): + """ + Return only unread notifications. + """ return self.filter(read__isnull=True) diff --git a/netbox/extras/tables/tables.py b/netbox/extras/tables/tables.py index 410286810..cd0ca31f1 100644 --- a/netbox/extras/tables/tables.py +++ b/netbox/extras/tables/tables.py @@ -322,11 +322,17 @@ class NotificationGroupTable(NetBoxTable): linkify=True, verbose_name=_('Name') ) + users = columns.ManyToManyColumn( + linkify_item=True + ) + groups = columns.ManyToManyColumn( + linkify_item=True + ) class Meta(NetBoxTable.Meta): model = NotificationGroup fields = ('pk', 'name', 'description', 'groups', 'users') - default_columns = ('name', 'description') + default_columns = ('name', 'description', 'groups', 'users') class WebhookTable(NetBoxTable): diff --git a/netbox/netbox/settings.py b/netbox/netbox/settings.py index 8bd039e78..899d3520f 100644 --- a/netbox/netbox/settings.py +++ b/netbox/netbox/settings.py @@ -84,6 +84,11 @@ DEFAULT_PERMISSIONS = getattr(configuration, 'DEFAULT_PERMISSIONS', { 'extras.add_bookmark': ({'user': '$user'},), 'extras.change_bookmark': ({'user': '$user'},), 'extras.delete_bookmark': ({'user': '$user'},), + # Permit users to manage their own notifications + 'extras.view_notification': ({'user': '$user'},), + 'extras.add_notification': ({'user': '$user'},), + 'extras.change_notification': ({'user': '$user'},), + 'extras.delete_notification': ({'user': '$user'},), # Permit users to manage their own subscriptions 'extras.view_subscription': ({'user': '$user'},), 'extras.add_subscription': ({'user': '$user'},),