Skip to content

Commit f16c6d8

Browse files
committed
Merge branch 'develop' into feature
2 parents 9a45547 + e8d6281 commit f16c6d8

File tree

27 files changed

+446
-241
lines changed

27 files changed

+446
-241
lines changed

docs/administration/housekeeping.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ NetBox includes a `housekeeping` management command that should be run nightly.
88
This command can be invoked directly, or by using the shell script provided at `/opt/netbox/contrib/netbox-housekeeping.sh`. This script can be linked from your cron scheduler's daily jobs directory (e.g. `/etc/cron.daily`) or referenced directly within the cron configuration file.
99

1010
```shell
11-
ln -s /opt/netbox/contrib/netbox-housekeeping.sh /etc/cron.daily/netbox-housekeeping
11+
sudo ln -s /opt/netbox/contrib/netbox-housekeeping.sh /etc/cron.daily/netbox-housekeeping
1212
```
1313

1414
!!! note

docs/installation/3-netbox.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -267,7 +267,7 @@ NetBox includes a `housekeeping` management command that handles some recurring
267267
A shell script which invokes this command is included at `contrib/netbox-housekeeping.sh`. It can be copied to or linked from your system's daily cron task directory, or included within the crontab directly. (If installing NetBox into a nonstandard path, be sure to update the system paths within this script first.)
268268

269269
```shell
270-
ln -s /opt/netbox/contrib/netbox-housekeeping.sh /etc/cron.daily/netbox-housekeeping
270+
sudo ln -s /opt/netbox/contrib/netbox-housekeeping.sh /etc/cron.daily/netbox-housekeeping
271271
```
272272

273273
See the [housekeeping documentation](../administration/housekeeping.md) for further details.

docs/installation/upgrading.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ sudo systemctl restart netbox netbox-rq
114114
If upgrading from a release prior to NetBox v3.0, check that a cron task (or similar scheduled process) has been configured to run NetBox's nightly housekeeping command. A shell script which invokes this command is included at `contrib/netbox-housekeeping.sh`. It can be linked from your system's daily cron task directory, or included within the crontab directly. (If NetBox has been installed in a nonstandard path, be sure to update the system paths within this script first.)
115115

116116
```shell
117-
ln -s /opt/netbox/contrib/netbox-housekeeping.sh /etc/cron.daily/netbox-housekeeping
117+
sudo ln -s /opt/netbox/contrib/netbox-housekeeping.sh /etc/cron.daily/netbox-housekeeping
118118
```
119119

120120
See the [housekeeping documentation](../administration/housekeeping.md) for further details.

docs/release-notes/version-3.0.md

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,28 @@
22

33
## v3.0.11 (FUTURE)
44

5+
### Enhancements
6+
7+
* [#2101](https://github.com/netbox-community/netbox/issues/2101) - Add missing `q` filters for necessary models
8+
* [#7424](https://github.com/netbox-community/netbox/issues/7424) - Add virtual chassis filters for device components
9+
* [#7531](https://github.com/netbox-community/netbox/issues/7531) - Add Markdown support for strikethrough formatting
10+
* [#7542](https://github.com/netbox-community/netbox/issues/7542) - Add optional VLAN group column to prefixes table
11+
* [#7803](https://github.com/netbox-community/netbox/issues/7803) - Improve live reloading of custom scripts
12+
* [#7810](https://github.com/netbox-community/netbox/issues/7810) - Add IEEE 802.15.1 interface type
13+
14+
### Bug Fixes
15+
16+
* [#7399](https://github.com/netbox-community/netbox/issues/7399) - Fix excessive CPU utilization when `AUTH_LDAP_FIND_GROUP_PERMS` is enabled
17+
* [#7720](https://github.com/netbox-community/netbox/issues/7720) - Fix initialization of custom script MultiObjectVar field with multiple values
18+
* [#7729](https://github.com/netbox-community/netbox/issues/7729) - Fix permissions evaluation when displaying VLAN group VLANs table
19+
* [#7739](https://github.com/netbox-community/netbox/issues/7739) - Fix exception when tracing cable across circuit with no far end termination
20+
* [#7813](https://github.com/netbox-community/netbox/issues/7813) - Fix handling of errors during export template rendering
21+
* [#7851](https://github.com/netbox-community/netbox/issues/7851) - Add missing cluster name filter for virtual machines
22+
* [#7857](https://github.com/netbox-community/netbox/issues/7857) - Fix ordering IP addresses by assignment status
23+
* [#7859](https://github.com/netbox-community/netbox/issues/7859) - Fix styling of form widgets under cable connection views
24+
* [#7864](https://github.com/netbox-community/netbox/issues/7864) - `power_port` can be null when creating power outlets via REST API
25+
* [#7865](https://github.com/netbox-community/netbox/issues/7865) - REST API should support null values for console port speeds
26+
527
---
628

729
## v3.0.10 (2021-11-12)

netbox/dcim/api/nested_serializers.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -340,7 +340,7 @@ class NestedVirtualChassisSerializer(WritableNestedSerializer):
340340

341341
class Meta:
342342
model = models.VirtualChassis
343-
fields = ['id', 'name', 'url', 'master', 'member_count']
343+
fields = ['id', 'url', 'display', 'name', 'master', 'member_count']
344344

345345

346346
#

netbox/dcim/api/serializers.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -352,7 +352,8 @@ class PowerOutletTemplateSerializer(ValidatedModelSerializer):
352352
required=False
353353
)
354354
power_port = NestedPowerPortTemplateSerializer(
355-
required=False
355+
required=False,
356+
allow_null=True
356357
)
357358
feed_leg = ChoiceField(
358359
choices=PowerOutletFeedLegChoices,
@@ -524,7 +525,7 @@ class ConsoleServerPortSerializer(PrimaryModelSerializer, LinkTerminationSeriali
524525
)
525526
speed = ChoiceField(
526527
choices=ConsolePortSpeedChoices,
527-
allow_blank=True,
528+
allow_null=True,
528529
required=False
529530
)
530531
cable = NestedCableSerializer(read_only=True)
@@ -548,7 +549,7 @@ class ConsolePortSerializer(PrimaryModelSerializer, LinkTerminationSerializer, C
548549
)
549550
speed = ChoiceField(
550551
choices=ConsolePortSpeedChoices,
551-
allow_blank=True,
552+
allow_null=True,
552553
required=False
553554
)
554555
cable = NestedCableSerializer(read_only=True)
@@ -571,7 +572,8 @@ class PowerOutletSerializer(PrimaryModelSerializer, LinkTerminationSerializer, C
571572
required=False
572573
)
573574
power_port = NestedPowerPortSerializer(
574-
required=False
575+
required=False,
576+
allow_null=True
575577
)
576578
feed_leg = ChoiceField(
577579
choices=PowerOutletFeedLegChoices,

netbox/dcim/choices.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -759,6 +759,7 @@ class InterfaceTypeChoices(ChoiceSet):
759759
TYPE_80211AC = 'ieee802.11ac'
760760
TYPE_80211AD = 'ieee802.11ad'
761761
TYPE_80211AX = 'ieee802.11ax'
762+
TYPE_802151 = 'ieee802.15.1'
762763

763764
# Cellular
764765
TYPE_GSM = 'gsm'
@@ -871,6 +872,7 @@ class InterfaceTypeChoices(ChoiceSet):
871872
(TYPE_80211AC, 'IEEE 802.11ac'),
872873
(TYPE_80211AD, 'IEEE 802.11ad'),
873874
(TYPE_80211AX, 'IEEE 802.11ax'),
875+
(TYPE_802151, 'IEEE 802.15.1 (Bluetooth)'),
874876
)
875877
),
876878
(

netbox/dcim/filtersets.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -876,6 +876,17 @@ class DeviceComponentFilterSet(django_filters.FilterSet):
876876
to_field_name='name',
877877
label='Device (name)',
878878
)
879+
virtual_chassis_id = django_filters.ModelMultipleChoiceFilter(
880+
field_name='device__virtual_chassis',
881+
queryset=VirtualChassis.objects.all(),
882+
label='Virtual Chassis (ID)'
883+
)
884+
virtual_chassis = django_filters.ModelMultipleChoiceFilter(
885+
field_name='device__virtual_chassis__name',
886+
queryset=VirtualChassis.objects.all(),
887+
to_field_name='name',
888+
label='Virtual Chassis',
889+
)
879890
tag = TagFilter()
880891

881892
def search(self, queryset, name, value):
@@ -1416,6 +1427,10 @@ def search(self, queryset, name, value):
14161427
#
14171428

14181429
class ConnectionFilterSet(BaseFilterSet):
1430+
q = django_filters.CharFilter(
1431+
method='search',
1432+
label='Search',
1433+
)
14191434
site_id = MultiValueNumberFilter(
14201435
method='filter_connections',
14211436
field_name='device__site_id'
@@ -1438,6 +1453,15 @@ def filter_connections(self, queryset, name, value):
14381453
return queryset
14391454
return queryset.filter(**{f'{name}__in': value})
14401455

1456+
def search(self, queryset, name, value):
1457+
if not value.strip():
1458+
return queryset
1459+
qs_filter = (
1460+
Q(device__name__icontains=value) |
1461+
Q(cable__label__icontains=value)
1462+
)
1463+
return queryset.filter(qs_filter)
1464+
14411465

14421466
class ConsoleConnectionFilterSet(ConnectionFilterSet):
14431467

netbox/dcim/forms/connections.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -217,8 +217,7 @@ class ConnectCableToCircuitTerminationForm(BootstrapMixin, TenancyForm, CustomFi
217217
required=False
218218
)
219219

220-
class Meta:
221-
model = Cable
220+
class Meta(ConnectCableToDeviceForm.Meta):
222221
fields = [
223222
'termination_b_provider', 'termination_b_region', 'termination_b_site', 'termination_b_circuit',
224223
'termination_b_id', 'type', 'status', 'tenant_group', 'tenant', 'label', 'color', 'length', 'length_unit',
@@ -280,8 +279,7 @@ class ConnectCableToPowerFeedForm(BootstrapMixin, TenancyForm, CustomFieldModelF
280279
required=False
281280
)
282281

283-
class Meta:
284-
model = Cable
282+
class Meta(ConnectCableToDeviceForm.Meta):
285283
fields = [
286284
'termination_b_location', 'termination_b_powerpanel', 'termination_b_id', 'type', 'status', 'tenant_group',
287285
'tenant', 'label', 'color', 'length', 'length_unit', 'tags',

netbox/dcim/forms/filtersets.py

Lines changed: 31 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -93,12 +93,19 @@ class DeviceComponentFilterForm(BootstrapMixin, CustomFieldModelFilterForm):
9393
label=_('Location'),
9494
fetch_trigger='open'
9595
)
96+
virtual_chassis_id = DynamicModelMultipleChoiceField(
97+
queryset=VirtualChassis.objects.all(),
98+
required=False,
99+
label=_('Virtual Chassis'),
100+
fetch_trigger='open'
101+
)
96102
device_id = DynamicModelMultipleChoiceField(
97103
queryset=Device.objects.all(),
98104
required=False,
99105
query_params={
100106
'site_id': '$site_id',
101107
'location_id': '$location_id',
108+
'virtual_chassis_id': '$virtual_chassis_id'
102109
},
103110
label=_('Device'),
104111
fetch_trigger='open'
@@ -895,7 +902,7 @@ class ConsolePortFilterForm(DeviceComponentFilterForm):
895902
field_groups = [
896903
['q', 'tag'],
897904
['name', 'label', 'type', 'speed'],
898-
['region_id', 'site_group_id', 'site_id', 'location_id', 'device_id'],
905+
['region_id', 'site_group_id', 'site_id', 'location_id', 'virtual_chassis_id', 'device_id'],
899906
]
900907
type = forms.MultipleChoiceField(
901908
choices=ConsolePortTypeChoices,
@@ -915,7 +922,7 @@ class ConsoleServerPortFilterForm(DeviceComponentFilterForm):
915922
field_groups = [
916923
['q', 'tag'],
917924
['name', 'label', 'type', 'speed'],
918-
['region_id', 'site_group_id', 'site_id', 'location_id', 'device_id'],
925+
['region_id', 'site_group_id', 'site_id', 'location_id', 'virtual_chassis_id', 'device_id'],
919926
]
920927
type = forms.MultipleChoiceField(
921928
choices=ConsolePortTypeChoices,
@@ -935,7 +942,7 @@ class PowerPortFilterForm(DeviceComponentFilterForm):
935942
field_groups = [
936943
['q', 'tag'],
937944
['name', 'label', 'type'],
938-
['region_id', 'site_group_id', 'site_id', 'location_id', 'device_id'],
945+
['region_id', 'site_group_id', 'site_id', 'location_id', 'virtual_chassis_id', 'device_id'],
939946
]
940947
type = forms.MultipleChoiceField(
941948
choices=PowerPortTypeChoices,
@@ -950,7 +957,7 @@ class PowerOutletFilterForm(DeviceComponentFilterForm):
950957
field_groups = [
951958
['q', 'tag'],
952959
['name', 'label', 'type'],
953-
['region_id', 'site_group_id', 'site_id', 'location_id', 'device_id'],
960+
['region_id', 'site_group_id', 'site_id', 'location_id', 'virtual_chassis_id', 'device_id'],
954961
]
955962
type = forms.MultipleChoiceField(
956963
choices=PowerOutletTypeChoices,
@@ -966,7 +973,7 @@ class InterfaceFilterForm(DeviceComponentFilterForm):
966973
['q', 'tag'],
967974
['name', 'label', 'kind', 'type', 'enabled', 'mgmt_only', 'mac_address', 'wwn'],
968975
['rf_role', 'rf_channel', 'rf_channel_width', 'tx_power'],
969-
['region_id', 'site_group_id', 'site_id', 'location_id', 'device_id'],
976+
['region_id', 'site_group_id', 'site_id', 'location_id', 'virtual_chassis_id', 'device_id'],
970977
]
971978
kind = forms.MultipleChoiceField(
972979
choices=InterfaceKindChoices,
@@ -1031,7 +1038,7 @@ class FrontPortFilterForm(DeviceComponentFilterForm):
10311038
field_groups = [
10321039
['q', 'tag'],
10331040
['name', 'label', 'type', 'color'],
1034-
['region_id', 'site_group_id', 'site_id', 'location_id', 'device_id'],
1041+
['region_id', 'site_group_id', 'site_id', 'location_id', 'virtual_chassis_id', 'device_id'],
10351042
]
10361043
model = FrontPort
10371044
type = forms.MultipleChoiceField(
@@ -1050,7 +1057,7 @@ class RearPortFilterForm(DeviceComponentFilterForm):
10501057
field_groups = [
10511058
['q', 'tag'],
10521059
['name', 'label', 'type', 'color'],
1053-
['region_id', 'site_group_id', 'site_id', 'location_id', 'device_id'],
1060+
['region_id', 'site_group_id', 'site_id', 'location_id', 'virtual_chassis_id', 'device_id'],
10541061
]
10551062
type = forms.MultipleChoiceField(
10561063
choices=PortTypeChoices,
@@ -1068,7 +1075,7 @@ class DeviceBayFilterForm(DeviceComponentFilterForm):
10681075
field_groups = [
10691076
['q', 'tag'],
10701077
['name', 'label'],
1071-
['region_id', 'site_group_id', 'site_id', 'location_id', 'device_id'],
1078+
['region_id', 'site_group_id', 'site_id', 'location_id', 'virtual_chassis_id', 'device_id'],
10721079
]
10731080
tag = TagFilterField(model)
10741081

@@ -1078,7 +1085,7 @@ class InventoryItemFilterForm(DeviceComponentFilterForm):
10781085
field_groups = [
10791086
['q', 'tag'],
10801087
['name', 'label', 'manufacturer_id', 'serial', 'asset_tag', 'discovered'],
1081-
['region_id', 'site_group_id', 'site_id', 'location_id', 'device_id'],
1088+
['region_id', 'site_group_id', 'site_id', 'location_id', 'virtual_chassis_id', 'device_id'],
10821089
]
10831090
manufacturer_id = DynamicModelMultipleChoiceField(
10841091
queryset=Manufacturer.objects.all(),
@@ -1106,6 +1113,11 @@ class InventoryItemFilterForm(DeviceComponentFilterForm):
11061113
#
11071114

11081115
class ConsoleConnectionFilterForm(BootstrapMixin, forms.Form):
1116+
q = forms.CharField(
1117+
required=False,
1118+
widget=forms.TextInput(attrs={'placeholder': _('All Fields')}),
1119+
label=_('Search')
1120+
)
11091121
region_id = DynamicModelMultipleChoiceField(
11101122
queryset=Region.objects.all(),
11111123
required=False,
@@ -1133,6 +1145,11 @@ class ConsoleConnectionFilterForm(BootstrapMixin, forms.Form):
11331145

11341146

11351147
class PowerConnectionFilterForm(BootstrapMixin, forms.Form):
1148+
q = forms.CharField(
1149+
required=False,
1150+
widget=forms.TextInput(attrs={'placeholder': _('All Fields')}),
1151+
label=_('Search')
1152+
)
11361153
region_id = DynamicModelMultipleChoiceField(
11371154
queryset=Region.objects.all(),
11381155
required=False,
@@ -1160,6 +1177,11 @@ class PowerConnectionFilterForm(BootstrapMixin, forms.Form):
11601177

11611178

11621179
class InterfaceConnectionFilterForm(BootstrapMixin, forms.Form):
1180+
q = forms.CharField(
1181+
required=False,
1182+
widget=forms.TextInput(attrs={'placeholder': _('All Fields')}),
1183+
label=_('Search')
1184+
)
11631185
region_id = DynamicModelMultipleChoiceField(
11641186
queryset=Region.objects.all(),
11651187
required=False,

0 commit comments

Comments
 (0)