Procházet zdrojové kódy

Merge branch 'netbox-community:main' into main

Omripresent před 9 měsíci
rodič
revize
be07f222f6

+ 11 - 11
netbox/circuits/graphql/filters.py

@@ -41,7 +41,7 @@ __all__ = (
 )
 )
 
 
 
 
-@strawberry_django.filter(models.CircuitTermination, lookups=True)
+@strawberry_django.filter_type(models.CircuitTermination, lookups=True)
 class CircuitTerminationFilter(
 class CircuitTerminationFilter(
     BaseObjectTypeFilterMixin,
     BaseObjectTypeFilterMixin,
     CustomFieldsFilterMixin,
     CustomFieldsFilterMixin,
@@ -87,7 +87,7 @@ class CircuitTerminationFilter(
     )
     )
 
 
 
 
-@strawberry_django.filter(models.Circuit, lookups=True)
+@strawberry_django.filter_type(models.Circuit, lookups=True)
 class CircuitFilter(
 class CircuitFilter(
     ContactFilterMixin,
     ContactFilterMixin,
     ImageAttachmentFilterMixin,
     ImageAttachmentFilterMixin,
@@ -121,17 +121,17 @@ class CircuitFilter(
     )
     )
 
 
 
 
-@strawberry_django.filter(models.CircuitType, lookups=True)
+@strawberry_django.filter_type(models.CircuitType, lookups=True)
 class CircuitTypeFilter(BaseCircuitTypeFilterMixin):
 class CircuitTypeFilter(BaseCircuitTypeFilterMixin):
     pass
     pass
 
 
 
 
-@strawberry_django.filter(models.CircuitGroup, lookups=True)
+@strawberry_django.filter_type(models.CircuitGroup, lookups=True)
 class CircuitGroupFilter(TenancyFilterMixin, OrganizationalModelFilterMixin):
 class CircuitGroupFilter(TenancyFilterMixin, OrganizationalModelFilterMixin):
     pass
     pass
 
 
 
 
-@strawberry_django.filter(models.CircuitGroupAssignment, lookups=True)
+@strawberry_django.filter_type(models.CircuitGroupAssignment, lookups=True)
 class CircuitGroupAssignmentFilter(
 class CircuitGroupAssignmentFilter(
     BaseObjectTypeFilterMixin, CustomFieldsFilterMixin, TagsFilterMixin, ChangeLogFilterMixin
     BaseObjectTypeFilterMixin, CustomFieldsFilterMixin, TagsFilterMixin, ChangeLogFilterMixin
 ):
 ):
@@ -148,7 +148,7 @@ class CircuitGroupAssignmentFilter(
     )
     )
 
 
 
 
-@strawberry_django.filter(models.Provider, lookups=True)
+@strawberry_django.filter_type(models.Provider, lookups=True)
 class ProviderFilter(ContactFilterMixin, PrimaryModelFilterMixin):
 class ProviderFilter(ContactFilterMixin, PrimaryModelFilterMixin):
     name: FilterLookup[str] | None = strawberry_django.filter_field()
     name: FilterLookup[str] | None = strawberry_django.filter_field()
     slug: FilterLookup[str] | None = strawberry_django.filter_field()
     slug: FilterLookup[str] | None = strawberry_django.filter_field()
@@ -158,7 +158,7 @@ class ProviderFilter(ContactFilterMixin, PrimaryModelFilterMixin):
     )
     )
 
 
 
 
-@strawberry_django.filter(models.ProviderAccount, lookups=True)
+@strawberry_django.filter_type(models.ProviderAccount, lookups=True)
 class ProviderAccountFilter(ContactFilterMixin, PrimaryModelFilterMixin):
 class ProviderAccountFilter(ContactFilterMixin, PrimaryModelFilterMixin):
     provider: Annotated['ProviderFilter', strawberry.lazy('circuits.graphql.filters')] | None = (
     provider: Annotated['ProviderFilter', strawberry.lazy('circuits.graphql.filters')] | None = (
         strawberry_django.filter_field()
         strawberry_django.filter_field()
@@ -168,7 +168,7 @@ class ProviderAccountFilter(ContactFilterMixin, PrimaryModelFilterMixin):
     name: FilterLookup[str] | None = strawberry_django.filter_field()
     name: FilterLookup[str] | None = strawberry_django.filter_field()
 
 
 
 
-@strawberry_django.filter(models.ProviderNetwork, lookups=True)
+@strawberry_django.filter_type(models.ProviderNetwork, lookups=True)
 class ProviderNetworkFilter(PrimaryModelFilterMixin):
 class ProviderNetworkFilter(PrimaryModelFilterMixin):
     name: FilterLookup[str] | None = strawberry_django.filter_field()
     name: FilterLookup[str] | None = strawberry_django.filter_field()
     provider: Annotated['ProviderFilter', strawberry.lazy('circuits.graphql.filters')] | None = (
     provider: Annotated['ProviderFilter', strawberry.lazy('circuits.graphql.filters')] | None = (
@@ -178,12 +178,12 @@ class ProviderNetworkFilter(PrimaryModelFilterMixin):
     service_id: FilterLookup[str] | None = strawberry_django.filter_field()
     service_id: FilterLookup[str] | None = strawberry_django.filter_field()
 
 
 
 
-@strawberry_django.filter(models.VirtualCircuitType, lookups=True)
+@strawberry_django.filter_type(models.VirtualCircuitType, lookups=True)
 class VirtualCircuitTypeFilter(BaseCircuitTypeFilterMixin):
 class VirtualCircuitTypeFilter(BaseCircuitTypeFilterMixin):
     pass
     pass
 
 
 
 
-@strawberry_django.filter(models.VirtualCircuit, lookups=True)
+@strawberry_django.filter_type(models.VirtualCircuit, lookups=True)
 class VirtualCircuitFilter(TenancyFilterMixin, PrimaryModelFilterMixin):
 class VirtualCircuitFilter(TenancyFilterMixin, PrimaryModelFilterMixin):
     cid: FilterLookup[str] | None = strawberry_django.filter_field()
     cid: FilterLookup[str] | None = strawberry_django.filter_field()
     provider_network: Annotated['ProviderNetworkFilter', strawberry.lazy('circuits.graphql.filters')] | None = (
     provider_network: Annotated['ProviderNetworkFilter', strawberry.lazy('circuits.graphql.filters')] | None = (
@@ -206,7 +206,7 @@ class VirtualCircuitFilter(TenancyFilterMixin, PrimaryModelFilterMixin):
     )
     )
 
 
 
 
-@strawberry_django.filter(models.VirtualCircuitTermination, lookups=True)
+@strawberry_django.filter_type(models.VirtualCircuitTermination, lookups=True)
 class VirtualCircuitTerminationFilter(
 class VirtualCircuitTerminationFilter(
     BaseObjectTypeFilterMixin, CustomFieldsFilterMixin, TagsFilterMixin, ChangeLogFilterMixin
     BaseObjectTypeFilterMixin, CustomFieldsFilterMixin, TagsFilterMixin, ChangeLogFilterMixin
 ):
 ):

+ 1 - 2
netbox/circuits/tables/virtual_circuits.py

@@ -54,9 +54,8 @@ class VirtualCircuitTable(TenancyColumnsMixin, ContactsColumnMixin, NetBoxTable)
         linkify=True,
         linkify=True,
         verbose_name=_('Account')
         verbose_name=_('Account')
     )
     )
-    type = tables.Column(
+    type = columns.ColoredLabelColumn(
         verbose_name=_('Type'),
         verbose_name=_('Type'),
-        linkify=True
     )
     )
     status = columns.ChoiceFieldColumn()
     status = columns.ChoiceFieldColumn()
     termination_count = columns.LinkedCountColumn(
     termination_count = columns.LinkedCountColumn(

+ 4 - 4
netbox/core/graphql/filters.py

@@ -23,7 +23,7 @@ __all__ = (
 )
 )
 
 
 
 
-@strawberry_django.filter(models.DataFile, lookups=True)
+@strawberry_django.filter_type(models.DataFile, lookups=True)
 class DataFileFilter(BaseFilterMixin):
 class DataFileFilter(BaseFilterMixin):
     id: ID | None = strawberry_django.filter_field()
     id: ID | None = strawberry_django.filter_field()
     created: DatetimeFilterLookup[datetime] | None = strawberry_django.filter_field()
     created: DatetimeFilterLookup[datetime] | None = strawberry_django.filter_field()
@@ -39,7 +39,7 @@ class DataFileFilter(BaseFilterMixin):
     hash: FilterLookup[str] | None = strawberry_django.filter_field()
     hash: FilterLookup[str] | None = strawberry_django.filter_field()
 
 
 
 
-@strawberry_django.filter(models.DataSource, lookups=True)
+@strawberry_django.filter_type(models.DataSource, lookups=True)
 class DataSourceFilter(PrimaryModelFilterMixin):
 class DataSourceFilter(PrimaryModelFilterMixin):
     name: FilterLookup[str] | None = strawberry_django.filter_field()
     name: FilterLookup[str] | None = strawberry_django.filter_field()
     type: FilterLookup[str] | None = strawberry_django.filter_field()
     type: FilterLookup[str] | None = strawberry_django.filter_field()
@@ -56,7 +56,7 @@ class DataSourceFilter(PrimaryModelFilterMixin):
     )
     )
 
 
 
 
-@strawberry_django.filter(models.ObjectChange, lookups=True)
+@strawberry_django.filter_type(models.ObjectChange, lookups=True)
 class ObjectChangeFilter(BaseFilterMixin):
 class ObjectChangeFilter(BaseFilterMixin):
     id: ID | None = strawberry_django.filter_field()
     id: ID | None = strawberry_django.filter_field()
     time: DatetimeFilterLookup[datetime] | None = strawberry_django.filter_field()
     time: DatetimeFilterLookup[datetime] | None = strawberry_django.filter_field()
@@ -82,7 +82,7 @@ class ObjectChangeFilter(BaseFilterMixin):
     )
     )
 
 
 
 
-@strawberry_django.filter(DjangoContentType, lookups=True)
+@strawberry_django.filter_type(DjangoContentType, lookups=True)
 class ContentTypeFilter(BaseFilterMixin):
 class ContentTypeFilter(BaseFilterMixin):
     id: ID | None = strawberry_django.filter_field()
     id: ID | None = strawberry_django.filter_field()
     app_label: FilterLookup[str] | None = strawberry_django.filter_field()
     app_label: FilterLookup[str] | None = strawberry_django.filter_field()

+ 44 - 44
netbox/dcim/graphql/filters.py

@@ -90,7 +90,7 @@ __all__ = (
 )
 )
 
 
 
 
-@strawberry_django.filter(models.Cable, lookups=True)
+@strawberry_django.filter_type(models.Cable, lookups=True)
 class CableFilter(PrimaryModelFilterMixin, TenancyFilterMixin):
 class CableFilter(PrimaryModelFilterMixin, TenancyFilterMixin):
     type: Annotated['CableTypeEnum', strawberry.lazy('dcim.graphql.enums')] | None = strawberry_django.filter_field()
     type: Annotated['CableTypeEnum', strawberry.lazy('dcim.graphql.enums')] | None = strawberry_django.filter_field()
     status: Annotated['LinkStatusEnum', strawberry.lazy('dcim.graphql.enums')] | None = strawberry_django.filter_field()
     status: Annotated['LinkStatusEnum', strawberry.lazy('dcim.graphql.enums')] | None = strawberry_django.filter_field()
@@ -107,7 +107,7 @@ class CableFilter(PrimaryModelFilterMixin, TenancyFilterMixin):
     )
     )
 
 
 
 
-@strawberry_django.filter(models.CableTermination, lookups=True)
+@strawberry_django.filter_type(models.CableTermination, lookups=True)
 class CableTerminationFilter(ChangeLogFilterMixin):
 class CableTerminationFilter(ChangeLogFilterMixin):
     cable: Annotated['CableFilter', strawberry.lazy('dcim.graphql.filters')] | None = strawberry_django.filter_field()
     cable: Annotated['CableFilter', strawberry.lazy('dcim.graphql.filters')] | None = strawberry_django.filter_field()
     cable_id: ID | None = strawberry_django.filter_field()
     cable_id: ID | None = strawberry_django.filter_field()
@@ -120,7 +120,7 @@ class CableTerminationFilter(ChangeLogFilterMixin):
     termination_id: ID | None = strawberry_django.filter_field()
     termination_id: ID | None = strawberry_django.filter_field()
 
 
 
 
-@strawberry_django.filter(models.ConsolePort, lookups=True)
+@strawberry_django.filter_type(models.ConsolePort, lookups=True)
 class ConsolePortFilter(ModularComponentModelFilterMixin, CabledObjectModelFilterMixin):
 class ConsolePortFilter(ModularComponentModelFilterMixin, CabledObjectModelFilterMixin):
     type: Annotated['ConsolePortTypeEnum', strawberry.lazy('dcim.graphql.enums')] | None = (
     type: Annotated['ConsolePortTypeEnum', strawberry.lazy('dcim.graphql.enums')] | None = (
         strawberry_django.filter_field()
         strawberry_django.filter_field()
@@ -130,14 +130,14 @@ class ConsolePortFilter(ModularComponentModelFilterMixin, CabledObjectModelFilte
     )
     )
 
 
 
 
-@strawberry_django.filter(models.ConsolePortTemplate, lookups=True)
+@strawberry_django.filter_type(models.ConsolePortTemplate, lookups=True)
 class ConsolePortTemplateFilter(ModularComponentTemplateFilterMixin):
 class ConsolePortTemplateFilter(ModularComponentTemplateFilterMixin):
     type: Annotated['ConsolePortTypeEnum', strawberry.lazy('dcim.graphql.enums')] | None = (
     type: Annotated['ConsolePortTypeEnum', strawberry.lazy('dcim.graphql.enums')] | None = (
         strawberry_django.filter_field()
         strawberry_django.filter_field()
     )
     )
 
 
 
 
-@strawberry_django.filter(models.ConsoleServerPort, lookups=True)
+@strawberry_django.filter_type(models.ConsoleServerPort, lookups=True)
 class ConsoleServerPortFilter(ModularComponentModelFilterMixin, CabledObjectModelFilterMixin):
 class ConsoleServerPortFilter(ModularComponentModelFilterMixin, CabledObjectModelFilterMixin):
     type: Annotated['ConsolePortTypeEnum', strawberry.lazy('dcim.graphql.enums')] | None = (
     type: Annotated['ConsolePortTypeEnum', strawberry.lazy('dcim.graphql.enums')] | None = (
         strawberry_django.filter_field()
         strawberry_django.filter_field()
@@ -147,14 +147,14 @@ class ConsoleServerPortFilter(ModularComponentModelFilterMixin, CabledObjectMode
     )
     )
 
 
 
 
-@strawberry_django.filter(models.ConsoleServerPortTemplate, lookups=True)
+@strawberry_django.filter_type(models.ConsoleServerPortTemplate, lookups=True)
 class ConsoleServerPortTemplateFilter(ModularComponentTemplateFilterMixin):
 class ConsoleServerPortTemplateFilter(ModularComponentTemplateFilterMixin):
     type: Annotated['ConsolePortTypeEnum', strawberry.lazy('dcim.graphql.enums')] | None = (
     type: Annotated['ConsolePortTypeEnum', strawberry.lazy('dcim.graphql.enums')] | None = (
         strawberry_django.filter_field()
         strawberry_django.filter_field()
     )
     )
 
 
 
 
-@strawberry_django.filter(models.Device, lookups=True)
+@strawberry_django.filter_type(models.Device, lookups=True)
 class DeviceFilter(
 class DeviceFilter(
     ContactFilterMixin,
     ContactFilterMixin,
     TenancyFilterMixin,
     TenancyFilterMixin,
@@ -271,7 +271,7 @@ class DeviceFilter(
     inventory_item_count: FilterLookup[int] | None = strawberry_django.filter_field()
     inventory_item_count: FilterLookup[int] | None = strawberry_django.filter_field()
 
 
 
 
-@strawberry_django.filter(models.DeviceBay, lookups=True)
+@strawberry_django.filter_type(models.DeviceBay, lookups=True)
 class DeviceBayFilter(ComponentModelFilterMixin):
 class DeviceBayFilter(ComponentModelFilterMixin):
     installed_device: Annotated['DeviceFilter', strawberry.lazy('dcim.graphql.filters')] | None = (
     installed_device: Annotated['DeviceFilter', strawberry.lazy('dcim.graphql.filters')] | None = (
         strawberry_django.filter_field()
         strawberry_django.filter_field()
@@ -279,12 +279,12 @@ class DeviceBayFilter(ComponentModelFilterMixin):
     installed_device_id: ID | None = strawberry_django.filter_field()
     installed_device_id: ID | None = strawberry_django.filter_field()
 
 
 
 
-@strawberry_django.filter(models.DeviceBayTemplate, lookups=True)
+@strawberry_django.filter_type(models.DeviceBayTemplate, lookups=True)
 class DeviceBayTemplateFilter(ComponentTemplateFilterMixin):
 class DeviceBayTemplateFilter(ComponentTemplateFilterMixin):
     pass
     pass
 
 
 
 
-@strawberry_django.filter(models.InventoryItemTemplate, lookups=True)
+@strawberry_django.filter_type(models.InventoryItemTemplate, lookups=True)
 class InventoryItemTemplateFilter(ComponentTemplateFilterMixin):
 class InventoryItemTemplateFilter(ComponentTemplateFilterMixin):
     parent: Annotated['InventoryItemTemplateFilter', strawberry.lazy('dcim.graphql.filters')] | None = (
     parent: Annotated['InventoryItemTemplateFilter', strawberry.lazy('dcim.graphql.filters')] | None = (
         strawberry_django.filter_field()
         strawberry_django.filter_field()
@@ -304,13 +304,13 @@ class InventoryItemTemplateFilter(ComponentTemplateFilterMixin):
     part_id: FilterLookup[str] | None = strawberry_django.filter_field()
     part_id: FilterLookup[str] | None = strawberry_django.filter_field()
 
 
 
 
-@strawberry_django.filter(models.DeviceRole, lookups=True)
+@strawberry_django.filter_type(models.DeviceRole, lookups=True)
 class DeviceRoleFilter(OrganizationalModelFilterMixin, RenderConfigFilterMixin):
 class DeviceRoleFilter(OrganizationalModelFilterMixin, RenderConfigFilterMixin):
     color: Annotated['ColorEnum', strawberry.lazy('netbox.graphql.enums')] | None = strawberry_django.filter_field()
     color: Annotated['ColorEnum', strawberry.lazy('netbox.graphql.enums')] | None = strawberry_django.filter_field()
     vm_role: FilterLookup[bool] | None = strawberry_django.filter_field()
     vm_role: FilterLookup[bool] | None = strawberry_django.filter_field()
 
 
 
 
-@strawberry_django.filter(models.DeviceType, lookups=True)
+@strawberry_django.filter_type(models.DeviceType, lookups=True)
 class DeviceTypeFilter(ImageAttachmentFilterMixin, PrimaryModelFilterMixin, WeightFilterMixin):
 class DeviceTypeFilter(ImageAttachmentFilterMixin, PrimaryModelFilterMixin, WeightFilterMixin):
     manufacturer: Annotated['ManufacturerFilter', strawberry.lazy('dcim.graphql.filters')] | None = (
     manufacturer: Annotated['ManufacturerFilter', strawberry.lazy('dcim.graphql.filters')] | None = (
         strawberry_django.filter_field()
         strawberry_django.filter_field()
@@ -382,7 +382,7 @@ class DeviceTypeFilter(ImageAttachmentFilterMixin, PrimaryModelFilterMixin, Weig
     inventory_item_template_count: FilterLookup[int] | None = strawberry_django.filter_field()
     inventory_item_template_count: FilterLookup[int] | None = strawberry_django.filter_field()
 
 
 
 
-@strawberry_django.filter(models.FrontPort, lookups=True)
+@strawberry_django.filter_type(models.FrontPort, lookups=True)
 class FrontPortFilter(ModularComponentModelFilterMixin, CabledObjectModelFilterMixin):
 class FrontPortFilter(ModularComponentModelFilterMixin, CabledObjectModelFilterMixin):
     type: Annotated['PortTypeEnum', strawberry.lazy('dcim.graphql.enums')] | None = strawberry_django.filter_field()
     type: Annotated['PortTypeEnum', strawberry.lazy('dcim.graphql.enums')] | None = strawberry_django.filter_field()
     color: Annotated['ColorEnum', strawberry.lazy('netbox.graphql.enums')] | None = strawberry_django.filter_field()
     color: Annotated['ColorEnum', strawberry.lazy('netbox.graphql.enums')] | None = strawberry_django.filter_field()
@@ -395,7 +395,7 @@ class FrontPortFilter(ModularComponentModelFilterMixin, CabledObjectModelFilterM
     )
     )
 
 
 
 
-@strawberry_django.filter(models.FrontPortTemplate, lookups=True)
+@strawberry_django.filter_type(models.FrontPortTemplate, lookups=True)
 class FrontPortTemplateFilter(ModularComponentTemplateFilterMixin):
 class FrontPortTemplateFilter(ModularComponentTemplateFilterMixin):
     type: Annotated['PortTypeEnum', strawberry.lazy('dcim.graphql.enums')] | None = strawberry_django.filter_field()
     type: Annotated['PortTypeEnum', strawberry.lazy('dcim.graphql.enums')] | None = strawberry_django.filter_field()
     color: Annotated['ColorEnum', strawberry.lazy('netbox.graphql.enums')] | None = strawberry_django.filter_field()
     color: Annotated['ColorEnum', strawberry.lazy('netbox.graphql.enums')] | None = strawberry_django.filter_field()
@@ -408,7 +408,7 @@ class FrontPortTemplateFilter(ModularComponentTemplateFilterMixin):
     )
     )
 
 
 
 
-@strawberry_django.filter(models.MACAddress, lookups=True)
+@strawberry_django.filter_type(models.MACAddress, lookups=True)
 class MACAddressFilter(PrimaryModelFilterMixin):
 class MACAddressFilter(PrimaryModelFilterMixin):
     mac_address: FilterLookup[str] | None = strawberry_django.filter_field()
     mac_address: FilterLookup[str] | None = strawberry_django.filter_field()
     assigned_object_type: Annotated['ContentTypeFilter', strawberry.lazy('core.graphql.filters')] | None = (
     assigned_object_type: Annotated['ContentTypeFilter', strawberry.lazy('core.graphql.filters')] | None = (
@@ -417,7 +417,7 @@ class MACAddressFilter(PrimaryModelFilterMixin):
     assigned_object_id: ID | None = strawberry_django.filter_field()
     assigned_object_id: ID | None = strawberry_django.filter_field()
 
 
 
 
-@strawberry_django.filter(models.Interface, lookups=True)
+@strawberry_django.filter_type(models.Interface, lookups=True)
 class InterfaceFilter(ModularComponentModelFilterMixin, InterfaceBaseFilterMixin, CabledObjectModelFilterMixin):
 class InterfaceFilter(ModularComponentModelFilterMixin, InterfaceBaseFilterMixin, CabledObjectModelFilterMixin):
     vcdcs: Annotated['VirtualDeviceContextFilter', strawberry.lazy('dcim.graphql.filters')] | None = (
     vcdcs: Annotated['VirtualDeviceContextFilter', strawberry.lazy('dcim.graphql.filters')] | None = (
         strawberry_django.filter_field()
         strawberry_django.filter_field()
@@ -486,7 +486,7 @@ class InterfaceFilter(ModularComponentModelFilterMixin, InterfaceBaseFilterMixin
     )
     )
 
 
 
 
-@strawberry_django.filter(models.InterfaceTemplate, lookups=True)
+@strawberry_django.filter_type(models.InterfaceTemplate, lookups=True)
 class InterfaceTemplateFilter(ModularComponentTemplateFilterMixin):
 class InterfaceTemplateFilter(ModularComponentTemplateFilterMixin):
     type: Annotated['InterfaceTypeEnum', strawberry.lazy('dcim.graphql.enums')] | None = (
     type: Annotated['InterfaceTypeEnum', strawberry.lazy('dcim.graphql.enums')] | None = (
         strawberry_django.filter_field()
         strawberry_django.filter_field()
@@ -508,7 +508,7 @@ class InterfaceTemplateFilter(ModularComponentTemplateFilterMixin):
     )
     )
 
 
 
 
-@strawberry_django.filter(models.InventoryItem, lookups=True)
+@strawberry_django.filter_type(models.InventoryItem, lookups=True)
 class InventoryItemFilter(ComponentModelFilterMixin):
 class InventoryItemFilter(ComponentModelFilterMixin):
     parent: Annotated['InventoryItemFilter', strawberry.lazy('dcim.graphql.filters')] | None = (
     parent: Annotated['InventoryItemFilter', strawberry.lazy('dcim.graphql.filters')] | None = (
         strawberry_django.filter_field()
         strawberry_django.filter_field()
@@ -535,12 +535,12 @@ class InventoryItemFilter(ComponentModelFilterMixin):
     discovered: FilterLookup[bool] | None = strawberry_django.filter_field()
     discovered: FilterLookup[bool] | None = strawberry_django.filter_field()
 
 
 
 
-@strawberry_django.filter(models.InventoryItemRole, lookups=True)
+@strawberry_django.filter_type(models.InventoryItemRole, lookups=True)
 class InventoryItemRoleFilter(OrganizationalModelFilterMixin):
 class InventoryItemRoleFilter(OrganizationalModelFilterMixin):
     color: Annotated['ColorEnum', strawberry.lazy('netbox.graphql.enums')] | None = strawberry_django.filter_field()
     color: Annotated['ColorEnum', strawberry.lazy('netbox.graphql.enums')] | None = strawberry_django.filter_field()
 
 
 
 
-@strawberry_django.filter(models.Location, lookups=True)
+@strawberry_django.filter_type(models.Location, lookups=True)
 class LocationFilter(ContactFilterMixin, ImageAttachmentFilterMixin, TenancyFilterMixin, NestedGroupModelFilterMixin):
 class LocationFilter(ContactFilterMixin, ImageAttachmentFilterMixin, TenancyFilterMixin, NestedGroupModelFilterMixin):
     site: Annotated['SiteFilter', strawberry.lazy('dcim.graphql.filters')] | None = strawberry_django.filter_field()
     site: Annotated['SiteFilter', strawberry.lazy('dcim.graphql.filters')] | None = strawberry_django.filter_field()
     site_id: ID | None = strawberry_django.filter_field()
     site_id: ID | None = strawberry_django.filter_field()
@@ -556,12 +556,12 @@ class LocationFilter(ContactFilterMixin, ImageAttachmentFilterMixin, TenancyFilt
     )
     )
 
 
 
 
-@strawberry_django.filter(models.Manufacturer, lookups=True)
+@strawberry_django.filter_type(models.Manufacturer, lookups=True)
 class ManufacturerFilter(ContactFilterMixin, OrganizationalModelFilterMixin):
 class ManufacturerFilter(ContactFilterMixin, OrganizationalModelFilterMixin):
     pass
     pass
 
 
 
 
-@strawberry_django.filter(models.Module, lookups=True)
+@strawberry_django.filter_type(models.Module, lookups=True)
 class ModuleFilter(PrimaryModelFilterMixin, ConfigContextFilterMixin):
 class ModuleFilter(PrimaryModelFilterMixin, ConfigContextFilterMixin):
     device: Annotated['DeviceFilter', strawberry.lazy('dcim.graphql.filters')] | None = strawberry_django.filter_field()
     device: Annotated['DeviceFilter', strawberry.lazy('dcim.graphql.filters')] | None = strawberry_django.filter_field()
     device_id: ID | None = strawberry_django.filter_field()
     device_id: ID | None = strawberry_django.filter_field()
@@ -610,7 +610,7 @@ class ModuleFilter(PrimaryModelFilterMixin, ConfigContextFilterMixin):
     )
     )
 
 
 
 
-@strawberry_django.filter(models.ModuleBay, lookups=True)
+@strawberry_django.filter_type(models.ModuleBay, lookups=True)
 class ModuleBayFilter(ModularComponentModelFilterMixin):
 class ModuleBayFilter(ModularComponentModelFilterMixin):
     parent: Annotated['ModuleBayFilter', strawberry.lazy('dcim.graphql.filters')] | None = (
     parent: Annotated['ModuleBayFilter', strawberry.lazy('dcim.graphql.filters')] | None = (
         strawberry_django.filter_field()
         strawberry_django.filter_field()
@@ -619,17 +619,17 @@ class ModuleBayFilter(ModularComponentModelFilterMixin):
     position: FilterLookup[str] | None = strawberry_django.filter_field()
     position: FilterLookup[str] | None = strawberry_django.filter_field()
 
 
 
 
-@strawberry_django.filter(models.ModuleBayTemplate, lookups=True)
+@strawberry_django.filter_type(models.ModuleBayTemplate, lookups=True)
 class ModuleBayTemplateFilter(ModularComponentTemplateFilterMixin):
 class ModuleBayTemplateFilter(ModularComponentTemplateFilterMixin):
     position: FilterLookup[str] | None = strawberry_django.filter_field()
     position: FilterLookup[str] | None = strawberry_django.filter_field()
 
 
 
 
-@strawberry_django.filter(models.ModuleTypeProfile, lookups=True)
+@strawberry_django.filter_type(models.ModuleTypeProfile, lookups=True)
 class ModuleTypeProfileFilter(PrimaryModelFilterMixin):
 class ModuleTypeProfileFilter(PrimaryModelFilterMixin):
     name: FilterLookup[str] | None = strawberry_django.filter_field()
     name: FilterLookup[str] | None = strawberry_django.filter_field()
 
 
 
 
-@strawberry_django.filter(models.ModuleType, lookups=True)
+@strawberry_django.filter_type(models.ModuleType, lookups=True)
 class ModuleTypeFilter(ImageAttachmentFilterMixin, PrimaryModelFilterMixin, WeightFilterMixin):
 class ModuleTypeFilter(ImageAttachmentFilterMixin, PrimaryModelFilterMixin, WeightFilterMixin):
     manufacturer: Annotated['ManufacturerFilter', strawberry.lazy('dcim.graphql.filters')] | None = (
     manufacturer: Annotated['ManufacturerFilter', strawberry.lazy('dcim.graphql.filters')] | None = (
         strawberry_django.filter_field()
         strawberry_django.filter_field()
@@ -676,7 +676,7 @@ class ModuleTypeFilter(ImageAttachmentFilterMixin, PrimaryModelFilterMixin, Weig
     ) = strawberry_django.filter_field()
     ) = strawberry_django.filter_field()
 
 
 
 
-@strawberry_django.filter(models.Platform, lookups=True)
+@strawberry_django.filter_type(models.Platform, lookups=True)
 class PlatformFilter(OrganizationalModelFilterMixin):
 class PlatformFilter(OrganizationalModelFilterMixin):
     manufacturer: Annotated['ManufacturerFilter', strawberry.lazy('dcim.graphql.filters')] | None = (
     manufacturer: Annotated['ManufacturerFilter', strawberry.lazy('dcim.graphql.filters')] | None = (
         strawberry_django.filter_field()
         strawberry_django.filter_field()
@@ -688,7 +688,7 @@ class PlatformFilter(OrganizationalModelFilterMixin):
     config_template_id: ID | None = strawberry_django.filter_field()
     config_template_id: ID | None = strawberry_django.filter_field()
 
 
 
 
-@strawberry_django.filter(models.PowerFeed, lookups=True)
+@strawberry_django.filter_type(models.PowerFeed, lookups=True)
 class PowerFeedFilter(CabledObjectModelFilterMixin, TenancyFilterMixin, PrimaryModelFilterMixin):
 class PowerFeedFilter(CabledObjectModelFilterMixin, TenancyFilterMixin, PrimaryModelFilterMixin):
     power_panel: Annotated['PowerPanelFilter', strawberry.lazy('dcim.graphql.filters')] | None = (
     power_panel: Annotated['PowerPanelFilter', strawberry.lazy('dcim.graphql.filters')] | None = (
         strawberry_django.filter_field()
         strawberry_django.filter_field()
@@ -723,7 +723,7 @@ class PowerFeedFilter(CabledObjectModelFilterMixin, TenancyFilterMixin, PrimaryM
     )
     )
 
 
 
 
-@strawberry_django.filter(models.PowerOutlet, lookups=True)
+@strawberry_django.filter_type(models.PowerOutlet, lookups=True)
 class PowerOutletFilter(ModularComponentModelFilterMixin, CabledObjectModelFilterMixin):
 class PowerOutletFilter(ModularComponentModelFilterMixin, CabledObjectModelFilterMixin):
     type: Annotated['PowerOutletTypeEnum', strawberry.lazy('dcim.graphql.enums')] | None = (
     type: Annotated['PowerOutletTypeEnum', strawberry.lazy('dcim.graphql.enums')] | None = (
         strawberry_django.filter_field()
         strawberry_django.filter_field()
@@ -738,7 +738,7 @@ class PowerOutletFilter(ModularComponentModelFilterMixin, CabledObjectModelFilte
     color: Annotated['ColorEnum', strawberry.lazy('netbox.graphql.enums')] | None = strawberry_django.filter_field()
     color: Annotated['ColorEnum', strawberry.lazy('netbox.graphql.enums')] | None = strawberry_django.filter_field()
 
 
 
 
-@strawberry_django.filter(models.PowerOutletTemplate, lookups=True)
+@strawberry_django.filter_type(models.PowerOutletTemplate, lookups=True)
 class PowerOutletTemplateFilter(ModularComponentModelFilterMixin):
 class PowerOutletTemplateFilter(ModularComponentModelFilterMixin):
     type: Annotated['PowerOutletTypeEnum', strawberry.lazy('dcim.graphql.enums')] | None = (
     type: Annotated['PowerOutletTypeEnum', strawberry.lazy('dcim.graphql.enums')] | None = (
         strawberry_django.filter_field()
         strawberry_django.filter_field()
@@ -752,7 +752,7 @@ class PowerOutletTemplateFilter(ModularComponentModelFilterMixin):
     )
     )
 
 
 
 
-@strawberry_django.filter(models.PowerPanel, lookups=True)
+@strawberry_django.filter_type(models.PowerPanel, lookups=True)
 class PowerPanelFilter(ContactFilterMixin, ImageAttachmentFilterMixin, PrimaryModelFilterMixin):
 class PowerPanelFilter(ContactFilterMixin, ImageAttachmentFilterMixin, PrimaryModelFilterMixin):
     site: Annotated['SiteFilter', strawberry.lazy('dcim.graphql.filters')] | None = strawberry_django.filter_field()
     site: Annotated['SiteFilter', strawberry.lazy('dcim.graphql.filters')] | None = strawberry_django.filter_field()
     site_id: ID | None = strawberry_django.filter_field()
     site_id: ID | None = strawberry_django.filter_field()
@@ -765,7 +765,7 @@ class PowerPanelFilter(ContactFilterMixin, ImageAttachmentFilterMixin, PrimaryMo
     name: FilterLookup[str] | None = strawberry_django.filter_field()
     name: FilterLookup[str] | None = strawberry_django.filter_field()
 
 
 
 
-@strawberry_django.filter(models.PowerPort, lookups=True)
+@strawberry_django.filter_type(models.PowerPort, lookups=True)
 class PowerPortFilter(ModularComponentModelFilterMixin, CabledObjectModelFilterMixin):
 class PowerPortFilter(ModularComponentModelFilterMixin, CabledObjectModelFilterMixin):
     type: Annotated['PowerPortTypeEnum', strawberry.lazy('dcim.graphql.enums')] | None = (
     type: Annotated['PowerPortTypeEnum', strawberry.lazy('dcim.graphql.enums')] | None = (
         strawberry_django.filter_field()
         strawberry_django.filter_field()
@@ -778,7 +778,7 @@ class PowerPortFilter(ModularComponentModelFilterMixin, CabledObjectModelFilterM
     )
     )
 
 
 
 
-@strawberry_django.filter(models.PowerPortTemplate, lookups=True)
+@strawberry_django.filter_type(models.PowerPortTemplate, lookups=True)
 class PowerPortTemplateFilter(ModularComponentTemplateFilterMixin):
 class PowerPortTemplateFilter(ModularComponentTemplateFilterMixin):
     type: Annotated['PowerPortTypeEnum', strawberry.lazy('dcim.graphql.enums')] | None = (
     type: Annotated['PowerPortTypeEnum', strawberry.lazy('dcim.graphql.enums')] | None = (
         strawberry_django.filter_field()
         strawberry_django.filter_field()
@@ -791,7 +791,7 @@ class PowerPortTemplateFilter(ModularComponentTemplateFilterMixin):
     )
     )
 
 
 
 
-@strawberry_django.filter(models.RackType, lookups=True)
+@strawberry_django.filter_type(models.RackType, lookups=True)
 class RackTypeFilter(RackBaseFilterMixin):
 class RackTypeFilter(RackBaseFilterMixin):
     form_factor: Annotated['RackFormFactorEnum', strawberry.lazy('dcim.graphql.enums')] | None = (
     form_factor: Annotated['RackFormFactorEnum', strawberry.lazy('dcim.graphql.enums')] | None = (
         strawberry_django.filter_field()
         strawberry_django.filter_field()
@@ -804,7 +804,7 @@ class RackTypeFilter(RackBaseFilterMixin):
     slug: FilterLookup[str] | None = strawberry_django.filter_field()
     slug: FilterLookup[str] | None = strawberry_django.filter_field()
 
 
 
 
-@strawberry_django.filter(models.Rack, lookups=True)
+@strawberry_django.filter_type(models.Rack, lookups=True)
 class RackFilter(ContactFilterMixin, ImageAttachmentFilterMixin, TenancyFilterMixin, RackBaseFilterMixin):
 class RackFilter(ContactFilterMixin, ImageAttachmentFilterMixin, TenancyFilterMixin, RackBaseFilterMixin):
     form_factor: Annotated['RackFormFactorEnum', strawberry.lazy('dcim.graphql.enums')] | None = (
     form_factor: Annotated['RackFormFactorEnum', strawberry.lazy('dcim.graphql.enums')] | None = (
         strawberry_django.filter_field()
         strawberry_django.filter_field()
@@ -836,7 +836,7 @@ class RackFilter(ContactFilterMixin, ImageAttachmentFilterMixin, TenancyFilterMi
     )
     )
 
 
 
 
-@strawberry_django.filter(models.RackReservation, lookups=True)
+@strawberry_django.filter_type(models.RackReservation, lookups=True)
 class RackReservationFilter(TenancyFilterMixin, PrimaryModelFilterMixin):
 class RackReservationFilter(TenancyFilterMixin, PrimaryModelFilterMixin):
     rack: Annotated['RackFilter', strawberry.lazy('dcim.graphql.filters')] | None = strawberry_django.filter_field()
     rack: Annotated['RackFilter', strawberry.lazy('dcim.graphql.filters')] | None = strawberry_django.filter_field()
     rack_id: ID | None = strawberry_django.filter_field()
     rack_id: ID | None = strawberry_django.filter_field()
@@ -848,12 +848,12 @@ class RackReservationFilter(TenancyFilterMixin, PrimaryModelFilterMixin):
     description: FilterLookup[str] | None = strawberry_django.filter_field()
     description: FilterLookup[str] | None = strawberry_django.filter_field()
 
 
 
 
-@strawberry_django.filter(models.RackRole, lookups=True)
+@strawberry_django.filter_type(models.RackRole, lookups=True)
 class RackRoleFilter(OrganizationalModelFilterMixin):
 class RackRoleFilter(OrganizationalModelFilterMixin):
     color: Annotated['ColorEnum', strawberry.lazy('netbox.graphql.enums')] | None = strawberry_django.filter_field()
     color: Annotated['ColorEnum', strawberry.lazy('netbox.graphql.enums')] | None = strawberry_django.filter_field()
 
 
 
 
-@strawberry_django.filter(models.RearPort, lookups=True)
+@strawberry_django.filter_type(models.RearPort, lookups=True)
 class RearPortFilter(ModularComponentModelFilterMixin, CabledObjectModelFilterMixin):
 class RearPortFilter(ModularComponentModelFilterMixin, CabledObjectModelFilterMixin):
     type: Annotated['PortTypeEnum', strawberry.lazy('dcim.graphql.enums')] | None = strawberry_django.filter_field()
     type: Annotated['PortTypeEnum', strawberry.lazy('dcim.graphql.enums')] | None = strawberry_django.filter_field()
     color: Annotated['ColorEnum', strawberry.lazy('netbox.graphql.enums')] | None = strawberry_django.filter_field()
     color: Annotated['ColorEnum', strawberry.lazy('netbox.graphql.enums')] | None = strawberry_django.filter_field()
@@ -862,7 +862,7 @@ class RearPortFilter(ModularComponentModelFilterMixin, CabledObjectModelFilterMi
     )
     )
 
 
 
 
-@strawberry_django.filter(models.RearPortTemplate, lookups=True)
+@strawberry_django.filter_type(models.RearPortTemplate, lookups=True)
 class RearPortTemplateFilter(ModularComponentTemplateFilterMixin):
 class RearPortTemplateFilter(ModularComponentTemplateFilterMixin):
     type: Annotated['PortTypeEnum', strawberry.lazy('dcim.graphql.enums')] | None = strawberry_django.filter_field()
     type: Annotated['PortTypeEnum', strawberry.lazy('dcim.graphql.enums')] | None = strawberry_django.filter_field()
     color: Annotated['ColorEnum', strawberry.lazy('netbox.graphql.enums')] | None = strawberry_django.filter_field()
     color: Annotated['ColorEnum', strawberry.lazy('netbox.graphql.enums')] | None = strawberry_django.filter_field()
@@ -871,7 +871,7 @@ class RearPortTemplateFilter(ModularComponentTemplateFilterMixin):
     )
     )
 
 
 
 
-@strawberry_django.filter(models.Region, lookups=True)
+@strawberry_django.filter_type(models.Region, lookups=True)
 class RegionFilter(ContactFilterMixin, NestedGroupModelFilterMixin):
 class RegionFilter(ContactFilterMixin, NestedGroupModelFilterMixin):
     prefixes: Annotated['PrefixFilter', strawberry.lazy('ipam.graphql.filters')] | None = (
     prefixes: Annotated['PrefixFilter', strawberry.lazy('ipam.graphql.filters')] | None = (
         strawberry_django.filter_field()
         strawberry_django.filter_field()
@@ -881,7 +881,7 @@ class RegionFilter(ContactFilterMixin, NestedGroupModelFilterMixin):
     )
     )
 
 
 
 
-@strawberry_django.filter(models.Site, lookups=True)
+@strawberry_django.filter_type(models.Site, lookups=True)
 class SiteFilter(ContactFilterMixin, ImageAttachmentFilterMixin, TenancyFilterMixin, PrimaryModelFilterMixin):
 class SiteFilter(ContactFilterMixin, ImageAttachmentFilterMixin, TenancyFilterMixin, PrimaryModelFilterMixin):
     name: FilterLookup[str] | None = strawberry_django.filter_field()
     name: FilterLookup[str] | None = strawberry_django.filter_field()
     slug: FilterLookup[str] | None = strawberry_django.filter_field()
     slug: FilterLookup[str] | None = strawberry_django.filter_field()
@@ -915,7 +915,7 @@ class SiteFilter(ContactFilterMixin, ImageAttachmentFilterMixin, TenancyFilterMi
     )
     )
 
 
 
 
-@strawberry_django.filter(models.SiteGroup, lookups=True)
+@strawberry_django.filter_type(models.SiteGroup, lookups=True)
 class SiteGroupFilter(ContactFilterMixin, NestedGroupModelFilterMixin):
 class SiteGroupFilter(ContactFilterMixin, NestedGroupModelFilterMixin):
     prefixes: Annotated['PrefixFilter', strawberry.lazy('ipam.graphql.filters')] | None = (
     prefixes: Annotated['PrefixFilter', strawberry.lazy('ipam.graphql.filters')] | None = (
         strawberry_django.filter_field()
         strawberry_django.filter_field()
@@ -925,7 +925,7 @@ class SiteGroupFilter(ContactFilterMixin, NestedGroupModelFilterMixin):
     )
     )
 
 
 
 
-@strawberry_django.filter(models.VirtualChassis, lookups=True)
+@strawberry_django.filter_type(models.VirtualChassis, lookups=True)
 class VirtualChassisFilter(PrimaryModelFilterMixin):
 class VirtualChassisFilter(PrimaryModelFilterMixin):
     master: Annotated['DeviceFilter', strawberry.lazy('dcim.graphql.filters')] | None = strawberry_django.filter_field()
     master: Annotated['DeviceFilter', strawberry.lazy('dcim.graphql.filters')] | None = strawberry_django.filter_field()
     master_id: ID | None = strawberry_django.filter_field()
     master_id: ID | None = strawberry_django.filter_field()
@@ -937,7 +937,7 @@ class VirtualChassisFilter(PrimaryModelFilterMixin):
     member_count: FilterLookup[int] | None = strawberry_django.filter_field()
     member_count: FilterLookup[int] | None = strawberry_django.filter_field()
 
 
 
 
-@strawberry_django.filter(models.VirtualDeviceContext, lookups=True)
+@strawberry_django.filter_type(models.VirtualDeviceContext, lookups=True)
 class VirtualDeviceContextFilter(TenancyFilterMixin, PrimaryModelFilterMixin):
 class VirtualDeviceContextFilter(TenancyFilterMixin, PrimaryModelFilterMixin):
     device: Annotated['DeviceFilter', strawberry.lazy('dcim.graphql.filters')] | None = strawberry_django.filter_field()
     device: Annotated['DeviceFilter', strawberry.lazy('dcim.graphql.filters')] | None = strawberry_django.filter_field()
     device_id: ID | None = strawberry_django.filter_field()
     device_id: ID | None = strawberry_django.filter_field()

+ 14 - 14
netbox/extras/graphql/filters.py

@@ -40,7 +40,7 @@ __all__ = (
 )
 )
 
 
 
 
-@strawberry_django.filter(models.ConfigContext, lookups=True)
+@strawberry_django.filter_type(models.ConfigContext, lookups=True)
 class ConfigContextFilter(BaseObjectTypeFilterMixin, SyncedDataFilterMixin, ChangeLogFilterMixin):
 class ConfigContextFilter(BaseObjectTypeFilterMixin, SyncedDataFilterMixin, ChangeLogFilterMixin):
     name: FilterLookup[str] = strawberry_django.filter_field()
     name: FilterLookup[str] = strawberry_django.filter_field()
     weight: Annotated['IntegerLookup', strawberry.lazy('netbox.graphql.filter_lookups')] | None = (
     weight: Annotated['IntegerLookup', strawberry.lazy('netbox.graphql.filter_lookups')] | None = (
@@ -97,7 +97,7 @@ class ConfigContextFilter(BaseObjectTypeFilterMixin, SyncedDataFilterMixin, Chan
     )
     )
 
 
 
 
-@strawberry_django.filter(models.ConfigTemplate, lookups=True)
+@strawberry_django.filter_type(models.ConfigTemplate, lookups=True)
 class ConfigTemplateFilter(BaseObjectTypeFilterMixin, SyncedDataFilterMixin, ChangeLogFilterMixin):
 class ConfigTemplateFilter(BaseObjectTypeFilterMixin, SyncedDataFilterMixin, ChangeLogFilterMixin):
     name: FilterLookup[str] | None = strawberry_django.filter_field()
     name: FilterLookup[str] | None = strawberry_django.filter_field()
     description: FilterLookup[str] | None = strawberry_django.filter_field()
     description: FilterLookup[str] | None = strawberry_django.filter_field()
@@ -111,7 +111,7 @@ class ConfigTemplateFilter(BaseObjectTypeFilterMixin, SyncedDataFilterMixin, Cha
     as_attachment: FilterLookup[bool] | None = strawberry_django.filter_field()
     as_attachment: FilterLookup[bool] | None = strawberry_django.filter_field()
 
 
 
 
-@strawberry_django.filter(models.CustomField, lookups=True)
+@strawberry_django.filter_type(models.CustomField, lookups=True)
 class CustomFieldFilter(BaseObjectTypeFilterMixin, ChangeLogFilterMixin):
 class CustomFieldFilter(BaseObjectTypeFilterMixin, ChangeLogFilterMixin):
     type: Annotated['CustomFieldTypeEnum', strawberry.lazy('extras.graphql.enums')] | None = (
     type: Annotated['CustomFieldTypeEnum', strawberry.lazy('extras.graphql.enums')] | None = (
         strawberry_django.filter_field()
         strawberry_django.filter_field()
@@ -164,7 +164,7 @@ class CustomFieldFilter(BaseObjectTypeFilterMixin, ChangeLogFilterMixin):
     comments: FilterLookup[str] | None = strawberry_django.filter_field()
     comments: FilterLookup[str] | None = strawberry_django.filter_field()
 
 
 
 
-@strawberry_django.filter(models.CustomFieldChoiceSet, lookups=True)
+@strawberry_django.filter_type(models.CustomFieldChoiceSet, lookups=True)
 class CustomFieldChoiceSetFilter(BaseObjectTypeFilterMixin, ChangeLogFilterMixin):
 class CustomFieldChoiceSetFilter(BaseObjectTypeFilterMixin, ChangeLogFilterMixin):
     name: FilterLookup[str] | None = strawberry_django.filter_field()
     name: FilterLookup[str] | None = strawberry_django.filter_field()
     description: FilterLookup[str] | None = strawberry_django.filter_field()
     description: FilterLookup[str] | None = strawberry_django.filter_field()
@@ -177,7 +177,7 @@ class CustomFieldChoiceSetFilter(BaseObjectTypeFilterMixin, ChangeLogFilterMixin
     order_alphabetically: FilterLookup[bool] | None = strawberry_django.filter_field()
     order_alphabetically: FilterLookup[bool] | None = strawberry_django.filter_field()
 
 
 
 
-@strawberry_django.filter(models.CustomLink, lookups=True)
+@strawberry_django.filter_type(models.CustomLink, lookups=True)
 class CustomLinkFilter(BaseObjectTypeFilterMixin, ChangeLogFilterMixin):
 class CustomLinkFilter(BaseObjectTypeFilterMixin, ChangeLogFilterMixin):
     name: FilterLookup[str] | None = strawberry_django.filter_field()
     name: FilterLookup[str] | None = strawberry_django.filter_field()
     enabled: FilterLookup[bool] | None = strawberry_django.filter_field()
     enabled: FilterLookup[bool] | None = strawberry_django.filter_field()
@@ -193,7 +193,7 @@ class CustomLinkFilter(BaseObjectTypeFilterMixin, ChangeLogFilterMixin):
     new_window: FilterLookup[bool] | None = strawberry_django.filter_field()
     new_window: FilterLookup[bool] | None = strawberry_django.filter_field()
 
 
 
 
-@strawberry_django.filter(models.ExportTemplate, lookups=True)
+@strawberry_django.filter_type(models.ExportTemplate, lookups=True)
 class ExportTemplateFilter(BaseObjectTypeFilterMixin, SyncedDataFilterMixin, ChangeLogFilterMixin):
 class ExportTemplateFilter(BaseObjectTypeFilterMixin, SyncedDataFilterMixin, ChangeLogFilterMixin):
     name: FilterLookup[str] | None = strawberry_django.filter_field()
     name: FilterLookup[str] | None = strawberry_django.filter_field()
     description: FilterLookup[str] | None = strawberry_django.filter_field()
     description: FilterLookup[str] | None = strawberry_django.filter_field()
@@ -207,7 +207,7 @@ class ExportTemplateFilter(BaseObjectTypeFilterMixin, SyncedDataFilterMixin, Cha
     as_attachment: FilterLookup[bool] | None = strawberry_django.filter_field()
     as_attachment: FilterLookup[bool] | None = strawberry_django.filter_field()
 
 
 
 
-@strawberry_django.filter(models.ImageAttachment, lookups=True)
+@strawberry_django.filter_type(models.ImageAttachment, lookups=True)
 class ImageAttachmentFilter(BaseObjectTypeFilterMixin, ChangeLogFilterMixin):
 class ImageAttachmentFilter(BaseObjectTypeFilterMixin, ChangeLogFilterMixin):
     object_type: Annotated['ContentTypeFilter', strawberry.lazy('core.graphql.filters')] | None = (
     object_type: Annotated['ContentTypeFilter', strawberry.lazy('core.graphql.filters')] | None = (
         strawberry_django.filter_field()
         strawberry_django.filter_field()
@@ -222,7 +222,7 @@ class ImageAttachmentFilter(BaseObjectTypeFilterMixin, ChangeLogFilterMixin):
     name: FilterLookup[str] | None = strawberry_django.filter_field()
     name: FilterLookup[str] | None = strawberry_django.filter_field()
 
 
 
 
-@strawberry_django.filter(models.JournalEntry, lookups=True)
+@strawberry_django.filter_type(models.JournalEntry, lookups=True)
 class JournalEntryFilter(BaseObjectTypeFilterMixin, CustomFieldsFilterMixin, TagsFilterMixin, ChangeLogFilterMixin):
 class JournalEntryFilter(BaseObjectTypeFilterMixin, CustomFieldsFilterMixin, TagsFilterMixin, ChangeLogFilterMixin):
     assigned_object_type: Annotated['ContentTypeFilter', strawberry.lazy('core.graphql.filters')] | None = (
     assigned_object_type: Annotated['ContentTypeFilter', strawberry.lazy('core.graphql.filters')] | None = (
         strawberry_django.filter_field()
         strawberry_django.filter_field()
@@ -238,7 +238,7 @@ class JournalEntryFilter(BaseObjectTypeFilterMixin, CustomFieldsFilterMixin, Tag
     comments: FilterLookup[str] | None = strawberry_django.filter_field()
     comments: FilterLookup[str] | None = strawberry_django.filter_field()
 
 
 
 
-@strawberry_django.filter(models.NotificationGroup, lookups=True)
+@strawberry_django.filter_type(models.NotificationGroup, lookups=True)
 class NotificationGroupFilter(BaseObjectTypeFilterMixin, ChangeLogFilterMixin):
 class NotificationGroupFilter(BaseObjectTypeFilterMixin, ChangeLogFilterMixin):
     name: FilterLookup[str] | None = strawberry_django.filter_field()
     name: FilterLookup[str] | None = strawberry_django.filter_field()
     description: FilterLookup[str] | None = strawberry_django.filter_field()
     description: FilterLookup[str] | None = strawberry_django.filter_field()
@@ -246,7 +246,7 @@ class NotificationGroupFilter(BaseObjectTypeFilterMixin, ChangeLogFilterMixin):
     users: Annotated['UserFilter', strawberry.lazy('users.graphql.filters')] | None = strawberry_django.filter_field()
     users: Annotated['UserFilter', strawberry.lazy('users.graphql.filters')] | None = strawberry_django.filter_field()
 
 
 
 
-@strawberry_django.filter(models.SavedFilter, lookups=True)
+@strawberry_django.filter_type(models.SavedFilter, lookups=True)
 class SavedFilterFilter(BaseObjectTypeFilterMixin, ChangeLogFilterMixin):
 class SavedFilterFilter(BaseObjectTypeFilterMixin, ChangeLogFilterMixin):
     name: FilterLookup[str] | None = strawberry_django.filter_field()
     name: FilterLookup[str] | None = strawberry_django.filter_field()
     slug: FilterLookup[str] | None = strawberry_django.filter_field()
     slug: FilterLookup[str] | None = strawberry_django.filter_field()
@@ -263,7 +263,7 @@ class SavedFilterFilter(BaseObjectTypeFilterMixin, ChangeLogFilterMixin):
     )
     )
 
 
 
 
-@strawberry_django.filter(models.TableConfig, lookups=True)
+@strawberry_django.filter_type(models.TableConfig, lookups=True)
 class TableConfigFilter(BaseObjectTypeFilterMixin, ChangeLogFilterMixin):
 class TableConfigFilter(BaseObjectTypeFilterMixin, ChangeLogFilterMixin):
     name: FilterLookup[str] | None = strawberry_django.filter_field()
     name: FilterLookup[str] | None = strawberry_django.filter_field()
     description: FilterLookup[str] | None = strawberry_django.filter_field()
     description: FilterLookup[str] | None = strawberry_django.filter_field()
@@ -276,13 +276,13 @@ class TableConfigFilter(BaseObjectTypeFilterMixin, ChangeLogFilterMixin):
     shared: FilterLookup[bool] | None = strawberry_django.filter_field()
     shared: FilterLookup[bool] | None = strawberry_django.filter_field()
 
 
 
 
-@strawberry_django.filter(models.Tag, lookups=True)
+@strawberry_django.filter_type(models.Tag, lookups=True)
 class TagFilter(BaseObjectTypeFilterMixin, ChangeLogFilterMixin, TagBaseFilterMixin):
 class TagFilter(BaseObjectTypeFilterMixin, ChangeLogFilterMixin, TagBaseFilterMixin):
     color: Annotated['ColorEnum', strawberry.lazy('netbox.graphql.enums')] | None = strawberry_django.filter_field()
     color: Annotated['ColorEnum', strawberry.lazy('netbox.graphql.enums')] | None = strawberry_django.filter_field()
     description: FilterLookup[str] | None = strawberry_django.filter_field()
     description: FilterLookup[str] | None = strawberry_django.filter_field()
 
 
 
 
-@strawberry_django.filter(models.Webhook, lookups=True)
+@strawberry_django.filter_type(models.Webhook, lookups=True)
 class WebhookFilter(BaseObjectTypeFilterMixin, CustomFieldsFilterMixin, TagsFilterMixin, ChangeLogFilterMixin):
 class WebhookFilter(BaseObjectTypeFilterMixin, CustomFieldsFilterMixin, TagsFilterMixin, ChangeLogFilterMixin):
     name: FilterLookup[str] | None = strawberry_django.filter_field()
     name: FilterLookup[str] | None = strawberry_django.filter_field()
     description: FilterLookup[str] | None = strawberry_django.filter_field()
     description: FilterLookup[str] | None = strawberry_django.filter_field()
@@ -301,7 +301,7 @@ class WebhookFilter(BaseObjectTypeFilterMixin, CustomFieldsFilterMixin, TagsFilt
     )
     )
 
 
 
 
-@strawberry_django.filter(models.EventRule, lookups=True)
+@strawberry_django.filter_type(models.EventRule, lookups=True)
 class EventRuleFilter(BaseObjectTypeFilterMixin, CustomFieldsFilterMixin, TagsFilterMixin, ChangeLogFilterMixin):
 class EventRuleFilter(BaseObjectTypeFilterMixin, CustomFieldsFilterMixin, TagsFilterMixin, ChangeLogFilterMixin):
     name: FilterLookup[str] | None = strawberry_django.filter_field()
     name: FilterLookup[str] | None = strawberry_django.filter_field()
     description: FilterLookup[str] | None = strawberry_django.filter_field()
     description: FilterLookup[str] | None = strawberry_django.filter_field()

+ 18 - 18
netbox/ipam/graphql/filters.py

@@ -46,7 +46,7 @@ __all__ = (
 )
 )
 
 
 
 
-@strawberry_django.filter(models.ASN, lookups=True)
+@strawberry_django.filter_type(models.ASN, lookups=True)
 class ASNFilter(TenancyFilterMixin, PrimaryModelFilterMixin):
 class ASNFilter(TenancyFilterMixin, PrimaryModelFilterMixin):
     rir: Annotated['RIRFilter', strawberry.lazy('ipam.graphql.filters')] | None = strawberry_django.filter_field()
     rir: Annotated['RIRFilter', strawberry.lazy('ipam.graphql.filters')] | None = strawberry_django.filter_field()
     rir_id: ID | None = strawberry_django.filter_field()
     rir_id: ID | None = strawberry_django.filter_field()
@@ -61,7 +61,7 @@ class ASNFilter(TenancyFilterMixin, PrimaryModelFilterMixin):
     ) = strawberry_django.filter_field()
     ) = strawberry_django.filter_field()
 
 
 
 
-@strawberry_django.filter(models.ASNRange, lookups=True)
+@strawberry_django.filter_type(models.ASNRange, lookups=True)
 class ASNRangeFilter(TenancyFilterMixin, OrganizationalModelFilterMixin):
 class ASNRangeFilter(TenancyFilterMixin, OrganizationalModelFilterMixin):
     name: FilterLookup[str] | None = strawberry_django.filter_field()
     name: FilterLookup[str] | None = strawberry_django.filter_field()
     slug: FilterLookup[str] | None = strawberry_django.filter_field()
     slug: FilterLookup[str] | None = strawberry_django.filter_field()
@@ -75,7 +75,7 @@ class ASNRangeFilter(TenancyFilterMixin, OrganizationalModelFilterMixin):
     )
     )
 
 
 
 
-@strawberry_django.filter(models.Aggregate, lookups=True)
+@strawberry_django.filter_type(models.Aggregate, lookups=True)
 class AggregateFilter(ContactFilterMixin, TenancyFilterMixin, PrimaryModelFilterMixin):
 class AggregateFilter(ContactFilterMixin, TenancyFilterMixin, PrimaryModelFilterMixin):
     prefix: Annotated['PrefixFilter', strawberry.lazy('ipam.graphql.filters')] | None = strawberry_django.filter_field()
     prefix: Annotated['PrefixFilter', strawberry.lazy('ipam.graphql.filters')] | None = strawberry_django.filter_field()
     prefix_id: ID | None = strawberry_django.filter_field()
     prefix_id: ID | None = strawberry_django.filter_field()
@@ -84,7 +84,7 @@ class AggregateFilter(ContactFilterMixin, TenancyFilterMixin, PrimaryModelFilter
     date_added: DateFilterLookup[date] | None = strawberry_django.filter_field()
     date_added: DateFilterLookup[date] | None = strawberry_django.filter_field()
 
 
 
 
-@strawberry_django.filter(models.FHRPGroup, lookups=True)
+@strawberry_django.filter_type(models.FHRPGroup, lookups=True)
 class FHRPGroupFilter(PrimaryModelFilterMixin):
 class FHRPGroupFilter(PrimaryModelFilterMixin):
     group_id: Annotated['IntegerLookup', strawberry.lazy('netbox.graphql.filter_lookups')] | None = (
     group_id: Annotated['IntegerLookup', strawberry.lazy('netbox.graphql.filter_lookups')] | None = (
         strawberry_django.filter_field()
         strawberry_django.filter_field()
@@ -102,7 +102,7 @@ class FHRPGroupFilter(PrimaryModelFilterMixin):
     )
     )
 
 
 
 
-@strawberry_django.filter(models.FHRPGroupAssignment, lookups=True)
+@strawberry_django.filter_type(models.FHRPGroupAssignment, lookups=True)
 class FHRPGroupAssignmentFilter(BaseObjectTypeFilterMixin, ChangeLogFilterMixin):
 class FHRPGroupAssignmentFilter(BaseObjectTypeFilterMixin, ChangeLogFilterMixin):
     interface_type: Annotated['ContentTypeFilter', strawberry.lazy('core.graphql.filters')] | None = (
     interface_type: Annotated['ContentTypeFilter', strawberry.lazy('core.graphql.filters')] | None = (
         strawberry_django.filter_field()
         strawberry_django.filter_field()
@@ -117,7 +117,7 @@ class FHRPGroupAssignmentFilter(BaseObjectTypeFilterMixin, ChangeLogFilterMixin)
     )
     )
 
 
 
 
-@strawberry_django.filter(models.IPAddress, lookups=True)
+@strawberry_django.filter_type(models.IPAddress, lookups=True)
 class IPAddressFilter(ContactFilterMixin, TenancyFilterMixin, PrimaryModelFilterMixin):
 class IPAddressFilter(ContactFilterMixin, TenancyFilterMixin, PrimaryModelFilterMixin):
     address: FilterLookup[str] | None = strawberry_django.filter_field()
     address: FilterLookup[str] | None = strawberry_django.filter_field()
     vrf: Annotated['VRFFilter', strawberry.lazy('ipam.graphql.filters')] | None = strawberry_django.filter_field()
     vrf: Annotated['VRFFilter', strawberry.lazy('ipam.graphql.filters')] | None = strawberry_django.filter_field()
@@ -156,7 +156,7 @@ class IPAddressFilter(ContactFilterMixin, TenancyFilterMixin, PrimaryModelFilter
         return q
         return q
 
 
 
 
-@strawberry_django.filter(models.IPRange, lookups=True)
+@strawberry_django.filter_type(models.IPRange, lookups=True)
 class IPRangeFilter(ContactFilterMixin, TenancyFilterMixin, PrimaryModelFilterMixin):
 class IPRangeFilter(ContactFilterMixin, TenancyFilterMixin, PrimaryModelFilterMixin):
     start_address: FilterLookup[str] | None = strawberry_django.filter_field()
     start_address: FilterLookup[str] | None = strawberry_django.filter_field()
     end_address: FilterLookup[str] | None = strawberry_django.filter_field()
     end_address: FilterLookup[str] | None = strawberry_django.filter_field()
@@ -185,7 +185,7 @@ class IPRangeFilter(ContactFilterMixin, TenancyFilterMixin, PrimaryModelFilterMi
         return q
         return q
 
 
 
 
-@strawberry_django.filter(models.Prefix, lookups=True)
+@strawberry_django.filter_type(models.Prefix, lookups=True)
 class PrefixFilter(ContactFilterMixin, ScopedFilterMixin, TenancyFilterMixin, PrimaryModelFilterMixin):
 class PrefixFilter(ContactFilterMixin, ScopedFilterMixin, TenancyFilterMixin, PrimaryModelFilterMixin):
     prefix: FilterLookup[str] | None = strawberry_django.filter_field()
     prefix: FilterLookup[str] | None = strawberry_django.filter_field()
     vrf: Annotated['VRFFilter', strawberry.lazy('ipam.graphql.filters')] | None = strawberry_django.filter_field()
     vrf: Annotated['VRFFilter', strawberry.lazy('ipam.graphql.filters')] | None = strawberry_django.filter_field()
@@ -201,19 +201,19 @@ class PrefixFilter(ContactFilterMixin, ScopedFilterMixin, TenancyFilterMixin, Pr
     mark_utilized: FilterLookup[bool] | None = strawberry_django.filter_field()
     mark_utilized: FilterLookup[bool] | None = strawberry_django.filter_field()
 
 
 
 
-@strawberry_django.filter(models.RIR, lookups=True)
+@strawberry_django.filter_type(models.RIR, lookups=True)
 class RIRFilter(OrganizationalModelFilterMixin):
 class RIRFilter(OrganizationalModelFilterMixin):
     is_private: FilterLookup[bool] | None = strawberry_django.filter_field()
     is_private: FilterLookup[bool] | None = strawberry_django.filter_field()
 
 
 
 
-@strawberry_django.filter(models.Role, lookups=True)
+@strawberry_django.filter_type(models.Role, lookups=True)
 class RoleFilter(OrganizationalModelFilterMixin):
 class RoleFilter(OrganizationalModelFilterMixin):
     weight: Annotated['IntegerLookup', strawberry.lazy('netbox.graphql.filter_lookups')] | None = (
     weight: Annotated['IntegerLookup', strawberry.lazy('netbox.graphql.filter_lookups')] | None = (
         strawberry_django.filter_field()
         strawberry_django.filter_field()
     )
     )
 
 
 
 
-@strawberry_django.filter(models.RouteTarget, lookups=True)
+@strawberry_django.filter_type(models.RouteTarget, lookups=True)
 class RouteTargetFilter(TenancyFilterMixin, PrimaryModelFilterMixin):
 class RouteTargetFilter(TenancyFilterMixin, PrimaryModelFilterMixin):
     name: FilterLookup[str] | None = strawberry_django.filter_field()
     name: FilterLookup[str] | None = strawberry_django.filter_field()
     importing_vrfs: Annotated['VRFFilter', strawberry.lazy('ipam.graphql.filters')] | None = (
     importing_vrfs: Annotated['VRFFilter', strawberry.lazy('ipam.graphql.filters')] | None = (
@@ -230,7 +230,7 @@ class RouteTargetFilter(TenancyFilterMixin, PrimaryModelFilterMixin):
     )
     )
 
 
 
 
-@strawberry_django.filter(models.Service, lookups=True)
+@strawberry_django.filter_type(models.Service, lookups=True)
 class ServiceFilter(ContactFilterMixin, ServiceBaseFilterMixin, PrimaryModelFilterMixin):
 class ServiceFilter(ContactFilterMixin, ServiceBaseFilterMixin, PrimaryModelFilterMixin):
     name: FilterLookup[str] | None = strawberry_django.filter_field()
     name: FilterLookup[str] | None = strawberry_django.filter_field()
     ip_addresses: Annotated['IPAddressFilter', strawberry.lazy('ipam.graphql.filters')] | None = (
     ip_addresses: Annotated['IPAddressFilter', strawberry.lazy('ipam.graphql.filters')] | None = (
@@ -242,12 +242,12 @@ class ServiceFilter(ContactFilterMixin, ServiceBaseFilterMixin, PrimaryModelFilt
     parent_object_id: ID | None = strawberry_django.filter_field()
     parent_object_id: ID | None = strawberry_django.filter_field()
 
 
 
 
-@strawberry_django.filter(models.ServiceTemplate, lookups=True)
+@strawberry_django.filter_type(models.ServiceTemplate, lookups=True)
 class ServiceTemplateFilter(ServiceBaseFilterMixin, PrimaryModelFilterMixin):
 class ServiceTemplateFilter(ServiceBaseFilterMixin, PrimaryModelFilterMixin):
     name: FilterLookup[str] | None = strawberry_django.filter_field()
     name: FilterLookup[str] | None = strawberry_django.filter_field()
 
 
 
 
-@strawberry_django.filter(models.VLAN, lookups=True)
+@strawberry_django.filter_type(models.VLAN, lookups=True)
 class VLANFilter(TenancyFilterMixin, PrimaryModelFilterMixin):
 class VLANFilter(TenancyFilterMixin, PrimaryModelFilterMixin):
     site: Annotated['SiteFilter', strawberry.lazy('dcim.graphql.filters')] | None = strawberry_django.filter_field()
     site: Annotated['SiteFilter', strawberry.lazy('dcim.graphql.filters')] | None = strawberry_django.filter_field()
     site_id: ID | None = strawberry_django.filter_field()
     site_id: ID | None = strawberry_django.filter_field()
@@ -277,19 +277,19 @@ class VLANFilter(TenancyFilterMixin, PrimaryModelFilterMixin):
     )
     )
 
 
 
 
-@strawberry_django.filter(models.VLANGroup, lookups=True)
+@strawberry_django.filter_type(models.VLANGroup, lookups=True)
 class VLANGroupFilter(ScopedFilterMixin, OrganizationalModelFilterMixin):
 class VLANGroupFilter(ScopedFilterMixin, OrganizationalModelFilterMixin):
     vid_ranges: Annotated['IntegerArrayLookup', strawberry.lazy('netbox.graphql.filter_lookups')] | None = (
     vid_ranges: Annotated['IntegerArrayLookup', strawberry.lazy('netbox.graphql.filter_lookups')] | None = (
         strawberry_django.filter_field()
         strawberry_django.filter_field()
     )
     )
 
 
 
 
-@strawberry_django.filter(models.VLANTranslationPolicy, lookups=True)
+@strawberry_django.filter_type(models.VLANTranslationPolicy, lookups=True)
 class VLANTranslationPolicyFilter(PrimaryModelFilterMixin):
 class VLANTranslationPolicyFilter(PrimaryModelFilterMixin):
     name: FilterLookup[str] | None = strawberry_django.filter_field()
     name: FilterLookup[str] | None = strawberry_django.filter_field()
 
 
 
 
-@strawberry_django.filter(models.VLANTranslationRule, lookups=True)
+@strawberry_django.filter_type(models.VLANTranslationRule, lookups=True)
 class VLANTranslationRuleFilter(NetBoxModelFilterMixin):
 class VLANTranslationRuleFilter(NetBoxModelFilterMixin):
     policy: Annotated['VLANTranslationPolicyFilter', strawberry.lazy('ipam.graphql.filters')] | None = (
     policy: Annotated['VLANTranslationPolicyFilter', strawberry.lazy('ipam.graphql.filters')] | None = (
         strawberry_django.filter_field()
         strawberry_django.filter_field()
@@ -304,7 +304,7 @@ class VLANTranslationRuleFilter(NetBoxModelFilterMixin):
     )
     )
 
 
 
 
-@strawberry_django.filter(models.VRF, lookups=True)
+@strawberry_django.filter_type(models.VRF, lookups=True)
 class VRFFilter(TenancyFilterMixin, PrimaryModelFilterMixin):
 class VRFFilter(TenancyFilterMixin, PrimaryModelFilterMixin):
     name: FilterLookup[str] | None = strawberry_django.filter_field()
     name: FilterLookup[str] | None = strawberry_django.filter_field()
     rd: FilterLookup[str] | None = strawberry_django.filter_field()
     rd: FilterLookup[str] | None = strawberry_django.filter_field()

+ 0 - 1
netbox/templates/dcim/consoleserverport.html

@@ -53,7 +53,6 @@
         <div class="col col-12 col-md-6">
         <div class="col col-12 col-md-6">
           <div class="card">
           <div class="card">
             <h2 class="card-header">{% trans "Connection" %}</h2>
             <h2 class="card-header">{% trans "Connection" %}</h2>
-            <div class="card-body">
             {% if object.mark_connected %}
             {% if object.mark_connected %}
               <div class="card-body">
               <div class="card-body">
                 <span class="text-success"><i class="mdi mdi-check-bold"></i></span>
                 <span class="text-success"><i class="mdi mdi-check-bold"></i></span>

+ 6 - 0
netbox/templates/dcim/device.html

@@ -26,6 +26,12 @@
                         <th scope="row">{% trans "Location" %}</th>
                         <th scope="row">{% trans "Location" %}</th>
                         <td>{% nested_tree object.location %}</td>
                         <td>{% nested_tree object.location %}</td>
                     </tr>
                     </tr>
+                    {% if object.virtual_chassis %}
+                      <tr>
+                        <th scope="row">{% trans "Virtual Chassis" %}</th>
+                        <td>{{ object.virtual_chassis|linkify }}</td>
+                      </tr>
+                    {% endif %}
                     <tr>
                     <tr>
                         <th scope="row">{% trans "Rack" %}</th>
                         <th scope="row">{% trans "Rack" %}</th>
                         <td class="d-flex justify-content-between align-items-start">
                         <td class="d-flex justify-content-between align-items-start">

+ 6 - 6
netbox/tenancy/graphql/filters.py

@@ -56,7 +56,7 @@ __all__ = (
 )
 )
 
 
 
 
-@strawberry_django.filter(models.Tenant, lookups=True)
+@strawberry_django.filter_type(models.Tenant, lookups=True)
 class TenantFilter(PrimaryModelFilterMixin, ContactFilterMixin):
 class TenantFilter(PrimaryModelFilterMixin, ContactFilterMixin):
     name: FilterLookup[str] | None = strawberry_django.filter_field()
     name: FilterLookup[str] | None = strawberry_django.filter_field()
     slug: FilterLookup[str] | None = strawberry_django.filter_field()
     slug: FilterLookup[str] | None = strawberry_django.filter_field()
@@ -135,7 +135,7 @@ class TenantFilter(PrimaryModelFilterMixin, ContactFilterMixin):
     )
     )
 
 
 
 
-@strawberry_django.filter(models.TenantGroup, lookups=True)
+@strawberry_django.filter_type(models.TenantGroup, lookups=True)
 class TenantGroupFilter(OrganizationalModelFilterMixin):
 class TenantGroupFilter(OrganizationalModelFilterMixin):
     parent: Annotated['TenantGroupFilter', strawberry.lazy('tenancy.graphql.filters')] | None = (
     parent: Annotated['TenantGroupFilter', strawberry.lazy('tenancy.graphql.filters')] | None = (
         strawberry_django.filter_field()
         strawberry_django.filter_field()
@@ -149,7 +149,7 @@ class TenantGroupFilter(OrganizationalModelFilterMixin):
     )
     )
 
 
 
 
-@strawberry_django.filter(models.Contact, lookups=True)
+@strawberry_django.filter_type(models.Contact, lookups=True)
 class ContactFilter(PrimaryModelFilterMixin):
 class ContactFilter(PrimaryModelFilterMixin):
     name: FilterLookup[str] | None = strawberry_django.filter_field()
     name: FilterLookup[str] | None = strawberry_django.filter_field()
     title: FilterLookup[str] | None = strawberry_django.filter_field()
     title: FilterLookup[str] | None = strawberry_django.filter_field()
@@ -165,19 +165,19 @@ class ContactFilter(PrimaryModelFilterMixin):
     )
     )
 
 
 
 
-@strawberry_django.filter(models.ContactRole, lookups=True)
+@strawberry_django.filter_type(models.ContactRole, lookups=True)
 class ContactRoleFilter(OrganizationalModelFilterMixin):
 class ContactRoleFilter(OrganizationalModelFilterMixin):
     pass
     pass
 
 
 
 
-@strawberry_django.filter(models.ContactGroup, lookups=True)
+@strawberry_django.filter_type(models.ContactGroup, lookups=True)
 class ContactGroupFilter(NestedGroupModelFilterMixin):
 class ContactGroupFilter(NestedGroupModelFilterMixin):
     parent: Annotated['ContactGroupFilter', strawberry.lazy('tenancy.graphql.filters')] | None = (
     parent: Annotated['ContactGroupFilter', strawberry.lazy('tenancy.graphql.filters')] | None = (
         strawberry_django.filter_field()
         strawberry_django.filter_field()
     )
     )
 
 
 
 
-@strawberry_django.filter(models.ContactAssignment, lookups=True)
+@strawberry_django.filter_type(models.ContactAssignment, lookups=True)
 class ContactAssignmentFilter(CustomFieldsFilterMixin, TagsFilterMixin, ChangeLogFilterMixin):
 class ContactAssignmentFilter(CustomFieldsFilterMixin, TagsFilterMixin, ChangeLogFilterMixin):
     object_type: Annotated['ContentTypeFilter', strawberry.lazy('core.graphql.filters')] | None = (
     object_type: Annotated['ContentTypeFilter', strawberry.lazy('core.graphql.filters')] | None = (
         strawberry_django.filter_field()
         strawberry_django.filter_field()

+ 98 - 104
netbox/translations/en/LC_MESSAGES/django.po

@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2025-05-13 05:01+0000\n"
+"POT-Creation-Date: 2025-05-16 05:02+0000\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -436,7 +436,7 @@ msgstr ""
 #: netbox/circuits/forms/filtersets.py:379
 #: netbox/circuits/forms/filtersets.py:379
 #: netbox/circuits/forms/model_forms.py:343
 #: netbox/circuits/forms/model_forms.py:343
 #: netbox/circuits/forms/model_forms.py:358
 #: netbox/circuits/forms/model_forms.py:358
-#: netbox/circuits/tables/virtual_circuits.py:88
+#: netbox/circuits/tables/virtual_circuits.py:87
 #: netbox/templates/circuits/virtualcircuit.html:20
 #: netbox/templates/circuits/virtualcircuit.html:20
 #: netbox/templates/circuits/virtualcircuittermination.html:38
 #: netbox/templates/circuits/virtualcircuittermination.html:38
 msgid "Virtual circuit"
 msgid "Virtual circuit"
@@ -482,7 +482,7 @@ msgstr ""
 #: netbox/dcim/forms/bulk_edit.py:1194 netbox/dcim/forms/bulk_edit.py:1239
 #: netbox/dcim/forms/bulk_edit.py:1194 netbox/dcim/forms/bulk_edit.py:1239
 #: netbox/dcim/forms/bulk_edit.py:1266 netbox/dcim/forms/bulk_edit.py:1284
 #: netbox/dcim/forms/bulk_edit.py:1266 netbox/dcim/forms/bulk_edit.py:1284
 #: netbox/dcim/forms/bulk_edit.py:1302 netbox/dcim/forms/bulk_edit.py:1320
 #: netbox/dcim/forms/bulk_edit.py:1302 netbox/dcim/forms/bulk_edit.py:1320
-#: netbox/dcim/forms/bulk_edit.py:1793 netbox/dcim/forms/bulk_edit.py:1834
+#: netbox/dcim/forms/bulk_edit.py:1800 netbox/dcim/forms/bulk_edit.py:1841
 #: netbox/extras/forms/bulk_edit.py:40 netbox/extras/forms/bulk_edit.py:150
 #: netbox/extras/forms/bulk_edit.py:40 netbox/extras/forms/bulk_edit.py:150
 #: netbox/extras/forms/bulk_edit.py:183 netbox/extras/forms/bulk_edit.py:211
 #: netbox/extras/forms/bulk_edit.py:183 netbox/extras/forms/bulk_edit.py:211
 #: netbox/extras/forms/bulk_edit.py:241 netbox/extras/forms/bulk_edit.py:289
 #: netbox/extras/forms/bulk_edit.py:241 netbox/extras/forms/bulk_edit.py:289
@@ -511,7 +511,8 @@ msgstr ""
 #: netbox/templates/core/plugin.html:80 netbox/templates/dcim/cable.html:36
 #: netbox/templates/core/plugin.html:80 netbox/templates/dcim/cable.html:36
 #: netbox/templates/dcim/consoleport.html:44
 #: netbox/templates/dcim/consoleport.html:44
 #: netbox/templates/dcim/consoleserverport.html:44
 #: netbox/templates/dcim/consoleserverport.html:44
-#: netbox/templates/dcim/device.html:94 netbox/templates/dcim/devicebay.html:32
+#: netbox/templates/dcim/device.html:100
+#: netbox/templates/dcim/devicebay.html:32
 #: netbox/templates/dcim/devicerole.html:30
 #: netbox/templates/dcim/devicerole.html:30
 #: netbox/templates/dcim/devicetype.html:33
 #: netbox/templates/dcim/devicetype.html:33
 #: netbox/templates/dcim/frontport.html:58
 #: netbox/templates/dcim/frontport.html:58
@@ -627,7 +628,7 @@ msgstr ""
 #: netbox/circuits/tables/providers.py:70
 #: netbox/circuits/tables/providers.py:70
 #: netbox/circuits/tables/providers.py:101
 #: netbox/circuits/tables/providers.py:101
 #: netbox/circuits/tables/virtual_circuits.py:46
 #: netbox/circuits/tables/virtual_circuits.py:46
-#: netbox/circuits/tables/virtual_circuits.py:93
+#: netbox/circuits/tables/virtual_circuits.py:92
 #: netbox/templates/circuits/circuit.html:18
 #: netbox/templates/circuits/circuit.html:18
 #: netbox/templates/circuits/circuitgroupassignment.html:26
 #: netbox/templates/circuits/circuitgroupassignment.html:26
 #: netbox/templates/circuits/circuittermination.html:25
 #: netbox/templates/circuits/circuittermination.html:25
@@ -653,7 +654,7 @@ msgstr ""
 #: netbox/circuits/forms/filtersets.py:321 netbox/dcim/forms/bulk_edit.py:216
 #: netbox/circuits/forms/filtersets.py:321 netbox/dcim/forms/bulk_edit.py:216
 #: netbox/dcim/forms/bulk_edit.py:656 netbox/dcim/forms/bulk_edit.py:866
 #: netbox/dcim/forms/bulk_edit.py:656 netbox/dcim/forms/bulk_edit.py:866
 #: netbox/dcim/forms/bulk_edit.py:1235 netbox/dcim/forms/bulk_edit.py:1262
 #: netbox/dcim/forms/bulk_edit.py:1235 netbox/dcim/forms/bulk_edit.py:1262
-#: netbox/dcim/forms/bulk_edit.py:1789 netbox/dcim/forms/filtersets.py:1132
+#: netbox/dcim/forms/bulk_edit.py:1796 netbox/dcim/forms/filtersets.py:1132
 #: netbox/dcim/forms/filtersets.py:1390 netbox/dcim/forms/filtersets.py:1543
 #: netbox/dcim/forms/filtersets.py:1390 netbox/dcim/forms/filtersets.py:1543
 #: netbox/dcim/forms/filtersets.py:1567 netbox/dcim/tables/devices.py:744
 #: netbox/dcim/forms/filtersets.py:1567 netbox/dcim/tables/devices.py:744
 #: netbox/dcim/tables/devices.py:800 netbox/dcim/tables/devices.py:1041
 #: netbox/dcim/tables/devices.py:800 netbox/dcim/tables/devices.py:1041
@@ -758,7 +759,7 @@ msgstr ""
 #: netbox/dcim/forms/bulk_edit.py:366 netbox/dcim/forms/bulk_edit.py:753
 #: netbox/dcim/forms/bulk_edit.py:366 netbox/dcim/forms/bulk_edit.py:753
 #: netbox/dcim/forms/bulk_edit.py:818 netbox/dcim/forms/bulk_edit.py:850
 #: netbox/dcim/forms/bulk_edit.py:818 netbox/dcim/forms/bulk_edit.py:850
 #: netbox/dcim/forms/bulk_edit.py:977 netbox/dcim/forms/bulk_edit.py:1770
 #: netbox/dcim/forms/bulk_edit.py:977 netbox/dcim/forms/bulk_edit.py:1770
-#: netbox/dcim/forms/bulk_edit.py:1812 netbox/dcim/forms/bulk_import.py:91
+#: netbox/dcim/forms/bulk_edit.py:1819 netbox/dcim/forms/bulk_import.py:91
 #: netbox/dcim/forms/bulk_import.py:150 netbox/dcim/forms/bulk_import.py:254
 #: netbox/dcim/forms/bulk_import.py:150 netbox/dcim/forms/bulk_import.py:254
 #: netbox/dcim/forms/bulk_import.py:563 netbox/dcim/forms/bulk_import.py:717
 #: netbox/dcim/forms/bulk_import.py:563 netbox/dcim/forms/bulk_import.py:717
 #: netbox/dcim/forms/bulk_import.py:1168 netbox/dcim/forms/bulk_import.py:1375
 #: netbox/dcim/forms/bulk_import.py:1168 netbox/dcim/forms/bulk_import.py:1375
@@ -770,7 +771,7 @@ msgstr ""
 #: netbox/dcim/forms/filtersets.py:1394 netbox/dcim/forms/filtersets.py:1645
 #: netbox/dcim/forms/filtersets.py:1394 netbox/dcim/forms/filtersets.py:1645
 #: netbox/dcim/tables/devices.py:150 netbox/dcim/tables/devices.py:524
 #: netbox/dcim/tables/devices.py:150 netbox/dcim/tables/devices.py:524
 #: netbox/dcim/tables/devices.py:855 netbox/dcim/tables/devices.py:989
 #: netbox/dcim/tables/devices.py:855 netbox/dcim/tables/devices.py:989
-#: netbox/dcim/tables/devices.py:1101 netbox/dcim/tables/modules.py:104
+#: netbox/dcim/tables/devices.py:1100 netbox/dcim/tables/modules.py:104
 #: netbox/dcim/tables/power.py:74 netbox/dcim/tables/racks.py:129
 #: netbox/dcim/tables/power.py:74 netbox/dcim/tables/racks.py:129
 #: netbox/dcim/tables/sites.py:88 netbox/dcim/tables/sites.py:143
 #: netbox/dcim/tables/sites.py:88 netbox/dcim/tables/sites.py:143
 #: netbox/ipam/forms/bulk_edit.py:240 netbox/ipam/forms/bulk_edit.py:290
 #: netbox/ipam/forms/bulk_edit.py:240 netbox/ipam/forms/bulk_edit.py:290
@@ -787,7 +788,7 @@ msgstr ""
 #: netbox/templates/circuits/virtualcircuit.html:43
 #: netbox/templates/circuits/virtualcircuit.html:43
 #: netbox/templates/core/datasource.html:46 netbox/templates/core/job.html:48
 #: netbox/templates/core/datasource.html:46 netbox/templates/core/job.html:48
 #: netbox/templates/core/rq_task.html:81 netbox/templates/core/system.html:18
 #: netbox/templates/core/rq_task.html:81 netbox/templates/core/system.html:18
-#: netbox/templates/dcim/cable.html:19 netbox/templates/dcim/device.html:178
+#: netbox/templates/dcim/cable.html:19 netbox/templates/dcim/device.html:184
 #: netbox/templates/dcim/inventoryitem.html:36
 #: netbox/templates/dcim/inventoryitem.html:36
 #: netbox/templates/dcim/location.html:45 netbox/templates/dcim/module.html:69
 #: netbox/templates/dcim/location.html:45 netbox/templates/dcim/module.html:69
 #: netbox/templates/dcim/powerfeed.html:36
 #: netbox/templates/dcim/powerfeed.html:36
@@ -836,7 +837,7 @@ msgstr ""
 #: netbox/circuits/forms/filtersets.py:332 netbox/dcim/forms/bulk_edit.py:131
 #: netbox/circuits/forms/filtersets.py:332 netbox/dcim/forms/bulk_edit.py:131
 #: netbox/dcim/forms/bulk_edit.py:196 netbox/dcim/forms/bulk_edit.py:361
 #: netbox/dcim/forms/bulk_edit.py:196 netbox/dcim/forms/bulk_edit.py:361
 #: netbox/dcim/forms/bulk_edit.py:484 netbox/dcim/forms/bulk_edit.py:743
 #: netbox/dcim/forms/bulk_edit.py:484 netbox/dcim/forms/bulk_edit.py:743
-#: netbox/dcim/forms/bulk_edit.py:856 netbox/dcim/forms/bulk_edit.py:1817
+#: netbox/dcim/forms/bulk_edit.py:856 netbox/dcim/forms/bulk_edit.py:1824
 #: netbox/dcim/forms/bulk_import.py:110 netbox/dcim/forms/bulk_import.py:155
 #: netbox/dcim/forms/bulk_import.py:110 netbox/dcim/forms/bulk_import.py:155
 #: netbox/dcim/forms/bulk_import.py:247 netbox/dcim/forms/bulk_import.py:362
 #: netbox/dcim/forms/bulk_import.py:247 netbox/dcim/forms/bulk_import.py:362
 #: netbox/dcim/forms/bulk_import.py:537 netbox/dcim/forms/bulk_import.py:1387
 #: netbox/dcim/forms/bulk_import.py:537 netbox/dcim/forms/bulk_import.py:1387
@@ -866,7 +867,7 @@ msgstr ""
 #: netbox/ipam/tables/vlans.py:207 netbox/templates/circuits/circuit.html:48
 #: netbox/ipam/tables/vlans.py:207 netbox/templates/circuits/circuit.html:48
 #: netbox/templates/circuits/circuitgroup.html:36
 #: netbox/templates/circuits/circuitgroup.html:36
 #: netbox/templates/circuits/virtualcircuit.html:47
 #: netbox/templates/circuits/virtualcircuit.html:47
-#: netbox/templates/dcim/cable.html:23 netbox/templates/dcim/device.html:79
+#: netbox/templates/dcim/cable.html:23 netbox/templates/dcim/device.html:85
 #: netbox/templates/dcim/location.html:49
 #: netbox/templates/dcim/location.html:49
 #: netbox/templates/dcim/powerfeed.html:44 netbox/templates/dcim/rack.html:32
 #: netbox/templates/dcim/powerfeed.html:44 netbox/templates/dcim/rack.html:32
 #: netbox/templates/dcim/rackreservation.html:49
 #: netbox/templates/dcim/rackreservation.html:49
@@ -1059,7 +1060,7 @@ msgstr ""
 #: netbox/circuits/forms/filtersets.py:305
 #: netbox/circuits/forms/filtersets.py:305
 #: netbox/circuits/tables/circuits.py:206 netbox/dcim/forms/model_forms.py:656
 #: netbox/circuits/tables/circuits.py:206 netbox/dcim/forms/model_forms.py:656
 #: netbox/templates/circuits/circuitgroupassignment.html:34
 #: netbox/templates/circuits/circuitgroupassignment.html:34
-#: netbox/templates/dcim/device.html:133
+#: netbox/templates/dcim/device.html:139
 #: netbox/templates/dcim/virtualchassis.html:68
 #: netbox/templates/dcim/virtualchassis.html:68
 #: netbox/templates/dcim/virtualchassis_edit.html:60
 #: netbox/templates/dcim/virtualchassis_edit.html:60
 #: netbox/templates/ipam/inc/panels/fhrp_groups.html:26
 #: netbox/templates/ipam/inc/panels/fhrp_groups.html:26
@@ -1075,7 +1076,7 @@ msgstr ""
 #: netbox/circuits/forms/filtersets.py:392
 #: netbox/circuits/forms/filtersets.py:392
 #: netbox/circuits/forms/model_forms.py:325
 #: netbox/circuits/forms/model_forms.py:325
 #: netbox/circuits/tables/virtual_circuits.py:51
 #: netbox/circuits/tables/virtual_circuits.py:51
-#: netbox/circuits/tables/virtual_circuits.py:99
+#: netbox/circuits/tables/virtual_circuits.py:98
 msgid "Provider network"
 msgid "Provider network"
 msgstr ""
 msgstr ""
 
 
@@ -1103,7 +1104,7 @@ msgstr ""
 #: netbox/ipam/tables/ip.py:269 netbox/ipam/tables/ip.py:325
 #: netbox/ipam/tables/ip.py:269 netbox/ipam/tables/ip.py:325
 #: netbox/ipam/tables/vlans.py:101 netbox/ipam/tables/vlans.py:213
 #: netbox/ipam/tables/vlans.py:101 netbox/ipam/tables/vlans.py:213
 #: netbox/templates/circuits/virtualcircuittermination.html:42
 #: netbox/templates/circuits/virtualcircuittermination.html:42
-#: netbox/templates/dcim/device.html:182
+#: netbox/templates/dcim/device.html:188
 #: netbox/templates/dcim/inc/panels/inventory_items.html:20
 #: netbox/templates/dcim/inc/panels/inventory_items.html:20
 #: netbox/templates/dcim/interface.html:178
 #: netbox/templates/dcim/interface.html:178
 #: netbox/templates/dcim/interface.html:280
 #: netbox/templates/dcim/interface.html:280
@@ -1207,11 +1208,11 @@ msgstr ""
 
 
 #: netbox/circuits/forms/bulk_import.py:259
 #: netbox/circuits/forms/bulk_import.py:259
 #: netbox/circuits/forms/model_forms.py:368
 #: netbox/circuits/forms/model_forms.py:368
-#: netbox/circuits/tables/virtual_circuits.py:112
+#: netbox/circuits/tables/virtual_circuits.py:111
 #: netbox/dcim/forms/bulk_import.py:1268 netbox/dcim/forms/model_forms.py:1289
 #: netbox/dcim/forms/bulk_import.py:1268 netbox/dcim/forms/model_forms.py:1289
 #: netbox/dcim/forms/model_forms.py:1558 netbox/dcim/forms/model_forms.py:1725
 #: netbox/dcim/forms/model_forms.py:1558 netbox/dcim/forms/model_forms.py:1725
 #: netbox/dcim/forms/model_forms.py:1760 netbox/dcim/forms/model_forms.py:1890
 #: netbox/dcim/forms/model_forms.py:1760 netbox/dcim/forms/model_forms.py:1890
-#: netbox/dcim/tables/connections.py:65 netbox/dcim/tables/devices.py:1147
+#: netbox/dcim/tables/connections.py:65 netbox/dcim/tables/devices.py:1146
 #: netbox/ipam/forms/bulk_import.py:324 netbox/ipam/forms/model_forms.py:290
 #: netbox/ipam/forms/bulk_import.py:324 netbox/ipam/forms/model_forms.py:290
 #: netbox/ipam/forms/model_forms.py:299 netbox/ipam/tables/fhrp.py:64
 #: netbox/ipam/forms/model_forms.py:299 netbox/ipam/tables/fhrp.py:64
 #: netbox/ipam/tables/ip.py:330 netbox/ipam/tables/vlans.py:147
 #: netbox/ipam/tables/ip.py:330 netbox/ipam/tables/vlans.py:147
@@ -1350,7 +1351,7 @@ msgstr ""
 #: netbox/circuits/forms/filtersets.py:82 netbox/circuits/tables/circuits.py:62
 #: netbox/circuits/forms/filtersets.py:82 netbox/circuits/tables/circuits.py:62
 #: netbox/circuits/tables/providers.py:64
 #: netbox/circuits/tables/providers.py:64
 #: netbox/circuits/tables/virtual_circuits.py:55
 #: netbox/circuits/tables/virtual_circuits.py:55
-#: netbox/circuits/tables/virtual_circuits.py:103
+#: netbox/circuits/tables/virtual_circuits.py:102
 #: netbox/templates/circuits/circuit.html:22
 #: netbox/templates/circuits/circuit.html:22
 #: netbox/templates/circuits/provideraccount.html:24
 #: netbox/templates/circuits/provideraccount.html:24
 msgid "Account"
 msgid "Account"
@@ -1508,7 +1509,7 @@ msgid "member ID"
 msgstr ""
 msgstr ""
 
 
 #: netbox/circuits/models/circuits.py:201 netbox/ipam/models/fhrp.py:96
 #: netbox/circuits/models/circuits.py:201 netbox/ipam/models/fhrp.py:96
-#: netbox/tenancy/models/contacts.py:133
+#: netbox/tenancy/models/contacts.py:119
 msgid "priority"
 msgid "priority"
 msgstr ""
 msgstr ""
 
 
@@ -1606,7 +1607,7 @@ msgstr ""
 #: netbox/ipam/models/vlans.py:206 netbox/ipam/models/vlans.py:352
 #: netbox/ipam/models/vlans.py:206 netbox/ipam/models/vlans.py:352
 #: netbox/ipam/models/vrfs.py:20 netbox/ipam/models/vrfs.py:75
 #: netbox/ipam/models/vrfs.py:20 netbox/ipam/models/vrfs.py:75
 #: netbox/netbox/models/__init__.py:142 netbox/netbox/models/__init__.py:190
 #: netbox/netbox/models/__init__.py:142 netbox/netbox/models/__init__.py:190
-#: netbox/tenancy/models/contacts.py:59 netbox/tenancy/models/tenants.py:19
+#: netbox/tenancy/models/contacts.py:57 netbox/tenancy/models/tenants.py:19
 #: netbox/tenancy/models/tenants.py:42 netbox/users/models/permissions.py:19
 #: netbox/tenancy/models/tenants.py:42 netbox/users/models/permissions.py:19
 #: netbox/users/models/users.py:28 netbox/virtualization/models/clusters.py:52
 #: netbox/users/models/users.py:28 netbox/virtualization/models/clusters.py:52
 #: netbox/virtualization/models/virtualmachines.py:71
 #: netbox/virtualization/models/virtualmachines.py:71
@@ -1856,7 +1857,7 @@ msgstr ""
 #: netbox/circuits/tables/circuits.py:83 netbox/circuits/tables/providers.py:46
 #: netbox/circuits/tables/circuits.py:83 netbox/circuits/tables/providers.py:46
 #: netbox/circuits/tables/providers.py:80
 #: netbox/circuits/tables/providers.py:80
 #: netbox/circuits/tables/providers.py:105
 #: netbox/circuits/tables/providers.py:105
-#: netbox/circuits/tables/virtual_circuits.py:68
+#: netbox/circuits/tables/virtual_circuits.py:67
 #: netbox/dcim/tables/devices.py:1074 netbox/dcim/tables/devicetypes.py:97
 #: netbox/dcim/tables/devices.py:1074 netbox/dcim/tables/devicetypes.py:97
 #: netbox/dcim/tables/modules.py:27 netbox/dcim/tables/modules.py:68
 #: netbox/dcim/tables/modules.py:27 netbox/dcim/tables/modules.py:68
 #: netbox/dcim/tables/modules.py:107 netbox/dcim/tables/power.py:39
 #: netbox/dcim/tables/modules.py:107 netbox/dcim/tables/power.py:39
@@ -1929,7 +1930,7 @@ msgstr ""
 msgid "ASN Count"
 msgid "ASN Count"
 msgstr ""
 msgstr ""
 
 
-#: netbox/circuits/tables/virtual_circuits.py:65
+#: netbox/circuits/tables/virtual_circuits.py:64
 #: netbox/netbox/navigation/menu.py:235
 #: netbox/netbox/navigation/menu.py:235
 #: netbox/templates/circuits/virtualcircuit.html:87
 #: netbox/templates/circuits/virtualcircuit.html:87
 #: netbox/templates/vpn/l2vpn.html:60 netbox/templates/vpn/tunnel.html:72
 #: netbox/templates/vpn/l2vpn.html:60 netbox/templates/vpn/tunnel.html:72
@@ -1937,9 +1938,9 @@ msgstr ""
 msgid "Terminations"
 msgid "Terminations"
 msgstr ""
 msgstr ""
 
 
-#: netbox/circuits/tables/virtual_circuits.py:109
+#: netbox/circuits/tables/virtual_circuits.py:108
 #: netbox/dcim/forms/bulk_edit.py:789 netbox/dcim/forms/bulk_edit.py:1343
 #: netbox/dcim/forms/bulk_edit.py:789 netbox/dcim/forms/bulk_edit.py:1343
-#: netbox/dcim/forms/bulk_edit.py:1755 netbox/dcim/forms/bulk_edit.py:1807
+#: netbox/dcim/forms/bulk_edit.py:1755 netbox/dcim/forms/bulk_edit.py:1814
 #: netbox/dcim/forms/bulk_import.py:699 netbox/dcim/forms/bulk_import.py:761
 #: netbox/dcim/forms/bulk_import.py:699 netbox/dcim/forms/bulk_import.py:761
 #: netbox/dcim/forms/bulk_import.py:787 netbox/dcim/forms/bulk_import.py:813
 #: netbox/dcim/forms/bulk_import.py:787 netbox/dcim/forms/bulk_import.py:813
 #: netbox/dcim/forms/bulk_import.py:833 netbox/dcim/forms/bulk_import.py:889
 #: netbox/dcim/forms/bulk_import.py:833 netbox/dcim/forms/bulk_import.py:889
@@ -1972,7 +1973,7 @@ msgstr ""
 #: netbox/templates/circuits/virtualcircuittermination.html:56
 #: netbox/templates/circuits/virtualcircuittermination.html:56
 #: netbox/templates/dcim/consoleport.html:20
 #: netbox/templates/dcim/consoleport.html:20
 #: netbox/templates/dcim/consoleserverport.html:20
 #: netbox/templates/dcim/consoleserverport.html:20
-#: netbox/templates/dcim/device.html:15 netbox/templates/dcim/device.html:130
+#: netbox/templates/dcim/device.html:15 netbox/templates/dcim/device.html:136
 #: netbox/templates/dcim/device_edit.html:12
 #: netbox/templates/dcim/device_edit.html:12
 #: netbox/templates/dcim/devicebay.html:20
 #: netbox/templates/dcim/devicebay.html:20
 #: netbox/templates/dcim/devicebay.html:48
 #: netbox/templates/dcim/devicebay.html:48
@@ -3047,7 +3048,7 @@ msgstr ""
 msgid "Reserved"
 msgid "Reserved"
 msgstr ""
 msgstr ""
 
 
-#: netbox/dcim/choices.py:101 netbox/templates/dcim/device.html:259
+#: netbox/dcim/choices.py:101 netbox/templates/dcim/device.html:265
 msgid "Available"
 msgid "Available"
 msgstr ""
 msgstr ""
 
 
@@ -3088,7 +3089,7 @@ msgstr ""
 #: netbox/dcim/forms/model_forms.py:517 netbox/dcim/forms/model_forms.py:1207
 #: netbox/dcim/forms/model_forms.py:517 netbox/dcim/forms/model_forms.py:1207
 #: netbox/dcim/forms/model_forms.py:1676 netbox/dcim/forms/object_import.py:177
 #: netbox/dcim/forms/model_forms.py:1676 netbox/dcim/forms/object_import.py:177
 #: netbox/dcim/tables/devices.py:696 netbox/dcim/tables/devices.py:906
 #: netbox/dcim/tables/devices.py:696 netbox/dcim/tables/devices.py:906
-#: netbox/dcim/tables/devices.py:993 netbox/dcim/tables/devices.py:1153
+#: netbox/dcim/tables/devices.py:993 netbox/dcim/tables/devices.py:1152
 #: netbox/extras/tables/tables.py:237 netbox/ipam/forms/bulk_import.py:568
 #: netbox/extras/tables/tables.py:237 netbox/ipam/forms/bulk_import.py:568
 #: netbox/ipam/forms/model_forms.py:768 netbox/ipam/tables/fhrp.py:59
 #: netbox/ipam/forms/model_forms.py:768 netbox/ipam/tables/fhrp.py:59
 #: netbox/ipam/tables/ip.py:336 netbox/ipam/tables/services.py:44
 #: netbox/ipam/tables/ip.py:336 netbox/ipam/tables/services.py:44
@@ -3120,14 +3121,14 @@ msgstr ""
 msgid "Child"
 msgid "Child"
 msgstr ""
 msgstr ""
 
 
-#: netbox/dcim/choices.py:167 netbox/templates/dcim/device.html:349
+#: netbox/dcim/choices.py:167 netbox/templates/dcim/device.html:355
 #: netbox/templates/dcim/rack.html:133
 #: netbox/templates/dcim/rack.html:133
 #: netbox/templates/dcim/rack_elevation_list.html:20
 #: netbox/templates/dcim/rack_elevation_list.html:20
 #: netbox/templates/dcim/rackreservation.html:76
 #: netbox/templates/dcim/rackreservation.html:76
 msgid "Front"
 msgid "Front"
 msgstr ""
 msgstr ""
 
 
-#: netbox/dcim/choices.py:168 netbox/templates/dcim/device.html:355
+#: netbox/dcim/choices.py:168 netbox/templates/dcim/device.html:361
 #: netbox/templates/dcim/rack.html:139
 #: netbox/templates/dcim/rack.html:139
 #: netbox/templates/dcim/rack_elevation_list.html:21
 #: netbox/templates/dcim/rack_elevation_list.html:21
 #: netbox/templates/dcim/rackreservation.html:82
 #: netbox/templates/dcim/rackreservation.html:82
@@ -3729,7 +3730,7 @@ msgstr ""
 
 
 #: netbox/dcim/filtersets.py:1591 netbox/dcim/forms/filtersets.py:111
 #: netbox/dcim/filtersets.py:1591 netbox/dcim/forms/filtersets.py:111
 #: netbox/dcim/tables/devices.py:216 netbox/netbox/navigation/menu.py:79
 #: netbox/dcim/tables/devices.py:216 netbox/netbox/navigation/menu.py:79
-#: netbox/templates/dcim/device.html:120
+#: netbox/templates/dcim/device.html:31 netbox/templates/dcim/device.html:126
 #: netbox/templates/dcim/device_edit.html:95
 #: netbox/templates/dcim/device_edit.html:95
 #: netbox/templates/dcim/virtualchassis.html:20
 #: netbox/templates/dcim/virtualchassis.html:20
 #: netbox/templates/dcim/virtualchassis_add.html:12
 #: netbox/templates/dcim/virtualchassis_add.html:12
@@ -3884,7 +3885,7 @@ msgid "LAG interface (ID)"
 msgstr ""
 msgstr ""
 
 
 #: netbox/dcim/filtersets.py:1923 netbox/dcim/tables/devices.py:612
 #: netbox/dcim/filtersets.py:1923 netbox/dcim/tables/devices.py:612
-#: netbox/dcim/tables/devices.py:1142 netbox/templates/dcim/interface.html:131
+#: netbox/dcim/tables/devices.py:1141 netbox/templates/dcim/interface.html:131
 #: netbox/templates/dcim/macaddress.html:11
 #: netbox/templates/dcim/macaddress.html:11
 #: netbox/templates/dcim/macaddress.html:14
 #: netbox/templates/dcim/macaddress.html:14
 #: netbox/templates/virtualization/vminterface.html:79
 #: netbox/templates/virtualization/vminterface.html:79
@@ -3981,7 +3982,7 @@ msgstr ""
 #: netbox/dcim/forms/object_create.py:208
 #: netbox/dcim/forms/object_create.py:208
 #: netbox/dcim/forms/object_create.py:357 netbox/dcim/tables/devices.py:175
 #: netbox/dcim/forms/object_create.py:357 netbox/dcim/tables/devices.py:175
 #: netbox/dcim/tables/devices.py:747 netbox/dcim/tables/devicetypes.py:253
 #: netbox/dcim/tables/devices.py:747 netbox/dcim/tables/devicetypes.py:253
-#: netbox/templates/dcim/device.html:43 netbox/templates/dcim/device.html:131
+#: netbox/templates/dcim/device.html:49 netbox/templates/dcim/device.html:137
 #: netbox/templates/dcim/modulebay.html:38
 #: netbox/templates/dcim/modulebay.html:38
 #: netbox/templates/dcim/virtualchassis.html:66
 #: netbox/templates/dcim/virtualchassis.html:66
 #: netbox/templates/dcim/virtualchassis_edit.html:59
 #: netbox/templates/dcim/virtualchassis_edit.html:59
@@ -4104,7 +4105,7 @@ msgstr ""
 #: netbox/extras/forms/bulk_import.py:238 netbox/extras/forms/filtersets.py:66
 #: netbox/extras/forms/bulk_import.py:238 netbox/extras/forms/filtersets.py:66
 #: netbox/extras/forms/filtersets.py:160 netbox/extras/forms/filtersets.py:254
 #: netbox/extras/forms/filtersets.py:160 netbox/extras/forms/filtersets.py:254
 #: netbox/extras/forms/filtersets.py:284 netbox/extras/forms/model_forms.py:572
 #: netbox/extras/forms/filtersets.py:284 netbox/extras/forms/model_forms.py:572
-#: netbox/ipam/forms/bulk_edit.py:193 netbox/templates/dcim/device.html:324
+#: netbox/ipam/forms/bulk_edit.py:193 netbox/templates/dcim/device.html:330
 #: netbox/templates/dcim/devicetype.html:49
 #: netbox/templates/dcim/devicetype.html:49
 #: netbox/templates/dcim/moduletype.html:51 netbox/templates/dcim/rack.html:81
 #: netbox/templates/dcim/moduletype.html:51 netbox/templates/dcim/rack.html:81
 #: netbox/templates/dcim/racktype.html:41
 #: netbox/templates/dcim/racktype.html:41
@@ -4142,7 +4143,7 @@ msgid "Outer Dimensions"
 msgstr ""
 msgstr ""
 
 
 #: netbox/dcim/forms/bulk_edit.py:316 netbox/dcim/forms/model_forms.py:234
 #: netbox/dcim/forms/bulk_edit.py:316 netbox/dcim/forms/model_forms.py:234
-#: netbox/dcim/forms/model_forms.py:315 netbox/templates/dcim/device.html:315
+#: netbox/dcim/forms/model_forms.py:315 netbox/templates/dcim/device.html:321
 #: netbox/templates/dcim/inc/panels/racktype_dimensions.html:3
 #: netbox/templates/dcim/inc/panels/racktype_dimensions.html:3
 msgid "Dimensions"
 msgid "Dimensions"
 msgstr ""
 msgstr ""
@@ -4159,7 +4160,7 @@ msgid "Rack type"
 msgstr ""
 msgstr ""
 
 
 #: netbox/dcim/forms/bulk_edit.py:384 netbox/dcim/forms/bulk_edit.py:765
 #: netbox/dcim/forms/bulk_edit.py:384 netbox/dcim/forms/bulk_edit.py:765
-#: netbox/dcim/forms/bulk_edit.py:826 netbox/templates/dcim/device.html:104
+#: netbox/dcim/forms/bulk_edit.py:826 netbox/templates/dcim/device.html:110
 #: netbox/templates/dcim/module.html:77 netbox/templates/dcim/modulebay.html:70
 #: netbox/templates/dcim/module.html:77 netbox/templates/dcim/modulebay.html:70
 #: netbox/templates/dcim/rack.html:57
 #: netbox/templates/dcim/rack.html:57
 #: netbox/templates/virtualization/virtualmachine.html:35
 #: netbox/templates/virtualization/virtualmachine.html:35
@@ -4177,7 +4178,7 @@ msgstr ""
 #: netbox/dcim/forms/bulk_import.py:295 netbox/dcim/forms/bulk_import.py:453
 #: netbox/dcim/forms/bulk_import.py:295 netbox/dcim/forms/bulk_import.py:453
 #: netbox/dcim/forms/bulk_import.py:638 netbox/dcim/forms/filtersets.py:282
 #: netbox/dcim/forms/bulk_import.py:638 netbox/dcim/forms/filtersets.py:282
 #: netbox/dcim/forms/filtersets.py:513 netbox/dcim/forms/filtersets.py:684
 #: netbox/dcim/forms/filtersets.py:513 netbox/dcim/forms/filtersets.py:684
-#: netbox/dcim/forms/filtersets.py:824 netbox/templates/dcim/device.html:98
+#: netbox/dcim/forms/filtersets.py:824 netbox/templates/dcim/device.html:104
 #: netbox/templates/dcim/devicetype.html:65
 #: netbox/templates/dcim/devicetype.html:65
 #: netbox/templates/dcim/moduletype.html:47 netbox/templates/dcim/rack.html:65
 #: netbox/templates/dcim/moduletype.html:47 netbox/templates/dcim/rack.html:65
 #: netbox/templates/dcim/racktype.html:28
 #: netbox/templates/dcim/racktype.html:28
@@ -4196,7 +4197,7 @@ msgstr ""
 #: netbox/dcim/forms/model_forms.py:583 netbox/dcim/forms/model_forms.py:861
 #: netbox/dcim/forms/model_forms.py:583 netbox/dcim/forms/model_forms.py:861
 #: netbox/dcim/forms/object_create.py:404 netbox/dcim/tables/devices.py:171
 #: netbox/dcim/forms/object_create.py:404 netbox/dcim/tables/devices.py:171
 #: netbox/dcim/tables/power.py:70 netbox/dcim/tables/racks.py:225
 #: netbox/dcim/tables/power.py:70 netbox/dcim/tables/racks.py:225
-#: netbox/ipam/forms/filtersets.py:467 netbox/templates/dcim/device.html:30
+#: netbox/ipam/forms/filtersets.py:467 netbox/templates/dcim/device.html:36
 #: netbox/templates/dcim/inc/cable_termination.html:16
 #: netbox/templates/dcim/inc/cable_termination.html:16
 #: netbox/templates/dcim/powerfeed.html:28 netbox/templates/dcim/rack.html:13
 #: netbox/templates/dcim/powerfeed.html:28 netbox/templates/dcim/rack.html:13
 #: netbox/templates/dcim/rack/base.html:4
 #: netbox/templates/dcim/rack/base.html:4
@@ -4239,7 +4240,7 @@ msgstr ""
 #: netbox/dcim/forms/model_forms.py:1083 netbox/dcim/forms/model_forms.py:1111
 #: netbox/dcim/forms/model_forms.py:1083 netbox/dcim/forms/model_forms.py:1111
 #: netbox/dcim/forms/model_forms.py:1142 netbox/dcim/forms/model_forms.py:1161
 #: netbox/dcim/forms/model_forms.py:1142 netbox/dcim/forms/model_forms.py:1161
 #: netbox/dcim/forms/model_forms.py:1179 netbox/dcim/forms/object_create.py:123
 #: netbox/dcim/forms/model_forms.py:1179 netbox/dcim/forms/object_create.py:123
-#: netbox/dcim/tables/devicetypes.py:82 netbox/templates/dcim/device.html:88
+#: netbox/dcim/tables/devicetypes.py:82 netbox/templates/dcim/device.html:94
 #: netbox/templates/dcim/devicebay.html:52 netbox/templates/dcim/module.html:61
 #: netbox/templates/dcim/devicebay.html:52 netbox/templates/dcim/module.html:61
 msgid "Device Type"
 msgid "Device Type"
 msgstr ""
 msgstr ""
@@ -4310,7 +4311,7 @@ msgstr ""
 #: netbox/dcim/forms/bulk_edit.py:748 netbox/dcim/forms/bulk_import.py:556
 #: netbox/dcim/forms/bulk_edit.py:748 netbox/dcim/forms/bulk_import.py:556
 #: netbox/dcim/forms/filtersets.py:816 netbox/dcim/forms/model_forms.py:555
 #: netbox/dcim/forms/filtersets.py:816 netbox/dcim/forms/model_forms.py:555
 #: netbox/dcim/forms/model_forms.py:618 netbox/dcim/tables/devices.py:192
 #: netbox/dcim/forms/model_forms.py:618 netbox/dcim/tables/devices.py:192
-#: netbox/extras/filtersets.py:656 netbox/templates/dcim/device.html:186
+#: netbox/extras/filtersets.py:656 netbox/templates/dcim/device.html:192
 #: netbox/templates/dcim/platform.html:26
 #: netbox/templates/dcim/platform.html:26
 #: netbox/templates/virtualization/virtualmachine.html:27
 #: netbox/templates/virtualization/virtualmachine.html:27
 #: netbox/virtualization/forms/bulk_edit.py:142
 #: netbox/virtualization/forms/bulk_edit.py:142
@@ -4326,7 +4327,7 @@ msgstr ""
 #: netbox/dcim/forms/model_forms.py:627 netbox/dcim/tables/devices.py:212
 #: netbox/dcim/forms/model_forms.py:627 netbox/dcim/tables/devices.py:212
 #: netbox/extras/filtersets.py:689 netbox/extras/forms/filtersets.py:364
 #: netbox/extras/filtersets.py:689 netbox/extras/forms/filtersets.py:364
 #: netbox/ipam/forms/filtersets.py:439 netbox/ipam/forms/filtersets.py:472
 #: netbox/ipam/forms/filtersets.py:439 netbox/ipam/forms/filtersets.py:472
-#: netbox/templates/dcim/device.html:239
+#: netbox/templates/dcim/device.html:245
 #: netbox/templates/virtualization/cluster.html:10
 #: netbox/templates/virtualization/cluster.html:10
 #: netbox/templates/virtualization/virtualmachine.html:92
 #: netbox/templates/virtualization/virtualmachine.html:92
 #: netbox/templates/virtualization/virtualmachine.html:101
 #: netbox/templates/virtualization/virtualmachine.html:101
@@ -5085,7 +5086,7 @@ msgid "{side_upper} side termination not found: {device} {name}"
 msgstr ""
 msgstr ""
 
 
 #: netbox/dcim/forms/bulk_import.py:1461 netbox/dcim/forms/model_forms.py:891
 #: netbox/dcim/forms/bulk_import.py:1461 netbox/dcim/forms/model_forms.py:891
-#: netbox/dcim/tables/devices.py:1065 netbox/templates/dcim/device.html:132
+#: netbox/dcim/tables/devices.py:1065 netbox/templates/dcim/device.html:138
 #: netbox/templates/dcim/virtualchassis.html:27
 #: netbox/templates/dcim/virtualchassis.html:27
 #: netbox/templates/dcim/virtualchassis.html:67
 #: netbox/templates/dcim/virtualchassis.html:67
 msgid "Master"
 msgid "Master"
@@ -5116,7 +5117,7 @@ msgid "Single or three-phase"
 msgstr ""
 msgstr ""
 
 
 #: netbox/dcim/forms/bulk_import.py:1607 netbox/dcim/forms/model_forms.py:1847
 #: netbox/dcim/forms/bulk_import.py:1607 netbox/dcim/forms/model_forms.py:1847
-#: netbox/templates/dcim/device.html:190
+#: netbox/templates/dcim/device.html:196
 #: netbox/templates/dcim/virtualdevicecontext.html:30
 #: netbox/templates/dcim/virtualdevicecontext.html:30
 #: netbox/templates/virtualization/virtualmachine.html:52
 #: netbox/templates/virtualization/virtualmachine.html:52
 msgid "Primary IPv4"
 msgid "Primary IPv4"
@@ -5127,7 +5128,7 @@ msgid "IPv4 address with mask, e.g. 1.2.3.4/24"
 msgstr ""
 msgstr ""
 
 
 #: netbox/dcim/forms/bulk_import.py:1614 netbox/dcim/forms/model_forms.py:1856
 #: netbox/dcim/forms/bulk_import.py:1614 netbox/dcim/forms/model_forms.py:1856
-#: netbox/templates/dcim/device.html:206
+#: netbox/templates/dcim/device.html:212
 #: netbox/templates/dcim/virtualdevicecontext.html:41
 #: netbox/templates/dcim/virtualdevicecontext.html:41
 #: netbox/templates/virtualization/virtualmachine.html:68
 #: netbox/templates/virtualization/virtualmachine.html:68
 msgid "Primary IPv6"
 msgid "Primary IPv6"
@@ -5341,12 +5342,12 @@ msgstr ""
 msgid "A virtual chassis member already exists in position {vc_position}."
 msgid "A virtual chassis member already exists in position {vc_position}."
 msgstr ""
 msgstr ""
 
 
-#: netbox/dcim/forms/mixins.py:27 netbox/dcim/forms/mixins.py:75
+#: netbox/dcim/forms/mixins.py:27 netbox/dcim/forms/mixins.py:79
 #: netbox/ipam/forms/bulk_edit.py:425 netbox/ipam/forms/model_forms.py:617
 #: netbox/ipam/forms/bulk_edit.py:425 netbox/ipam/forms/model_forms.py:617
 msgid "Scope type"
 msgid "Scope type"
 msgstr ""
 msgstr ""
 
 
-#: netbox/dcim/forms/mixins.py:30 netbox/dcim/forms/mixins.py:78
+#: netbox/dcim/forms/mixins.py:30 netbox/dcim/forms/mixins.py:82
 #: netbox/ipam/forms/bulk_edit.py:270 netbox/ipam/forms/bulk_edit.py:428
 #: netbox/ipam/forms/bulk_edit.py:270 netbox/ipam/forms/bulk_edit.py:428
 #: netbox/ipam/forms/bulk_edit.py:447 netbox/ipam/forms/filtersets.py:181
 #: netbox/ipam/forms/bulk_edit.py:447 netbox/ipam/forms/filtersets.py:181
 #: netbox/ipam/forms/model_forms.py:231 netbox/ipam/forms/model_forms.py:620
 #: netbox/ipam/forms/model_forms.py:231 netbox/ipam/forms/model_forms.py:620
@@ -5365,7 +5366,7 @@ msgstr ""
 msgid "Scope"
 msgid "Scope"
 msgstr ""
 msgstr ""
 
 
-#: netbox/dcim/forms/mixins.py:104 netbox/ipam/forms/bulk_import.py:452
+#: netbox/dcim/forms/mixins.py:108 netbox/ipam/forms/bulk_import.py:452
 msgid "Scope type (app & model)"
 msgid "Scope type (app & model)"
 msgstr ""
 msgstr ""
 
 
@@ -5474,7 +5475,7 @@ msgstr ""
 #: netbox/dcim/forms/model_forms.py:1290 netbox/dcim/forms/model_forms.py:1761
 #: netbox/dcim/forms/model_forms.py:1290 netbox/dcim/forms/model_forms.py:1761
 #: netbox/dcim/tables/connections.py:27
 #: netbox/dcim/tables/connections.py:27
 #: netbox/templates/dcim/consoleport.html:17
 #: netbox/templates/dcim/consoleport.html:17
-#: netbox/templates/dcim/consoleserverport.html:74
+#: netbox/templates/dcim/consoleserverport.html:73
 #: netbox/templates/dcim/frontport.html:112
 #: netbox/templates/dcim/frontport.html:112
 msgid "Console Port"
 msgid "Console Port"
 msgstr ""
 msgstr ""
@@ -5489,7 +5490,7 @@ msgstr ""
 #: netbox/dcim/forms/model_forms.py:1292 netbox/dcim/forms/model_forms.py:1763
 #: netbox/dcim/forms/model_forms.py:1292 netbox/dcim/forms/model_forms.py:1763
 #: netbox/templates/circuits/inc/circuit_termination_fields.html:53
 #: netbox/templates/circuits/inc/circuit_termination_fields.html:53
 #: netbox/templates/dcim/consoleport.html:76
 #: netbox/templates/dcim/consoleport.html:76
-#: netbox/templates/dcim/consoleserverport.html:77
+#: netbox/templates/dcim/consoleserverport.html:76
 #: netbox/templates/dcim/frontport.html:17
 #: netbox/templates/dcim/frontport.html:17
 #: netbox/templates/dcim/frontport.html:115
 #: netbox/templates/dcim/frontport.html:115
 #: netbox/templates/dcim/interface.html:244
 #: netbox/templates/dcim/interface.html:244
@@ -5501,7 +5502,7 @@ msgstr ""
 #: netbox/dcim/tables/devices.py:750
 #: netbox/dcim/tables/devices.py:750
 #: netbox/templates/circuits/inc/circuit_termination_fields.html:54
 #: netbox/templates/circuits/inc/circuit_termination_fields.html:54
 #: netbox/templates/dcim/consoleport.html:79
 #: netbox/templates/dcim/consoleport.html:79
-#: netbox/templates/dcim/consoleserverport.html:80
+#: netbox/templates/dcim/consoleserverport.html:79
 #: netbox/templates/dcim/frontport.html:50
 #: netbox/templates/dcim/frontport.html:50
 #: netbox/templates/dcim/frontport.html:118
 #: netbox/templates/dcim/frontport.html:118
 #: netbox/templates/dcim/interface.html:247
 #: netbox/templates/dcim/interface.html:247
@@ -7233,7 +7234,7 @@ msgid "VMs"
 msgstr ""
 msgstr ""
 
 
 #: netbox/dcim/tables/devices.py:111 netbox/dcim/tables/devices.py:226
 #: netbox/dcim/tables/devices.py:111 netbox/dcim/tables/devices.py:226
-#: netbox/extras/forms/model_forms.py:712 netbox/templates/dcim/device.html:112
+#: netbox/extras/forms/model_forms.py:712 netbox/templates/dcim/device.html:118
 #: netbox/templates/dcim/devicerole.html:48
 #: netbox/templates/dcim/devicerole.html:48
 #: netbox/templates/dcim/platform.html:41
 #: netbox/templates/dcim/platform.html:41
 #: netbox/templates/extras/configtemplate.html:10
 #: netbox/templates/extras/configtemplate.html:10
@@ -7244,7 +7245,7 @@ msgstr ""
 msgid "Config Template"
 msgid "Config Template"
 msgstr ""
 msgstr ""
 
 
-#: netbox/dcim/tables/devices.py:197 netbox/dcim/tables/devices.py:1106
+#: netbox/dcim/tables/devices.py:197 netbox/dcim/tables/devices.py:1105
 #: netbox/ipam/forms/bulk_import.py:587 netbox/ipam/forms/model_forms.py:316
 #: netbox/ipam/forms/bulk_import.py:587 netbox/ipam/forms/model_forms.py:316
 #: netbox/ipam/forms/model_forms.py:329 netbox/ipam/tables/ip.py:314
 #: netbox/ipam/forms/model_forms.py:329 netbox/ipam/tables/ip.py:314
 #: netbox/ipam/tables/ip.py:381 netbox/ipam/tables/ip.py:391
 #: netbox/ipam/tables/ip.py:381 netbox/ipam/tables/ip.py:391
@@ -7253,12 +7254,12 @@ msgstr ""
 msgid "IP Address"
 msgid "IP Address"
 msgstr ""
 msgstr ""
 
 
-#: netbox/dcim/tables/devices.py:201 netbox/dcim/tables/devices.py:1110
+#: netbox/dcim/tables/devices.py:201 netbox/dcim/tables/devices.py:1109
 #: netbox/virtualization/tables/virtualmachines.py:56
 #: netbox/virtualization/tables/virtualmachines.py:56
 msgid "IPv4 Address"
 msgid "IPv4 Address"
 msgstr ""
 msgstr ""
 
 
-#: netbox/dcim/tables/devices.py:205 netbox/dcim/tables/devices.py:1114
+#: netbox/dcim/tables/devices.py:205 netbox/dcim/tables/devices.py:1113
 #: netbox/virtualization/tables/virtualmachines.py:60
 #: netbox/virtualization/tables/virtualmachines.py:60
 msgid "IPv6 Address"
 msgid "IPv6 Address"
 msgstr ""
 msgstr ""
@@ -7296,7 +7297,7 @@ msgstr ""
 msgid "Power outlets"
 msgid "Power outlets"
 msgstr ""
 msgstr ""
 
 
-#: netbox/dcim/tables/devices.py:256 netbox/dcim/tables/devices.py:1119
+#: netbox/dcim/tables/devices.py:256 netbox/dcim/tables/devices.py:1118
 #: netbox/dcim/tables/devicetypes.py:133 netbox/dcim/views.py:1173
 #: netbox/dcim/tables/devicetypes.py:133 netbox/dcim/views.py:1173
 #: netbox/dcim/views.py:1473 netbox/dcim/views.py:2226
 #: netbox/dcim/views.py:1473 netbox/dcim/views.py:2226
 #: netbox/netbox/navigation/menu.py:95 netbox/netbox/navigation/menu.py:259
 #: netbox/netbox/navigation/menu.py:95 netbox/netbox/navigation/menu.py:259
@@ -7576,7 +7577,7 @@ msgid "Racks"
 msgstr ""
 msgstr ""
 
 
 #: netbox/dcim/tables/racks.py:63 netbox/dcim/tables/racks.py:145
 #: netbox/dcim/tables/racks.py:63 netbox/dcim/tables/racks.py:145
-#: netbox/templates/dcim/device.html:318
+#: netbox/templates/dcim/device.html:324
 #: netbox/templates/dcim/inc/panels/racktype_dimensions.html:14
 #: netbox/templates/dcim/inc/panels/racktype_dimensions.html:14
 msgid "Height"
 msgid "Height"
 msgstr ""
 msgstr ""
@@ -10645,7 +10646,7 @@ msgstr ""
 msgid "Defined range exceeds maximum supported size ({max_size})"
 msgid "Defined range exceeds maximum supported size ({max_size})"
 msgstr ""
 msgstr ""
 
 
-#: netbox/ipam/models/ip.py:721 netbox/tenancy/models/contacts.py:78
+#: netbox/ipam/models/ip.py:721 netbox/tenancy/models/contacts.py:76
 msgid "address"
 msgid "address"
 msgstr ""
 msgstr ""
 
 
@@ -10887,7 +10888,7 @@ msgstr ""
 
 
 #: netbox/ipam/tables/ip.py:78 netbox/ipam/tables/ip.py:222
 #: netbox/ipam/tables/ip.py:78 netbox/ipam/tables/ip.py:222
 #: netbox/ipam/tables/ip.py:281 netbox/ipam/tables/vlans.py:55
 #: netbox/ipam/tables/ip.py:281 netbox/ipam/tables/vlans.py:55
-#: netbox/templates/dcim/device.html:260
+#: netbox/templates/dcim/device.html:266
 #: netbox/templates/ipam/aggregate.html:24
 #: netbox/templates/ipam/aggregate.html:24
 #: netbox/templates/ipam/iprange.html:37 netbox/templates/ipam/prefix.html:102
 #: netbox/templates/ipam/iprange.html:37 netbox/templates/ipam/prefix.html:102
 msgid "Utilization"
 msgid "Utilization"
@@ -11170,7 +11171,7 @@ msgstr ""
 msgid "Tab"
 msgid "Tab"
 msgstr ""
 msgstr ""
 
 
-#: netbox/netbox/choices.py:193 netbox/templates/dcim/device.html:327
+#: netbox/netbox/choices.py:193 netbox/templates/dcim/device.html:333
 #: netbox/templates/dcim/rack.html:107
 #: netbox/templates/dcim/rack.html:107
 msgid "Kilograms"
 msgid "Kilograms"
 msgstr ""
 msgstr ""
@@ -11179,7 +11180,7 @@ msgstr ""
 msgid "Grams"
 msgid "Grams"
 msgstr ""
 msgstr ""
 
 
-#: netbox/netbox/choices.py:195 netbox/templates/dcim/device.html:328
+#: netbox/netbox/choices.py:195 netbox/templates/dcim/device.html:334
 #: netbox/templates/dcim/rack.html:108
 #: netbox/templates/dcim/rack.html:108
 msgid "Pounds"
 msgid "Pounds"
 msgstr ""
 msgstr ""
@@ -11527,7 +11528,7 @@ msgstr ""
 msgid "Modules"
 msgid "Modules"
 msgstr ""
 msgstr ""
 
 
-#: netbox/netbox/navigation/menu.py:80 netbox/templates/dcim/device.html:160
+#: netbox/netbox/navigation/menu.py:80 netbox/templates/dcim/device.html:166
 #: netbox/templates/dcim/virtualdevicecontext.html:8
 #: netbox/templates/dcim/virtualdevicecontext.html:8
 msgid "Virtual Device Contexts"
 msgid "Virtual Device Contexts"
 msgstr ""
 msgstr ""
@@ -11605,7 +11606,7 @@ msgstr ""
 msgid "Service Templates"
 msgid "Service Templates"
 msgstr ""
 msgstr ""
 
 
-#: netbox/netbox/navigation/menu.py:213 netbox/templates/dcim/device.html:302
+#: netbox/netbox/navigation/menu.py:213 netbox/templates/dcim/device.html:308
 #: netbox/templates/ipam/ipaddress.html:118
 #: netbox/templates/ipam/ipaddress.html:118
 #: netbox/templates/virtualization/virtualmachine.html:154
 #: netbox/templates/virtualization/virtualmachine.html:154
 msgid "Services"
 msgid "Services"
@@ -12043,6 +12044,7 @@ msgid "Toggle all"
 msgstr ""
 msgstr ""
 
 
 #: netbox/netbox/tables/columns.py:307
 #: netbox/netbox/tables/columns.py:307
+#: netbox/templates/inc/table_controls_htmx.html:35
 msgid "Toggle Dropdown"
 msgid "Toggle Dropdown"
 msgstr ""
 msgstr ""
 
 
@@ -12507,7 +12509,7 @@ msgstr ""
 
 
 #: netbox/templates/circuits/inc/circuit_termination_fields.html:20
 #: netbox/templates/circuits/inc/circuit_termination_fields.html:20
 #: netbox/templates/dcim/consoleport.html:59
 #: netbox/templates/dcim/consoleport.html:59
-#: netbox/templates/dcim/consoleserverport.html:60
+#: netbox/templates/dcim/consoleserverport.html:59
 #: netbox/templates/dcim/powerfeed.html:114
 #: netbox/templates/dcim/powerfeed.html:114
 msgid "Marked as connected"
 msgid "Marked as connected"
 msgstr ""
 msgstr ""
@@ -12551,7 +12553,7 @@ msgstr ""
 
 
 #: netbox/templates/circuits/inc/circuit_termination_fields.html:49
 #: netbox/templates/circuits/inc/circuit_termination_fields.html:49
 #: netbox/templates/dcim/consoleport.html:69
 #: netbox/templates/dcim/consoleport.html:69
-#: netbox/templates/dcim/consoleserverport.html:70
+#: netbox/templates/dcim/consoleserverport.html:69
 #: netbox/templates/dcim/frontport.html:102
 #: netbox/templates/dcim/frontport.html:102
 #: netbox/templates/dcim/interface.html:237
 #: netbox/templates/dcim/interface.html:237
 #: netbox/templates/dcim/interface.html:257
 #: netbox/templates/dcim/interface.html:257
@@ -13070,7 +13072,7 @@ msgid "Rename Selected"
 msgstr ""
 msgstr ""
 
 
 #: netbox/templates/dcim/consoleport.html:65
 #: netbox/templates/dcim/consoleport.html:65
-#: netbox/templates/dcim/consoleserverport.html:66
+#: netbox/templates/dcim/consoleserverport.html:65
 #: netbox/templates/dcim/frontport.html:98
 #: netbox/templates/dcim/frontport.html:98
 #: netbox/templates/dcim/interface.html:233
 #: netbox/templates/dcim/interface.html:233
 #: netbox/templates/dcim/poweroutlet.html:83
 #: netbox/templates/dcim/poweroutlet.html:83
@@ -13078,86 +13080,86 @@ msgstr ""
 msgid "Not Connected"
 msgid "Not Connected"
 msgstr ""
 msgstr ""
 
 
-#: netbox/templates/dcim/device.html:34
+#: netbox/templates/dcim/device.html:40
 msgid "Highlight device in rack"
 msgid "Highlight device in rack"
 msgstr ""
 msgstr ""
 
 
-#: netbox/templates/dcim/device.html:55
+#: netbox/templates/dcim/device.html:61
 msgid "Not racked"
 msgid "Not racked"
 msgstr ""
 msgstr ""
 
 
-#: netbox/templates/dcim/device.html:62 netbox/templates/dcim/site.html:94
+#: netbox/templates/dcim/device.html:68 netbox/templates/dcim/site.html:94
 msgid "GPS Coordinates"
 msgid "GPS Coordinates"
 msgstr ""
 msgstr ""
 
 
-#: netbox/templates/dcim/device.html:68 netbox/templates/dcim/site.html:81
+#: netbox/templates/dcim/device.html:74 netbox/templates/dcim/site.html:81
 #: netbox/templates/dcim/site.html:100
 #: netbox/templates/dcim/site.html:100
 msgid "Map"
 msgid "Map"
 msgstr ""
 msgstr ""
 
 
-#: netbox/templates/dcim/device.html:108
+#: netbox/templates/dcim/device.html:114
 #: netbox/templates/dcim/inventoryitem.html:60
 #: netbox/templates/dcim/inventoryitem.html:60
 #: netbox/templates/dcim/module.html:81 netbox/templates/dcim/modulebay.html:74
 #: netbox/templates/dcim/module.html:81 netbox/templates/dcim/modulebay.html:74
 #: netbox/templates/dcim/rack.html:61
 #: netbox/templates/dcim/rack.html:61
 msgid "Asset Tag"
 msgid "Asset Tag"
 msgstr ""
 msgstr ""
 
 
-#: netbox/templates/dcim/device.html:123
+#: netbox/templates/dcim/device.html:129
 msgid "View Virtual Chassis"
 msgid "View Virtual Chassis"
 msgstr ""
 msgstr ""
 
 
-#: netbox/templates/dcim/device.html:164
+#: netbox/templates/dcim/device.html:170
 msgid "Create VDC"
 msgid "Create VDC"
 msgstr ""
 msgstr ""
 
 
-#: netbox/templates/dcim/device.html:175
+#: netbox/templates/dcim/device.html:181
 #: netbox/templates/dcim/device_edit.html:66
 #: netbox/templates/dcim/device_edit.html:66
 #: netbox/virtualization/forms/model_forms.py:230
 #: netbox/virtualization/forms/model_forms.py:230
 msgid "Management"
 msgid "Management"
 msgstr ""
 msgstr ""
 
 
-#: netbox/templates/dcim/device.html:195 netbox/templates/dcim/device.html:211
-#: netbox/templates/dcim/device.html:227
+#: netbox/templates/dcim/device.html:201 netbox/templates/dcim/device.html:217
+#: netbox/templates/dcim/device.html:233
 #: netbox/templates/virtualization/virtualmachine.html:57
 #: netbox/templates/virtualization/virtualmachine.html:57
 #: netbox/templates/virtualization/virtualmachine.html:73
 #: netbox/templates/virtualization/virtualmachine.html:73
 msgid "NAT for"
 msgid "NAT for"
 msgstr ""
 msgstr ""
 
 
-#: netbox/templates/dcim/device.html:197 netbox/templates/dcim/device.html:213
-#: netbox/templates/dcim/device.html:229
+#: netbox/templates/dcim/device.html:203 netbox/templates/dcim/device.html:219
+#: netbox/templates/dcim/device.html:235
 #: netbox/templates/virtualization/virtualmachine.html:59
 #: netbox/templates/virtualization/virtualmachine.html:59
 #: netbox/templates/virtualization/virtualmachine.html:75
 #: netbox/templates/virtualization/virtualmachine.html:75
 msgid "NAT"
 msgid "NAT"
 msgstr ""
 msgstr ""
 
 
-#: netbox/templates/dcim/device.html:252 netbox/templates/dcim/rack.html:73
+#: netbox/templates/dcim/device.html:258 netbox/templates/dcim/rack.html:73
 msgid "Power Utilization"
 msgid "Power Utilization"
 msgstr ""
 msgstr ""
 
 
-#: netbox/templates/dcim/device.html:256
+#: netbox/templates/dcim/device.html:262
 msgid "Input"
 msgid "Input"
 msgstr ""
 msgstr ""
 
 
-#: netbox/templates/dcim/device.html:257
+#: netbox/templates/dcim/device.html:263
 msgid "Outlets"
 msgid "Outlets"
 msgstr ""
 msgstr ""
 
 
-#: netbox/templates/dcim/device.html:258
+#: netbox/templates/dcim/device.html:264
 msgid "Allocated"
 msgid "Allocated"
 msgstr ""
 msgstr ""
 
 
-#: netbox/templates/dcim/device.html:268 netbox/templates/dcim/device.html:270
-#: netbox/templates/dcim/device.html:286
+#: netbox/templates/dcim/device.html:274 netbox/templates/dcim/device.html:276
+#: netbox/templates/dcim/device.html:292
 #: netbox/templates/dcim/powerfeed.html:67
 #: netbox/templates/dcim/powerfeed.html:67
 msgid "VA"
 msgid "VA"
 msgstr ""
 msgstr ""
 
 
-#: netbox/templates/dcim/device.html:280
+#: netbox/templates/dcim/device.html:286
 msgctxt "Leg of a power feed"
 msgctxt "Leg of a power feed"
 msgid "Leg"
 msgid "Leg"
 msgstr ""
 msgstr ""
 
 
-#: netbox/templates/dcim/device.html:306
+#: netbox/templates/dcim/device.html:312
 #: netbox/templates/virtualization/virtualmachine.html:158
 #: netbox/templates/virtualization/virtualmachine.html:158
 msgid "Add a service"
 msgid "Add a service"
 msgstr ""
 msgstr ""
@@ -15189,63 +15191,55 @@ msgstr ""
 msgid "Assigned contact"
 msgid "Assigned contact"
 msgstr ""
 msgstr ""
 
 
-#: netbox/tenancy/models/contacts.py:33
+#: netbox/tenancy/models/contacts.py:32
 msgid "contact group"
 msgid "contact group"
 msgstr ""
 msgstr ""
 
 
-#: netbox/tenancy/models/contacts.py:34
+#: netbox/tenancy/models/contacts.py:33
 msgid "contact groups"
 msgid "contact groups"
 msgstr ""
 msgstr ""
 
 
-#: netbox/tenancy/models/contacts.py:43
+#: netbox/tenancy/models/contacts.py:42
 msgid "contact role"
 msgid "contact role"
 msgstr ""
 msgstr ""
 
 
-#: netbox/tenancy/models/contacts.py:44
+#: netbox/tenancy/models/contacts.py:43
 msgid "contact roles"
 msgid "contact roles"
 msgstr ""
 msgstr ""
 
 
-#: netbox/tenancy/models/contacts.py:64
+#: netbox/tenancy/models/contacts.py:62
 msgid "title"
 msgid "title"
 msgstr ""
 msgstr ""
 
 
-#: netbox/tenancy/models/contacts.py:69
+#: netbox/tenancy/models/contacts.py:67
 msgid "phone"
 msgid "phone"
 msgstr ""
 msgstr ""
 
 
-#: netbox/tenancy/models/contacts.py:74
+#: netbox/tenancy/models/contacts.py:72
 msgid "email"
 msgid "email"
 msgstr ""
 msgstr ""
 
 
-#: netbox/tenancy/models/contacts.py:83
+#: netbox/tenancy/models/contacts.py:81
 msgid "link"
 msgid "link"
 msgstr ""
 msgstr ""
 
 
-#: netbox/tenancy/models/contacts.py:93
+#: netbox/tenancy/models/contacts.py:91
 msgid "contact"
 msgid "contact"
 msgstr ""
 msgstr ""
 
 
-#: netbox/tenancy/models/contacts.py:94
+#: netbox/tenancy/models/contacts.py:92
 msgid "contacts"
 msgid "contacts"
 msgstr ""
 msgstr ""
 
 
-#: netbox/tenancy/models/contacts.py:108
-msgid "contact group membership"
-msgstr ""
-
-#: netbox/tenancy/models/contacts.py:109
-msgid "contact group memberships"
-msgstr ""
-
-#: netbox/tenancy/models/contacts.py:153
+#: netbox/tenancy/models/contacts.py:139
 msgid "contact assignment"
 msgid "contact assignment"
 msgstr ""
 msgstr ""
 
 
-#: netbox/tenancy/models/contacts.py:154
+#: netbox/tenancy/models/contacts.py:140
 msgid "contact assignments"
 msgid "contact assignments"
 msgstr ""
 msgstr ""
 
 
-#: netbox/tenancy/models/contacts.py:170
+#: netbox/tenancy/models/contacts.py:156
 #, python-brace-format
 #, python-brace-format
 msgid "Contacts cannot be assigned to this object type ({type})."
 msgid "Contacts cannot be assigned to this object type ({type})."
 msgstr ""
 msgstr ""

+ 2 - 2
netbox/users/graphql/filters.py

@@ -14,13 +14,13 @@ __all__ = (
 )
 )
 
 
 
 
-@strawberry_django.filter(models.Group, lookups=True)
+@strawberry_django.filter_type(models.Group, lookups=True)
 class GroupFilter(BaseObjectTypeFilterMixin):
 class GroupFilter(BaseObjectTypeFilterMixin):
     name: FilterLookup[str] | None = strawberry_django.filter_field()
     name: FilterLookup[str] | None = strawberry_django.filter_field()
     description: FilterLookup[str] | None = strawberry_django.filter_field()
     description: FilterLookup[str] | None = strawberry_django.filter_field()
 
 
 
 
-@strawberry_django.filter(models.User, lookups=True)
+@strawberry_django.filter_type(models.User, lookups=True)
 class UserFilter(BaseObjectTypeFilterMixin):
 class UserFilter(BaseObjectTypeFilterMixin):
     username: FilterLookup[str] | None = strawberry_django.filter_field()
     username: FilterLookup[str] | None = strawberry_django.filter_field()
     first_name: FilterLookup[str] | None = strawberry_django.filter_field()
     first_name: FilterLookup[str] | None = strawberry_django.filter_field()

+ 6 - 6
netbox/virtualization/graphql/filters.py

@@ -39,7 +39,7 @@ __all__ = (
 )
 )
 
 
 
 
-@strawberry_django.filter(models.Cluster, lookups=True)
+@strawberry_django.filter_type(models.Cluster, lookups=True)
 class ClusterFilter(ContactFilterMixin, ScopedFilterMixin, TenancyFilterMixin, PrimaryModelFilterMixin):
 class ClusterFilter(ContactFilterMixin, ScopedFilterMixin, TenancyFilterMixin, PrimaryModelFilterMixin):
     name: FilterLookup[str] | None = strawberry_django.filter_field()
     name: FilterLookup[str] | None = strawberry_django.filter_field()
     type: Annotated['ClusterTypeFilter', strawberry.lazy('virtualization.graphql.filters')] | None = (
     type: Annotated['ClusterTypeFilter', strawberry.lazy('virtualization.graphql.filters')] | None = (
@@ -58,19 +58,19 @@ class ClusterFilter(ContactFilterMixin, ScopedFilterMixin, TenancyFilterMixin, P
     )
     )
 
 
 
 
-@strawberry_django.filter(models.ClusterGroup, lookups=True)
+@strawberry_django.filter_type(models.ClusterGroup, lookups=True)
 class ClusterGroupFilter(ContactFilterMixin, OrganizationalModelFilterMixin):
 class ClusterGroupFilter(ContactFilterMixin, OrganizationalModelFilterMixin):
     vlan_groups: Annotated['VLANGroupFilter', strawberry.lazy('ipam.graphql.filters')] | None = (
     vlan_groups: Annotated['VLANGroupFilter', strawberry.lazy('ipam.graphql.filters')] | None = (
         strawberry_django.filter_field()
         strawberry_django.filter_field()
     )
     )
 
 
 
 
-@strawberry_django.filter(models.ClusterType, lookups=True)
+@strawberry_django.filter_type(models.ClusterType, lookups=True)
 class ClusterTypeFilter(OrganizationalModelFilterMixin):
 class ClusterTypeFilter(OrganizationalModelFilterMixin):
     pass
     pass
 
 
 
 
-@strawberry_django.filter(models.VirtualMachine, lookups=True)
+@strawberry_django.filter_type(models.VirtualMachine, lookups=True)
 class VirtualMachineFilter(
 class VirtualMachineFilter(
     ContactFilterMixin,
     ContactFilterMixin,
     ImageAttachmentFilterMixin,
     ImageAttachmentFilterMixin,
@@ -130,7 +130,7 @@ class VirtualMachineFilter(
     )
     )
 
 
 
 
-@strawberry_django.filter(models.VMInterface, lookups=True)
+@strawberry_django.filter_type(models.VMInterface, lookups=True)
 class VMInterfaceFilter(VMComponentFilterMixin, InterfaceBaseFilterMixin):
 class VMInterfaceFilter(VMComponentFilterMixin, InterfaceBaseFilterMixin):
     ip_addresses: Annotated['IPAddressFilter', strawberry.lazy('ipam.graphql.filters')] | None = (
     ip_addresses: Annotated['IPAddressFilter', strawberry.lazy('ipam.graphql.filters')] | None = (
         strawberry_django.filter_field()
         strawberry_django.filter_field()
@@ -155,7 +155,7 @@ class VMInterfaceFilter(VMComponentFilterMixin, InterfaceBaseFilterMixin):
     )
     )
 
 
 
 
-@strawberry_django.filter(models.VirtualDisk, lookups=True)
+@strawberry_django.filter_type(models.VirtualDisk, lookups=True)
 class VirtualDiskFilter(VMComponentFilterMixin):
 class VirtualDiskFilter(VMComponentFilterMixin):
     size: Annotated['IntegerLookup', strawberry.lazy('netbox.graphql.filter_lookups')] | None = (
     size: Annotated['IntegerLookup', strawberry.lazy('netbox.graphql.filter_lookups')] | None = (
         strawberry_django.filter_field()
         strawberry_django.filter_field()

+ 10 - 10
netbox/vpn/graphql/filters.py

@@ -31,12 +31,12 @@ __all__ = (
 )
 )
 
 
 
 
-@strawberry_django.filter(models.TunnelGroup, lookups=True)
+@strawberry_django.filter_type(models.TunnelGroup, lookups=True)
 class TunnelGroupFilter(OrganizationalModelFilterMixin):
 class TunnelGroupFilter(OrganizationalModelFilterMixin):
     pass
     pass
 
 
 
 
-@strawberry_django.filter(models.TunnelTermination, lookups=True)
+@strawberry_django.filter_type(models.TunnelTermination, lookups=True)
 class TunnelTerminationFilter(
 class TunnelTerminationFilter(
     BaseObjectTypeFilterMixin, CustomFieldsFilterMixin, TagsFilterMixin, ChangeLogFilterMixin
     BaseObjectTypeFilterMixin, CustomFieldsFilterMixin, TagsFilterMixin, ChangeLogFilterMixin
 ):
 ):
@@ -56,7 +56,7 @@ class TunnelTerminationFilter(
     outside_ip_id: ID | None = strawberry_django.filter_field()
     outside_ip_id: ID | None = strawberry_django.filter_field()
 
 
 
 
-@strawberry_django.filter(models.Tunnel, lookups=True)
+@strawberry_django.filter_type(models.Tunnel, lookups=True)
 class TunnelFilter(TenancyFilterMixin, PrimaryModelFilterMixin):
 class TunnelFilter(TenancyFilterMixin, PrimaryModelFilterMixin):
     name: FilterLookup[str] | None = strawberry_django.filter_field()
     name: FilterLookup[str] | None = strawberry_django.filter_field()
     status: Annotated['TunnelStatusEnum', strawberry.lazy('vpn.graphql.enums')] | None = (
     status: Annotated['TunnelStatusEnum', strawberry.lazy('vpn.graphql.enums')] | None = (
@@ -80,7 +80,7 @@ class TunnelFilter(TenancyFilterMixin, PrimaryModelFilterMixin):
     )
     )
 
 
 
 
-@strawberry_django.filter(models.IKEProposal, lookups=True)
+@strawberry_django.filter_type(models.IKEProposal, lookups=True)
 class IKEProposalFilter(PrimaryModelFilterMixin):
 class IKEProposalFilter(PrimaryModelFilterMixin):
     name: FilterLookup[str] | None = strawberry_django.filter_field()
     name: FilterLookup[str] | None = strawberry_django.filter_field()
     authentication_method: Annotated['AuthenticationMethodEnum', strawberry.lazy('vpn.graphql.enums')] | None = (
     authentication_method: Annotated['AuthenticationMethodEnum', strawberry.lazy('vpn.graphql.enums')] | None = (
@@ -101,7 +101,7 @@ class IKEProposalFilter(PrimaryModelFilterMixin):
     )
     )
 
 
 
 
-@strawberry_django.filter(models.IKEPolicy, lookups=True)
+@strawberry_django.filter_type(models.IKEPolicy, lookups=True)
 class IKEPolicyFilter(PrimaryModelFilterMixin):
 class IKEPolicyFilter(PrimaryModelFilterMixin):
     name: FilterLookup[str] | None = strawberry_django.filter_field()
     name: FilterLookup[str] | None = strawberry_django.filter_field()
     version: Annotated['IKEVersionEnum', strawberry.lazy('vpn.graphql.enums')] | None = strawberry_django.filter_field()
     version: Annotated['IKEVersionEnum', strawberry.lazy('vpn.graphql.enums')] | None = strawberry_django.filter_field()
@@ -112,7 +112,7 @@ class IKEPolicyFilter(PrimaryModelFilterMixin):
     preshared_key: FilterLookup[str] | None = strawberry_django.filter_field()
     preshared_key: FilterLookup[str] | None = strawberry_django.filter_field()
 
 
 
 
-@strawberry_django.filter(models.IPSecProposal, lookups=True)
+@strawberry_django.filter_type(models.IPSecProposal, lookups=True)
 class IPSecProposalFilter(PrimaryModelFilterMixin):
 class IPSecProposalFilter(PrimaryModelFilterMixin):
     name: FilterLookup[str] | None = strawberry_django.filter_field()
     name: FilterLookup[str] | None = strawberry_django.filter_field()
     encryption_algorithm: Annotated['EncryptionAlgorithmEnum', strawberry.lazy('vpn.graphql.enums')] | None = (
     encryption_algorithm: Annotated['EncryptionAlgorithmEnum', strawberry.lazy('vpn.graphql.enums')] | None = (
@@ -132,7 +132,7 @@ class IPSecProposalFilter(PrimaryModelFilterMixin):
     )
     )
 
 
 
 
-@strawberry_django.filter(models.IPSecPolicy, lookups=True)
+@strawberry_django.filter_type(models.IPSecPolicy, lookups=True)
 class IPSecPolicyFilter(PrimaryModelFilterMixin):
 class IPSecPolicyFilter(PrimaryModelFilterMixin):
     name: FilterLookup[str] | None = strawberry_django.filter_field()
     name: FilterLookup[str] | None = strawberry_django.filter_field()
     proposals: Annotated['IPSecProposalFilter', strawberry.lazy('vpn.graphql.filters')] | None = (
     proposals: Annotated['IPSecProposalFilter', strawberry.lazy('vpn.graphql.filters')] | None = (
@@ -141,7 +141,7 @@ class IPSecPolicyFilter(PrimaryModelFilterMixin):
     pfs_group: Annotated['DHGroupEnum', strawberry.lazy('vpn.graphql.enums')] | None = strawberry_django.filter_field()
     pfs_group: Annotated['DHGroupEnum', strawberry.lazy('vpn.graphql.enums')] | None = strawberry_django.filter_field()
 
 
 
 
-@strawberry_django.filter(models.IPSecProfile, lookups=True)
+@strawberry_django.filter_type(models.IPSecProfile, lookups=True)
 class IPSecProfileFilter(PrimaryModelFilterMixin):
 class IPSecProfileFilter(PrimaryModelFilterMixin):
     name: FilterLookup[str] | None = strawberry_django.filter_field()
     name: FilterLookup[str] | None = strawberry_django.filter_field()
     mode: Annotated['IPSecModeEnum', strawberry.lazy('vpn.graphql.enums')] | None = strawberry_django.filter_field()
     mode: Annotated['IPSecModeEnum', strawberry.lazy('vpn.graphql.enums')] | None = strawberry_django.filter_field()
@@ -155,7 +155,7 @@ class IPSecProfileFilter(PrimaryModelFilterMixin):
     ipsec_policy_id: ID | None = strawberry_django.filter_field()
     ipsec_policy_id: ID | None = strawberry_django.filter_field()
 
 
 
 
-@strawberry_django.filter(models.L2VPN, lookups=True)
+@strawberry_django.filter_type(models.L2VPN, lookups=True)
 class L2VPNFilter(ContactFilterMixin, TenancyFilterMixin, PrimaryModelFilterMixin):
 class L2VPNFilter(ContactFilterMixin, TenancyFilterMixin, PrimaryModelFilterMixin):
     name: FilterLookup[str] | None = strawberry_django.filter_field()
     name: FilterLookup[str] | None = strawberry_django.filter_field()
     slug: FilterLookup[str] | None = strawberry_django.filter_field()
     slug: FilterLookup[str] | None = strawberry_django.filter_field()
@@ -174,7 +174,7 @@ class L2VPNFilter(ContactFilterMixin, TenancyFilterMixin, PrimaryModelFilterMixi
     )
     )
 
 
 
 
-@strawberry_django.filter(models.L2VPNTermination, lookups=True)
+@strawberry_django.filter_type(models.L2VPNTermination, lookups=True)
 class L2VPNTerminationFilter(NetBoxModelFilterMixin):
 class L2VPNTerminationFilter(NetBoxModelFilterMixin):
     l2vpn: Annotated['L2VPNFilter', strawberry.lazy('vpn.graphql.filters')] | None = strawberry_django.filter_field()
     l2vpn: Annotated['L2VPNFilter', strawberry.lazy('vpn.graphql.filters')] | None = strawberry_django.filter_field()
     l2vpn_id: ID | None = strawberry_django.filter_field()
     l2vpn_id: ID | None = strawberry_django.filter_field()

+ 3 - 3
netbox/wireless/graphql/filters.py

@@ -23,12 +23,12 @@ __all__ = (
 )
 )
 
 
 
 
-@strawberry_django.filter(models.WirelessLANGroup, lookups=True)
+@strawberry_django.filter_type(models.WirelessLANGroup, lookups=True)
 class WirelessLANGroupFilter(NestedGroupModelFilterMixin):
 class WirelessLANGroupFilter(NestedGroupModelFilterMixin):
     pass
     pass
 
 
 
 
-@strawberry_django.filter(models.WirelessLAN, lookups=True)
+@strawberry_django.filter_type(models.WirelessLAN, lookups=True)
 class WirelessLANFilter(
 class WirelessLANFilter(
     WirelessAuthenticationBaseFilterMixin,
     WirelessAuthenticationBaseFilterMixin,
     ScopedFilterMixin,
     ScopedFilterMixin,
@@ -47,7 +47,7 @@ class WirelessLANFilter(
     vlan_id: ID | None = strawberry_django.filter_field()
     vlan_id: ID | None = strawberry_django.filter_field()
 
 
 
 
-@strawberry_django.filter(models.WirelessLink, lookups=True)
+@strawberry_django.filter_type(models.WirelessLink, lookups=True)
 class WirelessLinkFilter(
 class WirelessLinkFilter(
     WirelessAuthenticationBaseFilterMixin,
     WirelessAuthenticationBaseFilterMixin,
     DistanceFilterMixin,
     DistanceFilterMixin,