Skip to content

Commit a4365be

Browse files
committed
Merge branch 'main' into feature
2 parents 1d2f6a8 + 4961b0d commit a4365be

File tree

76 files changed

+8905
-7223
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

76 files changed

+8905
-7223
lines changed

.github/ISSUE_TEMPLATE/01-feature_request.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ body:
1515
attributes:
1616
label: NetBox version
1717
description: What version of NetBox are you currently running?
18-
placeholder: v4.4.5
18+
placeholder: v4.4.6
1919
validations:
2020
required: true
2121
- type: dropdown

.github/ISSUE_TEMPLATE/02-bug_report.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ body:
2727
attributes:
2828
label: NetBox Version
2929
description: What version of NetBox are you currently running?
30-
placeholder: v4.4.5
30+
placeholder: v4.4.6
3131
validations:
3232
required: true
3333
- type: dropdown

.pre-commit-config.yaml

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -21,14 +21,6 @@ repos:
2121
language: system
2222
pass_filenames: false
2323
types: [python]
24-
- id: openapi-check
25-
name: "Validate OpenAPI schema"
26-
description: "Check for any unexpected changes to the OpenAPI schema"
27-
files: api/.*\.py$
28-
entry: scripts/verify-openapi.sh
29-
language: system
30-
pass_filenames: false
31-
types: [python]
3224
- id: mkdocs-build
3325
name: "Build documentation"
3426
description: "Build the documentation with mkdocs"

contrib/openapi.json

Lines changed: 88 additions & 21 deletions
Large diffs are not rendered by default.

docs/configuration/index.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ Some configuration parameters are primarily controlled via NetBox's admin interf
3535
* [`POWERFEED_DEFAULT_MAX_UTILIZATION`](./default-values.md#powerfeed_default_max_utilization)
3636
* [`POWERFEED_DEFAULT_VOLTAGE`](./default-values.md#powerfeed_default_voltage)
3737
* [`PREFER_IPV4`](./miscellaneous.md#prefer_ipv4)
38+
* [`PROTECTION_RULES`](./data-validation.md#protection_rules)
3839
* [`RACK_ELEVATION_DEFAULT_UNIT_HEIGHT`](./default-values.md#rack_elevation_default_unit_height)
3940
* [`RACK_ELEVATION_DEFAULT_UNIT_WIDTH`](./default-values.md#rack_elevation_default_unit_width)
4041

docs/configuration/security.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ If `True`, the cookie employed for cross-site request forgery (CSRF) protection
8181

8282
Default: `[]`
8383

84-
Defines a list of trusted origins for unsafe (e.g. `POST`) requests. This is a pass-through to Django's [`CSRF_TRUSTED_ORIGINS`](https://docs.djangoproject.com/en/stable/ref/settings/#csrf-trusted-origins) setting. Note that each host listed must specify a scheme (e.g. `http://` or `https://).
84+
Defines a list of trusted origins for unsafe (e.g. `POST`) requests. This is a pass-through to Django's [`CSRF_TRUSTED_ORIGINS`](https://docs.djangoproject.com/en/stable/ref/settings/#csrf-trusted-origins) setting. Note that each host listed must specify a scheme (e.g. `http://` or `https://`).
8585

8686
```python
8787
CSRF_TRUSTED_ORIGINS = (

docs/release-notes/version-4.4.md

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,33 @@
11
# NetBox v4.4
22

3+
## v4.4.6 (2025-11-11)
4+
5+
### Enhancements
6+
7+
* [#14171](https://github.com/netbox-community/netbox/issues/14171) - Support VLAN assignment for device & VM interfaces being bulk imported
8+
* [#20297](https://github.com/netbox-community/netbox/issues/20297) - Introduce additional coaxial cable types
9+
10+
### Bug Fixes
11+
12+
* [#20378](https://github.com/netbox-community/netbox/issues/20378) - Prevent exception when attempting to delete a data source utilized by a custom script
13+
* [#20645](https://github.com/netbox-community/netbox/issues/20645) - CSVChoiceField should defer to model field's default value when CSV field is empty
14+
* [#20647](https://github.com/netbox-community/netbox/issues/20647) - Improve handling of empty strings during bulk imports
15+
* [#20653](https://github.com/netbox-community/netbox/issues/20653) - Fix filtering of jobs by object type ID
16+
* [#20660](https://github.com/netbox-community/netbox/issues/20660) - Optimize loading of custom script modules from remote storage
17+
* [#20670](https://github.com/netbox-community/netbox/issues/20670) - Improve validation of related objects during bulk import
18+
* [#20688](https://github.com/netbox-community/netbox/issues/20688) - Suppress non-harmful "No active configuration revision found" warning message
19+
* [#20697](https://github.com/netbox-community/netbox/issues/20697) - Prevent duplication of signals which increment/decrement related object counts
20+
* [#20699](https://github.com/netbox-community/netbox/issues/20699) - Ensure proper ordering of changelog entries resulting from cascading deletions
21+
* [#20713](https://github.com/netbox-community/netbox/issues/20713) - Ensure a pre-change snapshot is recorded on virtual chassis members being added/removed
22+
* [#20721](https://github.com/netbox-community/netbox/issues/20721) - Fix breadcrumb navigation links in UI for background tasks
23+
* [#20738](https://github.com/netbox-community/netbox/issues/20738) - Deleting a virtual chassis should nullify the `vc_position` of all former members
24+
* [#20750](https://github.com/netbox-community/netbox/issues/20750) - Fix cloning of permissions when only one action is enabled
25+
* [#20755](https://github.com/netbox-community/netbox/issues/20755) - Prevent duplicate results under certain conditions when filtering providers
26+
* [#20771](https://github.com/netbox-community/netbox/issues/20771) - Comments are required when creating a new journal entry
27+
* [#20774](https://github.com/netbox-community/netbox/issues/20774) - Bulk action button labels should be translated
28+
29+
---
30+
331
## v4.4.5 (2025-10-28)
432

533
### Enhancements

netbox/circuits/filtersets.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -89,8 +89,6 @@ def search(self, queryset, name, value):
8989
return queryset.filter(
9090
Q(name__icontains=value) |
9191
Q(description__icontains=value) |
92-
Q(accounts__account__icontains=value) |
93-
Q(accounts__name__icontains=value) |
9492
Q(comments__icontains=value)
9593
)
9694

netbox/core/api/serializers_/jobs.py

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,13 @@
1+
from drf_spectacular.utils import extend_schema_field
2+
from rest_framework import serializers
3+
14
from core.choices import *
25
from core.models import Job
6+
from netbox.api.exceptions import SerializerNotFound
37
from netbox.api.fields import ChoiceField, ContentTypeField
48
from netbox.api.serializers import BaseModelSerializer
59
from users.api.serializers_.users import UserSerializer
10+
from utilities.api import get_serializer_for_model
611

712
__all__ = (
813
'JobSerializer',
@@ -18,11 +23,28 @@ class JobSerializer(BaseModelSerializer):
1823
object_type = ContentTypeField(
1924
read_only=True
2025
)
26+
object = serializers.SerializerMethodField(
27+
read_only=True
28+
)
2129

2230
class Meta:
2331
model = Job
2432
fields = [
25-
'id', 'url', 'display_url', 'display', 'object_type', 'object_id', 'name', 'status', 'created', 'scheduled',
26-
'interval', 'started', 'completed', 'user', 'data', 'error', 'job_id', 'log_entries',
33+
'id', 'url', 'display_url', 'display', 'object_type', 'object_id', 'object', 'name', 'status', 'created',
34+
'scheduled', 'interval', 'started', 'completed', 'user', 'data', 'error', 'job_id', 'log_entries',
2735
]
2836
brief_fields = ('url', 'created', 'completed', 'user', 'status')
37+
38+
@extend_schema_field(serializers.JSONField(allow_null=True))
39+
def get_object(self, obj):
40+
"""
41+
Serialize a nested representation of the object.
42+
"""
43+
if obj.object is None:
44+
return None
45+
try:
46+
serializer = get_serializer_for_model(obj.object)
47+
except SerializerNotFound:
48+
return obj.object_repr
49+
context = {'request': self.context['request']}
50+
return serializer(obj.object, nested=True, context=context).data

netbox/core/filtersets.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,10 @@ class JobFilterSet(BaseFilterSet):
8080
method='search',
8181
label=_('Search'),
8282
)
83+
object_type_id = django_filters.ModelMultipleChoiceFilter(
84+
queryset=ObjectType.objects.with_feature('jobs'),
85+
field_name='object_type_id',
86+
)
8387
object_type = ContentTypeFilter()
8488
created = django_filters.DateTimeFilter()
8589
created__before = django_filters.DateTimeFilter(
@@ -124,7 +128,7 @@ class JobFilterSet(BaseFilterSet):
124128

125129
class Meta:
126130
model = Job
127-
fields = ('id', 'object_type', 'object_id', 'name', 'interval', 'status', 'user', 'job_id')
131+
fields = ('id', 'object_type', 'object_type_id', 'object_id', 'name', 'interval', 'status', 'user', 'job_id')
128132

129133
def search(self, queryset, name, value):
130134
if not value.strip():

0 commit comments

Comments
 (0)