Fix owner filter

This commit is contained in:
Jeremy Stretch
2025-10-22 13:56:13 -04:00
parent 59082d0364
commit 9cbda4d5b0
5 changed files with 108 additions and 29 deletions

View File

@@ -12,11 +12,10 @@ from netbox.forms import (
NestedGroupModelFilterSetForm, NetBoxModelFilterSetForm, OrganizationalModelFilterSetForm, NestedGroupModelFilterSetForm, NetBoxModelFilterSetForm, OrganizationalModelFilterSetForm,
PrimaryModelFilterSetForm, PrimaryModelFilterSetForm,
) )
from netbox.forms.mixins import OwnerMixin
from tenancy.forms import ContactModelFilterForm, TenancyFilterForm from tenancy.forms import ContactModelFilterForm, TenancyFilterForm
from users.models import User from users.models import Owner, User
from utilities.forms import BOOLEAN_WITH_BLANK_CHOICES, FilterForm, add_blank_choice from utilities.forms import BOOLEAN_WITH_BLANK_CHOICES, FilterForm, add_blank_choice
from utilities.forms.fields import ColorField, DynamicModelMultipleChoiceField, TagFilterField from utilities.forms.fields import ColorField, DynamicModelChoiceField, DynamicModelMultipleChoiceField, TagFilterField
from utilities.forms.rendering import FieldSet from utilities.forms.rendering import FieldSet
from utilities.forms.widgets import NumberWithOptions from utilities.forms.widgets import NumberWithOptions
from virtualization.models import Cluster, ClusterGroup, VirtualMachine from virtualization.models import Cluster, ClusterGroup, VirtualMachine
@@ -64,7 +63,7 @@ __all__ = (
) )
class DeviceComponentFilterForm(OwnerMixin, NetBoxModelFilterSetForm): class DeviceComponentFilterForm(NetBoxModelFilterSetForm):
name = forms.CharField( name = forms.CharField(
label=_('Name'), label=_('Name'),
required=False required=False
@@ -141,6 +140,11 @@ class DeviceComponentFilterForm(OwnerMixin, NetBoxModelFilterSetForm):
required=False, required=False,
label=_('Device Status'), label=_('Device Status'),
) )
owner_id = DynamicModelChoiceField(
queryset=Owner.objects.all(),
required=False,
label=_('Owner'),
)
class RegionFilterForm(ContactModelFilterForm, NestedGroupModelFilterSetForm): class RegionFilterForm(ContactModelFilterForm, NestedGroupModelFilterSetForm):

View File

@@ -7,12 +7,13 @@ from extras.choices import *
from extras.models import * from extras.models import *
from netbox.events import get_event_type_choices from netbox.events import get_event_type_choices
from netbox.forms import NetBoxModelFilterSetForm, PrimaryModelFilterSetForm from netbox.forms import NetBoxModelFilterSetForm, PrimaryModelFilterSetForm
from netbox.forms.mixins import OwnerMixin, SavedFiltersMixin from netbox.forms.mixins import SavedFiltersMixin
from tenancy.models import Tenant, TenantGroup from tenancy.models import Tenant, TenantGroup
from users.models import Group, User from users.models import Group, Owner, User
from utilities.forms import BOOLEAN_WITH_BLANK_CHOICES, FilterForm, add_blank_choice from utilities.forms import BOOLEAN_WITH_BLANK_CHOICES, FilterForm, add_blank_choice
from utilities.forms.fields import ( from utilities.forms.fields import (
ContentTypeChoiceField, ContentTypeMultipleChoiceField, DynamicModelMultipleChoiceField, TagFilterField, ContentTypeChoiceField, ContentTypeMultipleChoiceField, DynamicModelChoiceField, DynamicModelMultipleChoiceField,
TagFilterField,
) )
from utilities.forms.rendering import FieldSet from utilities.forms.rendering import FieldSet
from utilities.forms.widgets import DateTimePicker from utilities.forms.widgets import DateTimePicker
@@ -38,7 +39,7 @@ __all__ = (
) )
class CustomFieldFilterForm(SavedFiltersMixin, OwnerMixin, FilterForm): class CustomFieldFilterForm(SavedFiltersMixin, FilterForm):
model = CustomField model = CustomField
fieldsets = ( fieldsets = (
FieldSet('q', 'filter_id'), FieldSet('q', 'filter_id'),
@@ -115,9 +116,14 @@ class CustomFieldFilterForm(SavedFiltersMixin, OwnerMixin, FilterForm):
label=_('Validation regex'), label=_('Validation regex'),
required=False required=False
) )
owner_id = DynamicModelChoiceField(
queryset=Owner.objects.all(),
required=False,
label=_('Owner'),
)
class CustomFieldChoiceSetFilterForm(SavedFiltersMixin, OwnerMixin, FilterForm): class CustomFieldChoiceSetFilterForm(SavedFiltersMixin, FilterForm):
model = CustomFieldChoiceSet model = CustomFieldChoiceSet
fieldsets = ( fieldsets = (
FieldSet('q', 'filter_id'), FieldSet('q', 'filter_id'),
@@ -130,9 +136,14 @@ class CustomFieldChoiceSetFilterForm(SavedFiltersMixin, OwnerMixin, FilterForm):
choice = forms.CharField( choice = forms.CharField(
required=False required=False
) )
owner_id = DynamicModelChoiceField(
queryset=Owner.objects.all(),
required=False,
label=_('Owner'),
)
class CustomLinkFilterForm(SavedFiltersMixin, OwnerMixin, FilterForm): class CustomLinkFilterForm(SavedFiltersMixin, FilterForm):
model = CustomLink model = CustomLink
fieldsets = ( fieldsets = (
FieldSet('q', 'filter_id'), FieldSet('q', 'filter_id'),
@@ -161,9 +172,14 @@ class CustomLinkFilterForm(SavedFiltersMixin, OwnerMixin, FilterForm):
label=_('Weight'), label=_('Weight'),
required=False required=False
) )
owner_id = DynamicModelChoiceField(
queryset=Owner.objects.all(),
required=False,
label=_('Owner'),
)
class ExportTemplateFilterForm(SavedFiltersMixin, OwnerMixin, FilterForm): class ExportTemplateFilterForm(SavedFiltersMixin, FilterForm):
model = ExportTemplate model = ExportTemplate
fieldsets = ( fieldsets = (
FieldSet('q', 'filter_id', 'object_type_id'), FieldSet('q', 'filter_id', 'object_type_id'),
@@ -207,6 +223,11 @@ class ExportTemplateFilterForm(SavedFiltersMixin, OwnerMixin, FilterForm):
choices=BOOLEAN_WITH_BLANK_CHOICES choices=BOOLEAN_WITH_BLANK_CHOICES
) )
) )
owner_id = DynamicModelChoiceField(
queryset=Owner.objects.all(),
required=False,
label=_('Owner'),
)
class ImageAttachmentFilterForm(SavedFiltersMixin, FilterForm): class ImageAttachmentFilterForm(SavedFiltersMixin, FilterForm):
@@ -226,7 +247,7 @@ class ImageAttachmentFilterForm(SavedFiltersMixin, FilterForm):
) )
class SavedFilterFilterForm(SavedFiltersMixin, OwnerMixin, FilterForm): class SavedFilterFilterForm(SavedFiltersMixin, FilterForm):
model = SavedFilter model = SavedFilter
fieldsets = ( fieldsets = (
FieldSet('q', 'filter_id'), FieldSet('q', 'filter_id'),
@@ -255,6 +276,11 @@ class SavedFilterFilterForm(SavedFiltersMixin, OwnerMixin, FilterForm):
label=_('Weight'), label=_('Weight'),
required=False required=False
) )
owner_id = DynamicModelChoiceField(
queryset=Owner.objects.all(),
required=False,
label=_('Owner'),
)
class TableConfigFilterForm(SavedFiltersMixin, FilterForm): class TableConfigFilterForm(SavedFiltersMixin, FilterForm):
@@ -287,7 +313,7 @@ class TableConfigFilterForm(SavedFiltersMixin, FilterForm):
) )
class WebhookFilterForm(OwnerMixin, NetBoxModelFilterSetForm): class WebhookFilterForm(NetBoxModelFilterSetForm):
model = Webhook model = Webhook
fieldsets = ( fieldsets = (
FieldSet('q', 'filter_id', 'tag', 'owner_id'), FieldSet('q', 'filter_id', 'tag', 'owner_id'),
@@ -306,10 +332,15 @@ class WebhookFilterForm(OwnerMixin, NetBoxModelFilterSetForm):
required=False, required=False,
label=_('HTTP method') label=_('HTTP method')
) )
owner_id = DynamicModelChoiceField(
queryset=Owner.objects.all(),
required=False,
label=_('Owner'),
)
tag = TagFilterField(model) tag = TagFilterField(model)
class EventRuleFilterForm(OwnerMixin, NetBoxModelFilterSetForm): class EventRuleFilterForm(NetBoxModelFilterSetForm):
model = EventRule model = EventRule
fieldsets = ( fieldsets = (
FieldSet('q', 'filter_id', 'tag', 'owner_id'), FieldSet('q', 'filter_id', 'tag', 'owner_id'),
@@ -337,10 +368,15 @@ class EventRuleFilterForm(OwnerMixin, NetBoxModelFilterSetForm):
choices=BOOLEAN_WITH_BLANK_CHOICES choices=BOOLEAN_WITH_BLANK_CHOICES
) )
) )
owner_id = DynamicModelChoiceField(
queryset=Owner.objects.all(),
required=False,
label=_('Owner'),
)
tag = TagFilterField(model) tag = TagFilterField(model)
class TagFilterForm(SavedFiltersMixin, OwnerMixin, FilterForm): class TagFilterForm(SavedFiltersMixin, FilterForm):
model = Tag model = Tag
content_type_id = ContentTypeMultipleChoiceField( content_type_id = ContentTypeMultipleChoiceField(
queryset=ObjectType.objects.with_feature('tags'), queryset=ObjectType.objects.with_feature('tags'),
@@ -352,6 +388,11 @@ class TagFilterForm(SavedFiltersMixin, OwnerMixin, FilterForm):
required=False, required=False,
label=_('Allowed object type') label=_('Allowed object type')
) )
owner_id = DynamicModelChoiceField(
queryset=Owner.objects.all(),
required=False,
label=_('Owner'),
)
class ConfigContextProfileFilterForm(PrimaryModelFilterSetForm): class ConfigContextProfileFilterForm(PrimaryModelFilterSetForm):
@@ -375,7 +416,7 @@ class ConfigContextProfileFilterForm(PrimaryModelFilterSetForm):
) )
class ConfigContextFilterForm(SavedFiltersMixin, OwnerMixin, FilterForm): class ConfigContextFilterForm(SavedFiltersMixin, FilterForm):
model = ConfigContext model = ConfigContext
fieldsets = ( fieldsets = (
FieldSet('q', 'filter_id', 'tag_id'), FieldSet('q', 'filter_id', 'tag_id'),
@@ -469,9 +510,14 @@ class ConfigContextFilterForm(SavedFiltersMixin, OwnerMixin, FilterForm):
required=False, required=False,
label=_('Tags') label=_('Tags')
) )
owner_id = DynamicModelChoiceField(
queryset=Owner.objects.all(),
required=False,
label=_('Owner'),
)
class ConfigTemplateFilterForm(SavedFiltersMixin, OwnerMixin, FilterForm): class ConfigTemplateFilterForm(SavedFiltersMixin, FilterForm):
model = ConfigTemplate model = ConfigTemplate
fieldsets = ( fieldsets = (
FieldSet('q', 'filter_id', 'tag'), FieldSet('q', 'filter_id', 'tag'),
@@ -511,6 +557,11 @@ class ConfigTemplateFilterForm(SavedFiltersMixin, OwnerMixin, FilterForm):
choices=BOOLEAN_WITH_BLANK_CHOICES choices=BOOLEAN_WITH_BLANK_CHOICES
) )
) )
owner_id = DynamicModelChoiceField(
queryset=Owner.objects.all(),
required=False,
label=_('Owner'),
)
class LocalConfigContextFilterForm(forms.Form): class LocalConfigContextFilterForm(forms.Form):

View File

@@ -3,7 +3,9 @@ from django.db.models import Q
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from extras.choices import * from extras.choices import *
from .mixins import CustomFieldsMixin, OwnerMixin, SavedFiltersMixin from users.models import Owner
from utilities.forms.fields import DynamicModelChoiceField
from .mixins import CustomFieldsMixin, SavedFiltersMixin
__all__ = ( __all__ = (
'NestedGroupModelFilterSetForm', 'NestedGroupModelFilterSetForm',
@@ -42,22 +44,34 @@ class NetBoxModelFilterSetForm(CustomFieldsMixin, SavedFiltersMixin, forms.Form)
return customfield.to_form_field(set_initial=False, enforce_required=False, enforce_visibility=False) return customfield.to_form_field(set_initial=False, enforce_required=False, enforce_visibility=False)
class PrimaryModelFilterSetForm(OwnerMixin, NetBoxModelFilterSetForm): class PrimaryModelFilterSetForm(NetBoxModelFilterSetForm):
""" """
FilterSet form for models which inherit from PrimaryModel. FilterSet form for models which inherit from PrimaryModel.
""" """
pass owner_id = DynamicModelChoiceField(
queryset=Owner.objects.all(),
required=False,
label=_('Owner'),
)
class OrganizationalModelFilterSetForm(OwnerMixin, NetBoxModelFilterSetForm): class OrganizationalModelFilterSetForm(NetBoxModelFilterSetForm):
""" """
FilterSet form for models which inherit from OrganizationalModel. FilterSet form for models which inherit from OrganizationalModel.
""" """
pass owner_id = DynamicModelChoiceField(
queryset=Owner.objects.all(),
required=False,
label=_('Owner'),
)
class NestedGroupModelFilterSetForm(OwnerMixin, NetBoxModelFilterSetForm): class NestedGroupModelFilterSetForm(NetBoxModelFilterSetForm):
""" """
FilterSet form for models which inherit from NestedGroupModel. FilterSet form for models which inherit from NestedGroupModel.
""" """
pass owner_id = DynamicModelChoiceField(
queryset=Owner.objects.all(),
required=False,
label=_('Owner'),
)

View File

@@ -126,7 +126,7 @@ class OwnerMixin(forms.Form):
""" """
Add an `owner` field to forms for models which support Owner assignment. Add an `owner` field to forms for models which support Owner assignment.
""" """
owner_id = DynamicModelChoiceField( owner = DynamicModelChoiceField(
queryset=Owner.objects.all(), queryset=Owner.objects.all(),
required=False, required=False,
label=_('Owner'), label=_('Owner'),

View File

@@ -7,10 +7,10 @@ from extras.forms import LocalConfigContextFilterForm
from extras.models import ConfigTemplate from extras.models import ConfigTemplate
from ipam.models import VRF, VLANTranslationPolicy from ipam.models import VRF, VLANTranslationPolicy
from netbox.forms import NetBoxModelFilterSetForm, OrganizationalModelFilterSetForm, PrimaryModelFilterSetForm from netbox.forms import NetBoxModelFilterSetForm, OrganizationalModelFilterSetForm, PrimaryModelFilterSetForm
from netbox.forms.mixins import OwnerMixin
from tenancy.forms import ContactModelFilterForm, TenancyFilterForm from tenancy.forms import ContactModelFilterForm, TenancyFilterForm
from users.models import Owner
from utilities.forms import BOOLEAN_WITH_BLANK_CHOICES from utilities.forms import BOOLEAN_WITH_BLANK_CHOICES
from utilities.forms.fields import DynamicModelMultipleChoiceField, TagFilterField from utilities.forms.fields import DynamicModelChoiceField, DynamicModelMultipleChoiceField, TagFilterField
from utilities.forms.rendering import FieldSet from utilities.forms.rendering import FieldSet
from virtualization.choices import * from virtualization.choices import *
from virtualization.models import * from virtualization.models import *
@@ -200,7 +200,7 @@ class VirtualMachineFilterForm(
tag = TagFilterField(model) tag = TagFilterField(model)
class VMInterfaceFilterForm(OwnerMixin, NetBoxModelFilterSetForm): class VMInterfaceFilterForm(NetBoxModelFilterSetForm):
model = VMInterface model = VMInterface
fieldsets = ( fieldsets = (
FieldSet('q', 'filter_id', 'tag', 'owner_id'), FieldSet('q', 'filter_id', 'tag', 'owner_id'),
@@ -254,10 +254,15 @@ class VMInterfaceFilterForm(OwnerMixin, NetBoxModelFilterSetForm):
required=False, required=False,
label=_('VLAN Translation Policy') label=_('VLAN Translation Policy')
) )
owner_id = DynamicModelChoiceField(
queryset=Owner.objects.all(),
required=False,
label=_('Owner'),
)
tag = TagFilterField(model) tag = TagFilterField(model)
class VirtualDiskFilterForm(OwnerMixin, NetBoxModelFilterSetForm): class VirtualDiskFilterForm(NetBoxModelFilterSetForm):
model = VirtualDisk model = VirtualDisk
fieldsets = ( fieldsets = (
FieldSet('q', 'filter_id', 'tag', 'owner_id'), FieldSet('q', 'filter_id', 'tag', 'owner_id'),
@@ -274,4 +279,9 @@ class VirtualDiskFilterForm(OwnerMixin, NetBoxModelFilterSetForm):
required=False, required=False,
min_value=1 min_value=1
) )
owner_id = DynamicModelChoiceField(
queryset=Owner.objects.all(),
required=False,
label=_('Owner'),
)
tag = TagFilterField(model) tag = TagFilterField(model)