mirror of
https://github.com/netbox-community/netbox.git
synced 2025-08-07 16:18:16 -06:00
Merge branch 'develop' into 17460-module-bay-buttons
This commit is contained in:
commit
8720fb7307
4
.github/workflows/close-stale-issues.yml
vendored
4
.github/workflows/close-stale-issues.yml
vendored
@ -18,7 +18,7 @@ jobs:
|
|||||||
- uses: actions/stale@v9
|
- uses: actions/stale@v9
|
||||||
with:
|
with:
|
||||||
# General parameters
|
# General parameters
|
||||||
operations-per-run: 100
|
operations-per-run: 200
|
||||||
remove-stale-when-updated: false
|
remove-stale-when-updated: false
|
||||||
|
|
||||||
# Issue parameters
|
# Issue parameters
|
||||||
@ -43,7 +43,7 @@ jobs:
|
|||||||
# Pull request parameters
|
# Pull request parameters
|
||||||
close-pr-message: >
|
close-pr-message: >
|
||||||
This PR has been automatically closed due to lack of activity.
|
This PR has been automatically closed due to lack of activity.
|
||||||
days-before-pr-stale: 15
|
days-before-pr-stale: 30
|
||||||
days-before-pr-close: 15
|
days-before-pr-close: 15
|
||||||
exempt-pr-labels: 'status: blocked'
|
exempt-pr-labels: 'status: blocked'
|
||||||
stale-pr-label: 'pending closure'
|
stale-pr-label: 'pending closure'
|
||||||
|
@ -11,6 +11,10 @@ from core.models import ObjectType
|
|||||||
from users.models import User
|
from users.models import User
|
||||||
|
|
||||||
APPS = ('circuits', 'core', 'dcim', 'extras', 'ipam', 'tenancy', 'users', 'virtualization', 'vpn', 'wireless')
|
APPS = ('circuits', 'core', 'dcim', 'extras', 'ipam', 'tenancy', 'users', 'virtualization', 'vpn', 'wireless')
|
||||||
|
EXCLUDE_MODELS = (
|
||||||
|
'extras.branch',
|
||||||
|
'extras.stagedchange',
|
||||||
|
)
|
||||||
|
|
||||||
BANNER_TEXT = """### NetBox interactive shell ({node})
|
BANNER_TEXT = """### NetBox interactive shell ({node})
|
||||||
### Python {python} | Django {django} | NetBox {netbox}
|
### Python {python} | Django {django} | NetBox {netbox}
|
||||||
@ -44,12 +48,16 @@ class Command(BaseCommand):
|
|||||||
|
|
||||||
# Gather Django models and constants from each app
|
# Gather Django models and constants from each app
|
||||||
for app in APPS:
|
for app in APPS:
|
||||||
self.django_models[app] = []
|
models = []
|
||||||
|
|
||||||
# Load models from each app
|
# Load models from each app
|
||||||
for model in apps.get_app_config(app).get_models():
|
for model in apps.get_app_config(app).get_models():
|
||||||
namespace[model.__name__] = model
|
app_label = model._meta.app_label
|
||||||
self.django_models[app].append(model.__name__)
|
model_name = model._meta.model_name
|
||||||
|
if f'{app_label}.{model_name}' not in EXCLUDE_MODELS:
|
||||||
|
namespace[model.__name__] = model
|
||||||
|
models.append(model.__name__)
|
||||||
|
self.django_models[app] = sorted(models)
|
||||||
|
|
||||||
# Constants
|
# Constants
|
||||||
try:
|
try:
|
||||||
|
@ -684,6 +684,7 @@ class PowerOutletTypeChoices(ChoiceSet):
|
|||||||
# Direct current (DC)
|
# Direct current (DC)
|
||||||
TYPE_DC = 'dc-terminal'
|
TYPE_DC = 'dc-terminal'
|
||||||
# Proprietary
|
# Proprietary
|
||||||
|
TYPE_EATON_C39 = 'eaton-c39'
|
||||||
TYPE_HDOT_CX = 'hdot-cx'
|
TYPE_HDOT_CX = 'hdot-cx'
|
||||||
TYPE_SAF_D_GRID = 'saf-d-grid'
|
TYPE_SAF_D_GRID = 'saf-d-grid'
|
||||||
TYPE_NEUTRIK_POWERCON_20A = 'neutrik-powercon-20a'
|
TYPE_NEUTRIK_POWERCON_20A = 'neutrik-powercon-20a'
|
||||||
@ -805,6 +806,7 @@ class PowerOutletTypeChoices(ChoiceSet):
|
|||||||
(TYPE_DC, 'DC Terminal'),
|
(TYPE_DC, 'DC Terminal'),
|
||||||
)),
|
)),
|
||||||
(_('Proprietary'), (
|
(_('Proprietary'), (
|
||||||
|
(TYPE_EATON_C39, 'Eaton C39'),
|
||||||
(TYPE_HDOT_CX, 'HDOT Cx'),
|
(TYPE_HDOT_CX, 'HDOT Cx'),
|
||||||
(TYPE_SAF_D_GRID, 'Saf-D-Grid'),
|
(TYPE_SAF_D_GRID, 'Saf-D-Grid'),
|
||||||
(TYPE_NEUTRIK_POWERCON_20A, 'Neutrik powerCON (20A)'),
|
(TYPE_NEUTRIK_POWERCON_20A, 'Neutrik powerCON (20A)'),
|
||||||
|
@ -294,11 +294,11 @@ class CustomField(CloningMixin, ExportTemplatesMixin, ChangeLoggedModel):
|
|||||||
no longer assigned to a model, or because it has been deleted).
|
no longer assigned to a model, or because it has been deleted).
|
||||||
"""
|
"""
|
||||||
for ct in content_types:
|
for ct in content_types:
|
||||||
model = ct.model_class()
|
if model := ct.model_class():
|
||||||
instances = model.objects.filter(custom_field_data__has_key=self.name)
|
instances = model.objects.filter(custom_field_data__has_key=self.name)
|
||||||
for instance in instances:
|
for instance in instances:
|
||||||
del instance.custom_field_data[self.name]
|
del instance.custom_field_data[self.name]
|
||||||
model.objects.bulk_update(instances, ['custom_field_data'], batch_size=100)
|
model.objects.bulk_update(instances, ['custom_field_data'], batch_size=100)
|
||||||
|
|
||||||
def rename_object_data(self, old_name, new_name):
|
def rename_object_data(self, old_name, new_name):
|
||||||
"""
|
"""
|
||||||
|
@ -1,5 +1,8 @@
|
|||||||
|
from django.utils.translation import gettext_lazy as _
|
||||||
from rest_framework import serializers
|
from rest_framework import serializers
|
||||||
|
|
||||||
|
from utilities.views import get_viewname
|
||||||
|
|
||||||
__all__ = (
|
__all__ = (
|
||||||
'NetBoxAPIHyperlinkedIdentityField',
|
'NetBoxAPIHyperlinkedIdentityField',
|
||||||
'NetBoxURLHyperlinkedIdentityField',
|
'NetBoxURLHyperlinkedIdentityField',
|
||||||
@ -30,12 +33,10 @@ class BaseNetBoxHyperlinkedIdentityField(serializers.HyperlinkedIdentityField):
|
|||||||
lookup_value = getattr(obj, self.lookup_field)
|
lookup_value = getattr(obj, self.lookup_field)
|
||||||
kwargs = {self.lookup_url_kwarg: lookup_value}
|
kwargs = {self.lookup_url_kwarg: lookup_value}
|
||||||
|
|
||||||
model_name = self.parent.Meta.model._meta.model_name
|
view_name = self.get_view_name(obj)
|
||||||
app_name = self.parent.Meta.model._meta.app_label
|
|
||||||
view_name = self.get_view_name(app_name, model_name)
|
|
||||||
return self.reverse(view_name, kwargs=kwargs, request=request, format=format)
|
return self.reverse(view_name, kwargs=kwargs, request=request, format=format)
|
||||||
|
|
||||||
def get_view_name(self, app_name, model_name):
|
def get_view_name(self, model):
|
||||||
raise NotImplementedError(_('{class_name} must implement get_view_name()').format(
|
raise NotImplementedError(_('{class_name} must implement get_view_name()').format(
|
||||||
class_name=self.__class__.__name__
|
class_name=self.__class__.__name__
|
||||||
))
|
))
|
||||||
@ -43,11 +44,11 @@ class BaseNetBoxHyperlinkedIdentityField(serializers.HyperlinkedIdentityField):
|
|||||||
|
|
||||||
class NetBoxAPIHyperlinkedIdentityField(BaseNetBoxHyperlinkedIdentityField):
|
class NetBoxAPIHyperlinkedIdentityField(BaseNetBoxHyperlinkedIdentityField):
|
||||||
|
|
||||||
def get_view_name(self, app_name, model_name):
|
def get_view_name(self, model):
|
||||||
return f'{app_name}-api:{model_name}-detail'
|
return get_viewname(model=model, action='detail', rest_api=True)
|
||||||
|
|
||||||
|
|
||||||
class NetBoxURLHyperlinkedIdentityField(BaseNetBoxHyperlinkedIdentityField):
|
class NetBoxURLHyperlinkedIdentityField(BaseNetBoxHyperlinkedIdentityField):
|
||||||
|
|
||||||
def get_view_name(self, app_name, model_name):
|
def get_view_name(self, model):
|
||||||
return f'{app_name}:{model_name}'
|
return get_viewname(model=model)
|
||||||
|
BIN
netbox/project-static/dist/netbox.css
vendored
BIN
netbox/project-static/dist/netbox.css
vendored
Binary file not shown.
@ -24,7 +24,7 @@
|
|||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@fontsource-variable/plus-jakarta-sans": "^5.1.0",
|
"@fontsource-variable/plus-jakarta-sans": "^5.1.0",
|
||||||
"@mdi/font": "7.4.47",
|
"@mdi/font": "7.4.47",
|
||||||
"@tabler/core": "1.0.0-beta20",
|
"@tabler/core": "1.0.0-beta21",
|
||||||
"bootstrap": "5.3.3",
|
"bootstrap": "5.3.3",
|
||||||
"clipboard": "2.0.11",
|
"clipboard": "2.0.11",
|
||||||
"flatpickr": "4.6.13",
|
"flatpickr": "4.6.13",
|
||||||
|
@ -675,19 +675,19 @@
|
|||||||
resolved "https://registry.yarnpkg.com/@rtsao/scc/-/scc-1.1.0.tgz#927dd2fae9bc3361403ac2c7a00c32ddce9ad7e8"
|
resolved "https://registry.yarnpkg.com/@rtsao/scc/-/scc-1.1.0.tgz#927dd2fae9bc3361403ac2c7a00c32ddce9ad7e8"
|
||||||
integrity sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==
|
integrity sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==
|
||||||
|
|
||||||
"@tabler/core@1.0.0-beta20":
|
"@tabler/core@1.0.0-beta21":
|
||||||
version "1.0.0-beta20"
|
version "1.0.0-beta21"
|
||||||
resolved "https://registry.yarnpkg.com/@tabler/core/-/core-1.0.0-beta20.tgz#3fcc3b5634ca89a413ba9c077df7bdfc531ab93c"
|
resolved "https://registry.yarnpkg.com/@tabler/core/-/core-1.0.0-beta21.tgz#cd10d7648b3b7b31927a430fd776d3304e796403"
|
||||||
integrity sha512-OzKpur+Ug7e+HMbNJrMcSuWZGUsJTvu7HYboBNRE8qyo1RKIWqvwL5YewKBJ+odW5pDOqBPzbsS4je3EBQQxHw==
|
integrity sha512-9ZKu38BScc0eHruhX/SlVDSiXenBFSgBp2WDq6orkuC8J/1yutKDt7CdXuJpBwkiADEk5yqYV31Ku+CnhwOc3Q==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@popperjs/core" "^2.11.8"
|
"@popperjs/core" "^2.11.8"
|
||||||
"@tabler/icons" "^2.32.0"
|
"@tabler/icons" "^3.14.0"
|
||||||
bootstrap "5.3.1"
|
bootstrap "5.3.3"
|
||||||
|
|
||||||
"@tabler/icons@^2.32.0":
|
"@tabler/icons@^3.14.0":
|
||||||
version "2.47.0"
|
version "3.16.0"
|
||||||
resolved "https://registry.yarnpkg.com/@tabler/icons/-/icons-2.47.0.tgz#c41c680d1947e3ab2d60af3febc4132287c60596"
|
resolved "https://registry.yarnpkg.com/@tabler/icons/-/icons-3.16.0.tgz#d618670b80163925a31a6c2290e8775f6058d81a"
|
||||||
integrity sha512-4w5evLh+7FUUiA1GucvGj2ReX2TvOjEr4ejXdwL/bsjoSkof6r1gQmzqI+VHrE2CpJpB3al7bCTulOkFa/RcyA==
|
integrity sha512-GU7MSx4uQEr55BmyON6hD/QYTl6k1v0YlRhM91gBWDoKAbyCt6QIYw7rpJ/ecdh5zrHaTOJKPenZ4+luoutwFA==
|
||||||
|
|
||||||
"@tanstack/react-virtual@^3.0.0-beta.60":
|
"@tanstack/react-virtual@^3.0.0-beta.60":
|
||||||
version "3.5.0"
|
version "3.5.0"
|
||||||
@ -977,11 +977,6 @@ binary-extensions@^2.0.0:
|
|||||||
resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522"
|
resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522"
|
||||||
integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==
|
integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==
|
||||||
|
|
||||||
bootstrap@5.3.1:
|
|
||||||
version "5.3.1"
|
|
||||||
resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-5.3.1.tgz#8ca07040ad15d7f75891d1504cf14c5dedfb1cfe"
|
|
||||||
integrity sha512-jzwza3Yagduci2x0rr9MeFSORjcHpt0lRZukZPZQJT1Dth5qzV7XcgGqYzi39KGAVYR8QEDVoO0ubFKOxzMG+g==
|
|
||||||
|
|
||||||
bootstrap@5.3.3:
|
bootstrap@5.3.3:
|
||||||
version "5.3.3"
|
version "5.3.3"
|
||||||
resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-5.3.3.tgz#de35e1a765c897ac940021900fcbb831602bac38"
|
resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-5.3.3.tgz#de35e1a765c897ac940021900fcbb831602bac38"
|
||||||
|
Loading…
Reference in New Issue
Block a user