Merge branch 'netbox-community:develop' into develop

This commit is contained in:
Ash Kirby 2024-03-15 15:35:29 +00:00 committed by GitHub
commit fb646dd915
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
14 changed files with 45 additions and 21 deletions

View File

@ -17,15 +17,16 @@ body:
How are you running NetBox? (For issues with the Docker image, please go to the How are you running NetBox? (For issues with the Docker image, please go to the
[netbox-docker](https://github.com/netbox-community/netbox-docker) repo.) [netbox-docker](https://github.com/netbox-community/netbox-docker) repo.)
options: options:
- Self-hosted
- NetBox Cloud - NetBox Cloud
- NetBox Enterprise
- Self-hosted
validations: validations:
required: true required: true
- type: input - type: input
attributes: attributes:
label: NetBox Version label: NetBox Version
description: What version of NetBox are you currently running? description: What version of NetBox are you currently running?
placeholder: v3.7.3 placeholder: v3.7.4
validations: validations:
required: true required: true
- type: dropdown - type: dropdown

View File

@ -14,7 +14,7 @@ body:
attributes: attributes:
label: NetBox version label: NetBox version
description: What version of NetBox are you currently running? description: What version of NetBox are you currently running?
placeholder: v3.7.3 placeholder: v3.7.4
validations: validations:
required: true required: true
- type: dropdown - type: dropdown

View File

@ -84,4 +84,4 @@ jobs:
run: coverage run --source="netbox/" netbox/manage.py test netbox/ --parallel run: coverage run --source="netbox/" netbox/manage.py test netbox/ --parallel
- name: Show coverage report - name: Show coverage report
run: coverage report --skip-covered --omit *migrations* run: coverage report --skip-covered --omit '*/migrations/*,*/tests/*'

View File

@ -101,7 +101,7 @@ markdown-include
mkdocs-material mkdocs-material
# Introspection for embedded code # Introspection for embedded code
# https://github.com/mkdocstrings/mkdocstrings/blob/master/CHANGELOG.md # https://github.com/mkdocstrings/mkdocstrings/blob/main/CHANGELOG.md
mkdocstrings[python-legacy] mkdocstrings[python-legacy]
# Library for manipulating IP prefixes and addresses # Library for manipulating IP prefixes and addresses

View File

@ -384,7 +384,10 @@
"8gfc-sfpp", "8gfc-sfpp",
"16gfc-sfpp", "16gfc-sfpp",
"32gfc-sfp28", "32gfc-sfp28",
"32gfc-sfpp",
"64gfc-qsfpp", "64gfc-qsfpp",
"64gfc-sfpdd",
"64gfc-sfpp",
"128gfc-qsfp28", "128gfc-qsfp28",
"infiniband-sdr", "infiniband-sdr",
"infiniband-ddr", "infiniband-ddr",

View File

@ -1,20 +1,31 @@
# NetBox v3.7 # NetBox v3.7
## v3.7.4 (FUTURE) ## v3.7.5 (FUTURE)
---
## v3.7.4 (2024-03-13)
### Enhancements ### Enhancements
* [#14206](https://github.com/netbox-community/netbox/issues/14206) - Add additional FibreChannel SFP+ interface types
* [#14366](https://github.com/netbox-community/netbox/issues/14366) - Enable custom links for config contexts & templates
* [#15291](https://github.com/netbox-community/netbox/issues/15291) - Add tunnel termination buttons to VM interfaces table * [#15291](https://github.com/netbox-community/netbox/issues/15291) - Add tunnel termination buttons to VM interfaces table
* [#15297](https://github.com/netbox-community/netbox/issues/15297) - Linkify platform column in device & virtual machine tables * [#15297](https://github.com/netbox-community/netbox/issues/15297) - Linkify platform column in device & virtual machine tables
### Bug Fixes ### Bug Fixes
* [#13722](https://github.com/netbox-community/netbox/issues/13722) - Fix range expansion for comma-separated numerical values
* [#14832](https://github.com/netbox-community/netbox/issues/14832) - Enable querying IP addresses for an FHRP group via GraphQL
* [#15220](https://github.com/netbox-community/netbox/issues/15220) - Fix validation check when bulk editing the mask length of IP addresses * [#15220](https://github.com/netbox-community/netbox/issues/15220) - Fix validation check when bulk editing the mask length of IP addresses
* [#15232](https://github.com/netbox-community/netbox/issues/15232) - Permit user with sufficient permissions to assign an inventory item to a device type * [#15232](https://github.com/netbox-community/netbox/issues/15232) - Permit user with sufficient permissions to assign an inventory item to a device type
* [#15241](https://github.com/netbox-community/netbox/issues/15241) - Restore missing `display` field on VirtualDisk serialization in REST API * [#15241](https://github.com/netbox-community/netbox/issues/15241) - Restore missing `display` field on VirtualDisk serialization in REST API
* [#15243](https://github.com/netbox-community/netbox/issues/15243) - Correct representation of installed module when listing module bays using REST API brief mode * [#15243](https://github.com/netbox-community/netbox/issues/15243) - Correct representation of installed module when listing module bays using REST API brief mode
* [#15316](https://github.com/netbox-community/netbox/issues/15316) - Fix selection of 3DES encryption for IKE & IPSec proposals * [#15316](https://github.com/netbox-community/netbox/issues/15316) - Fix selection of 3DES encryption for IKE & IPSec proposals
* [#15322](https://github.com/netbox-community/netbox/issues/15322) - Add description field to YAML export for device & module types
* [#15336](https://github.com/netbox-community/netbox/issues/15336) - Correct label for recurring scheduled jobs * [#15336](https://github.com/netbox-community/netbox/issues/15336) - Correct label for recurring scheduled jobs
* [#15347](https://github.com/netbox-community/netbox/issues/15347) - Fix querying virtual machine contacts via GraphQL
* [#15356](https://github.com/netbox-community/netbox/issues/15356) - Fix assignment of front & rear images to device types via REST API
--- ---

View File

@ -326,8 +326,8 @@ class DeviceTypeSerializer(NetBoxModelSerializer):
airflow = ChoiceField(choices=DeviceAirflowChoices, allow_blank=True, required=False, allow_null=True) airflow = ChoiceField(choices=DeviceAirflowChoices, allow_blank=True, required=False, allow_null=True)
weight_unit = ChoiceField(choices=WeightUnitChoices, allow_blank=True, required=False, allow_null=True) weight_unit = ChoiceField(choices=WeightUnitChoices, allow_blank=True, required=False, allow_null=True)
device_count = serializers.IntegerField(read_only=True) device_count = serializers.IntegerField(read_only=True)
front_image = serializers.URLField(allow_null=True, required=False) front_image = serializers.ImageField(required=False, allow_null=True)
rear_image = serializers.URLField(allow_null=True, required=False) rear_image = serializers.ImageField(required=False, allow_null=True)
# Counter fields # Counter fields
console_port_template_count = serializers.IntegerField(read_only=True) console_port_template_count = serializers.IntegerField(read_only=True)

View File

@ -901,7 +901,10 @@ class InterfaceTypeChoices(ChoiceSet):
TYPE_8GFC_SFP_PLUS = '8gfc-sfpp' TYPE_8GFC_SFP_PLUS = '8gfc-sfpp'
TYPE_16GFC_SFP_PLUS = '16gfc-sfpp' TYPE_16GFC_SFP_PLUS = '16gfc-sfpp'
TYPE_32GFC_SFP28 = '32gfc-sfp28' TYPE_32GFC_SFP28 = '32gfc-sfp28'
TYPE_32GFC_SFP_PLUS = '32gfc-sfpp'
TYPE_64GFC_QSFP_PLUS = '64gfc-qsfpp' TYPE_64GFC_QSFP_PLUS = '64gfc-qsfpp'
TYPE_64GFC_SFP_DD = '64gfc-sfpdd'
TYPE_64GFC_SFP_PLUS = '64gfc-sfpp'
TYPE_128GFC_QSFP28 = '128gfc-qsfp28' TYPE_128GFC_QSFP28 = '128gfc-qsfp28'
# InfiniBand # InfiniBand
@ -1070,7 +1073,10 @@ class InterfaceTypeChoices(ChoiceSet):
(TYPE_8GFC_SFP_PLUS, 'SFP+ (8GFC)'), (TYPE_8GFC_SFP_PLUS, 'SFP+ (8GFC)'),
(TYPE_16GFC_SFP_PLUS, 'SFP+ (16GFC)'), (TYPE_16GFC_SFP_PLUS, 'SFP+ (16GFC)'),
(TYPE_32GFC_SFP28, 'SFP28 (32GFC)'), (TYPE_32GFC_SFP28, 'SFP28 (32GFC)'),
(TYPE_32GFC_SFP_PLUS, 'SFP+ (32GFC)'),
(TYPE_64GFC_QSFP_PLUS, 'QSFP+ (64GFC)'), (TYPE_64GFC_QSFP_PLUS, 'QSFP+ (64GFC)'),
(TYPE_64GFC_SFP_DD, 'SFP-DD (64GFC)'),
(TYPE_64GFC_SFP_PLUS, 'SFP+ (64GFC)'),
(TYPE_128GFC_QSFP28, 'QSFP28 (128GFC)'), (TYPE_128GFC_QSFP28, 'QSFP28 (128GFC)'),
) )
), ),

View File

@ -229,15 +229,16 @@ class DeviceType(ImageAttachmentsMixin, PrimaryModel, WeightMixin):
'manufacturer': self.manufacturer.name, 'manufacturer': self.manufacturer.name,
'model': self.model, 'model': self.model,
'slug': self.slug, 'slug': self.slug,
'description': self.description,
'default_platform': self.default_platform.name if self.default_platform else None, 'default_platform': self.default_platform.name if self.default_platform else None,
'part_number': self.part_number, 'part_number': self.part_number,
'u_height': float(self.u_height), 'u_height': float(self.u_height),
'is_full_depth': self.is_full_depth, 'is_full_depth': self.is_full_depth,
'subdevice_role': self.subdevice_role, 'subdevice_role': self.subdevice_role,
'airflow': self.airflow, 'airflow': self.airflow,
'comments': self.comments,
'weight': float(self.weight) if self.weight is not None else None, 'weight': float(self.weight) if self.weight is not None else None,
'weight_unit': self.weight_unit, 'weight_unit': self.weight_unit,
'comments': self.comments,
} }
# Component templates # Component templates
@ -415,9 +416,10 @@ class ModuleType(ImageAttachmentsMixin, PrimaryModel, WeightMixin):
'manufacturer': self.manufacturer.name, 'manufacturer': self.manufacturer.name,
'model': self.model, 'model': self.model,
'part_number': self.part_number, 'part_number': self.part_number,
'comments': self.comments, 'description': self.description,
'weight': float(self.weight) if self.weight is not None else None, 'weight': float(self.weight) if self.weight is not None else None,
'weight_unit': self.weight_unit, 'weight_unit': self.weight_unit,
'comments': self.comments,
} }
# Component templates # Component templates

View File

@ -7,6 +7,7 @@ from extras.models import ObjectChange
__all__ = ( __all__ = (
'ChangelogMixin', 'ChangelogMixin',
'ConfigContextMixin', 'ConfigContextMixin',
'ContactsMixin',
'CustomFieldsMixin', 'CustomFieldsMixin',
'ImageAttachmentsMixin', 'ImageAttachmentsMixin',
'JournalEntriesMixin', 'JournalEntriesMixin',

View File

@ -11,7 +11,7 @@ from extras.querysets import ConfigContextQuerySet
from netbox.config import get_config from netbox.config import get_config
from netbox.registry import registry from netbox.registry import registry
from netbox.models import ChangeLoggedModel from netbox.models import ChangeLoggedModel
from netbox.models.features import CloningMixin, ExportTemplatesMixin, SyncedDataMixin, TagsMixin from netbox.models.features import CloningMixin, CustomLinksMixin, ExportTemplatesMixin, SyncedDataMixin, TagsMixin
from utilities.jinja2 import ConfigTemplateLoader from utilities.jinja2 import ConfigTemplateLoader
from utilities.utils import deepmerge from utilities.utils import deepmerge
@ -26,7 +26,7 @@ __all__ = (
# Config contexts # Config contexts
# #
class ConfigContext(SyncedDataMixin, CloningMixin, ChangeLoggedModel): class ConfigContext(SyncedDataMixin, CloningMixin, CustomLinksMixin, ChangeLoggedModel):
""" """
A ConfigContext represents a set of arbitrary data available to any Device or VirtualMachine matching its assigned A ConfigContext represents a set of arbitrary data available to any Device or VirtualMachine matching its assigned
qualifiers (region, site, etc.). For example, the data stored in a ConfigContext assigned to site A and tenant B qualifiers (region, site, etc.). For example, the data stored in a ConfigContext assigned to site A and tenant B
@ -210,7 +210,7 @@ class ConfigContextModel(models.Model):
# Config templates # Config templates
# #
class ConfigTemplate(SyncedDataMixin, ExportTemplatesMixin, TagsMixin, ChangeLoggedModel): class ConfigTemplate(SyncedDataMixin, CustomLinksMixin, ExportTemplatesMixin, TagsMixin, ChangeLoggedModel):
name = models.CharField( name = models.CharField(
verbose_name=_('name'), verbose_name=_('name'),
max_length=100 max_length=100

View File

@ -28,7 +28,7 @@ from netbox.plugins import PluginConfig
# Environment setup # Environment setup
# #
VERSION = '3.7.4-dev' VERSION = '3.7.5-dev'
# Hostname # Hostname
HOSTNAME = platform.node() HOSTNAME = platform.node()

View File

@ -1,5 +1,5 @@
from dcim.graphql.types import ComponentObjectType from dcim.graphql.types import ComponentObjectType
from extras.graphql.mixins import ConfigContextMixin from extras.graphql.mixins import ConfigContextMixin, ContactsMixin
from ipam.graphql.mixins import IPAddressesMixin, VLANGroupsMixin from ipam.graphql.mixins import IPAddressesMixin, VLANGroupsMixin
from netbox.graphql.types import OrganizationalObjectType, NetBoxObjectType from netbox.graphql.types import OrganizationalObjectType, NetBoxObjectType
from virtualization import filtersets, models from virtualization import filtersets, models
@ -38,7 +38,7 @@ class ClusterTypeType(OrganizationalObjectType):
filterset_class = filtersets.ClusterTypeFilterSet filterset_class = filtersets.ClusterTypeFilterSet
class VirtualMachineType(ConfigContextMixin, NetBoxObjectType): class VirtualMachineType(ConfigContextMixin, ContactsMixin, NetBoxObjectType):
class Meta: class Meta:
model = models.VirtualMachine model = models.VirtualMachine

View File

@ -1,8 +1,8 @@
bleach==6.1.0 bleach==6.1.0
Django==4.2.10 Django==4.2.11
django-cors-headers==4.3.1 django-cors-headers==4.3.1
django-debug-toolbar==4.3.0 django-debug-toolbar==4.3.0
django-filter==23.5 django-filter==24.1
django-graphiql-debug-toolbar==0.2.0 django-graphiql-debug-toolbar==0.2.0
django-mptt==0.14.0 django-mptt==0.14.0
django-pglocks==1.0.4 django-pglocks==1.0.4
@ -15,14 +15,14 @@ django-tables2==2.7.0
django-timezone-field==6.1.0 django-timezone-field==6.1.0
djangorestframework==3.14.0 djangorestframework==3.14.0
drf-spectacular==0.27.1 drf-spectacular==0.27.1
drf-spectacular-sidecar==2024.2.1 drf-spectacular-sidecar==2024.3.4
feedparser==6.0.11 feedparser==6.0.11
graphene-django==3.0.0 graphene-django==3.0.0
gunicorn==21.2.0 gunicorn==21.2.0
Jinja2==3.1.3 Jinja2==3.1.3
Markdown==3.5.2 Markdown==3.5.2
mkdocs-material==9.5.10 mkdocs-material==9.5.13
mkdocstrings[python-legacy]==0.24.0 mkdocstrings[python-legacy]==0.24.1
netaddr==1.2.1 netaddr==1.2.1
Pillow==10.2.0 Pillow==10.2.0
psycopg[binary,pool]==3.1.18 psycopg[binary,pool]==3.1.18