diff --git a/netbox/dcim/forms/filtersets.py b/netbox/dcim/forms/filtersets.py index 4d37460fd..30c46cb5a 100644 --- a/netbox/dcim/forms/filtersets.py +++ b/netbox/dcim/forms/filtersets.py @@ -12,11 +12,10 @@ from netbox.forms import ( NestedGroupModelFilterSetForm, NetBoxModelFilterSetForm, OrganizationalModelFilterSetForm, PrimaryModelFilterSetForm, ) -from netbox.forms.mixins import OwnerMixin 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.fields import ColorField, DynamicModelMultipleChoiceField, TagFilterField +from utilities.forms.fields import ColorField, DynamicModelChoiceField, DynamicModelMultipleChoiceField, TagFilterField from utilities.forms.rendering import FieldSet from utilities.forms.widgets import NumberWithOptions from virtualization.models import Cluster, ClusterGroup, VirtualMachine @@ -64,7 +63,7 @@ __all__ = ( ) -class DeviceComponentFilterForm(OwnerMixin, NetBoxModelFilterSetForm): +class DeviceComponentFilterForm(NetBoxModelFilterSetForm): name = forms.CharField( label=_('Name'), required=False @@ -141,6 +140,11 @@ class DeviceComponentFilterForm(OwnerMixin, NetBoxModelFilterSetForm): required=False, label=_('Device Status'), ) + owner_id = DynamicModelChoiceField( + queryset=Owner.objects.all(), + required=False, + label=_('Owner'), + ) class RegionFilterForm(ContactModelFilterForm, NestedGroupModelFilterSetForm): diff --git a/netbox/extras/forms/filtersets.py b/netbox/extras/forms/filtersets.py index 72b6587dc..f8cd91199 100644 --- a/netbox/extras/forms/filtersets.py +++ b/netbox/extras/forms/filtersets.py @@ -7,12 +7,13 @@ from extras.choices import * from extras.models import * from netbox.events import get_event_type_choices 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 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.fields import ( - ContentTypeChoiceField, ContentTypeMultipleChoiceField, DynamicModelMultipleChoiceField, TagFilterField, + ContentTypeChoiceField, ContentTypeMultipleChoiceField, DynamicModelChoiceField, DynamicModelMultipleChoiceField, + TagFilterField, ) from utilities.forms.rendering import FieldSet from utilities.forms.widgets import DateTimePicker @@ -38,7 +39,7 @@ __all__ = ( ) -class CustomFieldFilterForm(SavedFiltersMixin, OwnerMixin, FilterForm): +class CustomFieldFilterForm(SavedFiltersMixin, FilterForm): model = CustomField fieldsets = ( FieldSet('q', 'filter_id'), @@ -115,9 +116,14 @@ class CustomFieldFilterForm(SavedFiltersMixin, OwnerMixin, FilterForm): label=_('Validation regex'), required=False ) + owner_id = DynamicModelChoiceField( + queryset=Owner.objects.all(), + required=False, + label=_('Owner'), + ) -class CustomFieldChoiceSetFilterForm(SavedFiltersMixin, OwnerMixin, FilterForm): +class CustomFieldChoiceSetFilterForm(SavedFiltersMixin, FilterForm): model = CustomFieldChoiceSet fieldsets = ( FieldSet('q', 'filter_id'), @@ -130,9 +136,14 @@ class CustomFieldChoiceSetFilterForm(SavedFiltersMixin, OwnerMixin, FilterForm): choice = forms.CharField( required=False ) + owner_id = DynamicModelChoiceField( + queryset=Owner.objects.all(), + required=False, + label=_('Owner'), + ) -class CustomLinkFilterForm(SavedFiltersMixin, OwnerMixin, FilterForm): +class CustomLinkFilterForm(SavedFiltersMixin, FilterForm): model = CustomLink fieldsets = ( FieldSet('q', 'filter_id'), @@ -161,9 +172,14 @@ class CustomLinkFilterForm(SavedFiltersMixin, OwnerMixin, FilterForm): label=_('Weight'), required=False ) + owner_id = DynamicModelChoiceField( + queryset=Owner.objects.all(), + required=False, + label=_('Owner'), + ) -class ExportTemplateFilterForm(SavedFiltersMixin, OwnerMixin, FilterForm): +class ExportTemplateFilterForm(SavedFiltersMixin, FilterForm): model = ExportTemplate fieldsets = ( FieldSet('q', 'filter_id', 'object_type_id'), @@ -207,6 +223,11 @@ class ExportTemplateFilterForm(SavedFiltersMixin, OwnerMixin, FilterForm): choices=BOOLEAN_WITH_BLANK_CHOICES ) ) + owner_id = DynamicModelChoiceField( + queryset=Owner.objects.all(), + required=False, + label=_('Owner'), + ) class ImageAttachmentFilterForm(SavedFiltersMixin, FilterForm): @@ -226,7 +247,7 @@ class ImageAttachmentFilterForm(SavedFiltersMixin, FilterForm): ) -class SavedFilterFilterForm(SavedFiltersMixin, OwnerMixin, FilterForm): +class SavedFilterFilterForm(SavedFiltersMixin, FilterForm): model = SavedFilter fieldsets = ( FieldSet('q', 'filter_id'), @@ -255,6 +276,11 @@ class SavedFilterFilterForm(SavedFiltersMixin, OwnerMixin, FilterForm): label=_('Weight'), required=False ) + owner_id = DynamicModelChoiceField( + queryset=Owner.objects.all(), + required=False, + label=_('Owner'), + ) class TableConfigFilterForm(SavedFiltersMixin, FilterForm): @@ -287,7 +313,7 @@ class TableConfigFilterForm(SavedFiltersMixin, FilterForm): ) -class WebhookFilterForm(OwnerMixin, NetBoxModelFilterSetForm): +class WebhookFilterForm(NetBoxModelFilterSetForm): model = Webhook fieldsets = ( FieldSet('q', 'filter_id', 'tag', 'owner_id'), @@ -306,10 +332,15 @@ class WebhookFilterForm(OwnerMixin, NetBoxModelFilterSetForm): required=False, label=_('HTTP method') ) + owner_id = DynamicModelChoiceField( + queryset=Owner.objects.all(), + required=False, + label=_('Owner'), + ) tag = TagFilterField(model) -class EventRuleFilterForm(OwnerMixin, NetBoxModelFilterSetForm): +class EventRuleFilterForm(NetBoxModelFilterSetForm): model = EventRule fieldsets = ( FieldSet('q', 'filter_id', 'tag', 'owner_id'), @@ -337,10 +368,15 @@ class EventRuleFilterForm(OwnerMixin, NetBoxModelFilterSetForm): choices=BOOLEAN_WITH_BLANK_CHOICES ) ) + owner_id = DynamicModelChoiceField( + queryset=Owner.objects.all(), + required=False, + label=_('Owner'), + ) tag = TagFilterField(model) -class TagFilterForm(SavedFiltersMixin, OwnerMixin, FilterForm): +class TagFilterForm(SavedFiltersMixin, FilterForm): model = Tag content_type_id = ContentTypeMultipleChoiceField( queryset=ObjectType.objects.with_feature('tags'), @@ -352,6 +388,11 @@ class TagFilterForm(SavedFiltersMixin, OwnerMixin, FilterForm): required=False, label=_('Allowed object type') ) + owner_id = DynamicModelChoiceField( + queryset=Owner.objects.all(), + required=False, + label=_('Owner'), + ) class ConfigContextProfileFilterForm(PrimaryModelFilterSetForm): @@ -375,7 +416,7 @@ class ConfigContextProfileFilterForm(PrimaryModelFilterSetForm): ) -class ConfigContextFilterForm(SavedFiltersMixin, OwnerMixin, FilterForm): +class ConfigContextFilterForm(SavedFiltersMixin, FilterForm): model = ConfigContext fieldsets = ( FieldSet('q', 'filter_id', 'tag_id'), @@ -469,9 +510,14 @@ class ConfigContextFilterForm(SavedFiltersMixin, OwnerMixin, FilterForm): required=False, label=_('Tags') ) + owner_id = DynamicModelChoiceField( + queryset=Owner.objects.all(), + required=False, + label=_('Owner'), + ) -class ConfigTemplateFilterForm(SavedFiltersMixin, OwnerMixin, FilterForm): +class ConfigTemplateFilterForm(SavedFiltersMixin, FilterForm): model = ConfigTemplate fieldsets = ( FieldSet('q', 'filter_id', 'tag'), @@ -511,6 +557,11 @@ class ConfigTemplateFilterForm(SavedFiltersMixin, OwnerMixin, FilterForm): choices=BOOLEAN_WITH_BLANK_CHOICES ) ) + owner_id = DynamicModelChoiceField( + queryset=Owner.objects.all(), + required=False, + label=_('Owner'), + ) class LocalConfigContextFilterForm(forms.Form): diff --git a/netbox/netbox/forms/filtersets.py b/netbox/netbox/forms/filtersets.py index 5d0a84b53..d5967c24b 100644 --- a/netbox/netbox/forms/filtersets.py +++ b/netbox/netbox/forms/filtersets.py @@ -3,7 +3,9 @@ from django.db.models import Q from django.utils.translation import gettext_lazy as _ 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__ = ( '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) -class PrimaryModelFilterSetForm(OwnerMixin, NetBoxModelFilterSetForm): +class PrimaryModelFilterSetForm(NetBoxModelFilterSetForm): """ 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. """ - 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. """ - pass + owner_id = DynamicModelChoiceField( + queryset=Owner.objects.all(), + required=False, + label=_('Owner'), + ) diff --git a/netbox/netbox/forms/mixins.py b/netbox/netbox/forms/mixins.py index 0f267cb08..4ee11b0bb 100644 --- a/netbox/netbox/forms/mixins.py +++ b/netbox/netbox/forms/mixins.py @@ -126,7 +126,7 @@ class OwnerMixin(forms.Form): """ Add an `owner` field to forms for models which support Owner assignment. """ - owner_id = DynamicModelChoiceField( + owner = DynamicModelChoiceField( queryset=Owner.objects.all(), required=False, label=_('Owner'), diff --git a/netbox/virtualization/forms/filtersets.py b/netbox/virtualization/forms/filtersets.py index 1b3903075..3e0db175e 100644 --- a/netbox/virtualization/forms/filtersets.py +++ b/netbox/virtualization/forms/filtersets.py @@ -7,10 +7,10 @@ from extras.forms import LocalConfigContextFilterForm from extras.models import ConfigTemplate from ipam.models import VRF, VLANTranslationPolicy from netbox.forms import NetBoxModelFilterSetForm, OrganizationalModelFilterSetForm, PrimaryModelFilterSetForm -from netbox.forms.mixins import OwnerMixin from tenancy.forms import ContactModelFilterForm, TenancyFilterForm +from users.models import Owner 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 virtualization.choices import * from virtualization.models import * @@ -200,7 +200,7 @@ class VirtualMachineFilterForm( tag = TagFilterField(model) -class VMInterfaceFilterForm(OwnerMixin, NetBoxModelFilterSetForm): +class VMInterfaceFilterForm(NetBoxModelFilterSetForm): model = VMInterface fieldsets = ( FieldSet('q', 'filter_id', 'tag', 'owner_id'), @@ -254,10 +254,15 @@ class VMInterfaceFilterForm(OwnerMixin, NetBoxModelFilterSetForm): required=False, label=_('VLAN Translation Policy') ) + owner_id = DynamicModelChoiceField( + queryset=Owner.objects.all(), + required=False, + label=_('Owner'), + ) tag = TagFilterField(model) -class VirtualDiskFilterForm(OwnerMixin, NetBoxModelFilterSetForm): +class VirtualDiskFilterForm(NetBoxModelFilterSetForm): model = VirtualDisk fieldsets = ( FieldSet('q', 'filter_id', 'tag', 'owner_id'), @@ -274,4 +279,9 @@ class VirtualDiskFilterForm(OwnerMixin, NetBoxModelFilterSetForm): required=False, min_value=1 ) + owner_id = DynamicModelChoiceField( + queryset=Owner.objects.all(), + required=False, + label=_('Owner'), + ) tag = TagFilterField(model)