mirror of
https://github.com/netbox-community/netbox.git
synced 2026-01-13 22:03:32 +01:00
Compare commits
51 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6ea0c0c3e9 | ||
|
|
6a6154f02f | ||
|
|
5b2f2e1da6 | ||
|
|
23f94839ad | ||
|
|
92d8aa583a | ||
|
|
d9028f9202 | ||
|
|
976f9310f9 | ||
|
|
a9fee5cd32 | ||
|
|
5013a6c692 | ||
|
|
8624734610 | ||
|
|
ead6e637f4 | ||
|
|
b4e181c015 | ||
|
|
2a8b11de8e | ||
|
|
dee8e6f733 | ||
|
|
e93719e4f9 | ||
|
|
52a0b454c0 | ||
|
|
0ec632e548 | ||
|
|
cc6f21ded2 | ||
|
|
b4dd71d578 | ||
|
|
9bccc11c28 | ||
|
|
5485b04bcd | ||
|
|
68bd37a08f | ||
|
|
85396866bc | ||
|
|
50df0a1073 | ||
|
|
01db481bc3 | ||
|
|
cfb5696d29 | ||
|
|
8420af8562 | ||
|
|
b7df06ae7f | ||
|
|
88abb6902d | ||
|
|
116a423d8f | ||
|
|
9c9c4fbd6e | ||
|
|
896b5b9b74 | ||
|
|
dd0774d8d4 | ||
|
|
b46a89640f | ||
|
|
6b219a279b | ||
|
|
2dd5c82845 | ||
|
|
f4d4483050 | ||
|
|
8deaaae44b | ||
|
|
6d0a3485a1 | ||
|
|
8e6a15a25e | ||
|
|
44c7786cd9 | ||
|
|
f7dd09da08 | ||
|
|
3000407a5f | ||
|
|
7167f20ca5 | ||
|
|
c79c664e96 | ||
|
|
f5d6f5d997 | ||
|
|
48ca5d4d7e | ||
|
|
893adef79c | ||
|
|
bdf182ffd6 | ||
|
|
65f81ab81d | ||
|
|
fa1e89d3d2 |
@@ -14,7 +14,7 @@ body:
|
||||
attributes:
|
||||
label: NetBox version
|
||||
description: What version of NetBox are you currently running?
|
||||
placeholder: v4.1.1
|
||||
placeholder: v4.1.3
|
||||
validations:
|
||||
required: true
|
||||
- type: dropdown
|
||||
|
||||
2
.github/ISSUE_TEMPLATE/02-bug_report.yaml
vendored
2
.github/ISSUE_TEMPLATE/02-bug_report.yaml
vendored
@@ -26,7 +26,7 @@ body:
|
||||
attributes:
|
||||
label: NetBox Version
|
||||
description: What version of NetBox are you currently running?
|
||||
placeholder: v4.1.1
|
||||
placeholder: v4.1.3
|
||||
validations:
|
||||
required: true
|
||||
- type: dropdown
|
||||
|
||||
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
|
||||
with:
|
||||
# General parameters
|
||||
operations-per-run: 100
|
||||
operations-per-run: 200
|
||||
remove-stale-when-updated: false
|
||||
|
||||
# Issue parameters
|
||||
@@ -43,7 +43,7 @@ jobs:
|
||||
# Pull request parameters
|
||||
close-pr-message: >
|
||||
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
|
||||
exempt-pr-labels: 'status: blocked'
|
||||
stale-pr-label: 'pending closure'
|
||||
|
||||
11
README.md
11
README.md
@@ -7,7 +7,11 @@
|
||||
<a href="https://github.com/netbox-community/netbox/stargazers"><img src="https://img.shields.io/github/stars/netbox-community/netbox?style=flat" alt="GitHub stars" /></a>
|
||||
<a href="https://explore.transifex.com/netbox-community/netbox/"><img src="https://img.shields.io/badge/languages-15-blue" alt="Languages supported" /></a>
|
||||
<a href="https://github.com/netbox-community/netbox/actions/workflows/ci.yml"><img src="https://github.com/netbox-community/netbox/workflows/CI/badge.svg?branch=master" alt="CI status" /></a>
|
||||
<p></p>
|
||||
<p>
|
||||
<strong><a href="https://github.com/netbox-community/netbox/">NetBox Community</a></strong> |
|
||||
<strong><a href="https://netboxlabs.com/netbox-cloud/">NetBox Cloud</a></strong> |
|
||||
<strong><a href="https://netboxlabs.com/netbox-enterprise/">NetBox Enterprise</a></strong>
|
||||
</p>
|
||||
</div>
|
||||
|
||||
NetBox exists to empower network engineers. Since its release in 2016, it has become the go-to solution for modeling and documenting network infrastructure for thousands of organizations worldwide. As a successor to legacy IPAM and DCIM applications, NetBox provides a cohesive, extensive, and accessible data model for all things networked. By providing a single robust user interface and programmable APIs for everything from cable maps to device configurations, NetBox serves as the central source of truth for the modern network.
|
||||
@@ -81,11 +85,6 @@ NetBox automatically logs the creation, modification, and deletion of all manage
|
||||
* The [official documentation](https://docs.netbox.dev) offers a comprehensive introduction.
|
||||
* Check out [our wiki](https://github.com/netbox-community/netbox/wiki/Community-Contributions) for even more projects to get the most out of NetBox!
|
||||
|
||||
<p align="center">
|
||||
<a href="https://netboxlabs.com/netbox-cloud/"><img src="docs/media/misc/netbox_cloud.png" alt="NetBox Cloud" /></a><br />
|
||||
Looking for a managed solution? Check out <strong><a href="https://netboxlabs.com/netbox-cloud/">NetBox Cloud</a></strong> or <strong><a href="https://netboxlabs.com/netbox-enterprise/">NetBox Enterprise</a></strong>!
|
||||
</p>
|
||||
|
||||
## Get Involved
|
||||
|
||||
* Follow [@NetBoxOfficial](https://twitter.com/NetBoxOfficial) on Twitter!
|
||||
|
||||
@@ -290,6 +290,7 @@
|
||||
"molex-micro-fit-2x2",
|
||||
"molex-micro-fit-2x4",
|
||||
"dc-terminal",
|
||||
"eaton-c39",
|
||||
"hdot-cx",
|
||||
"saf-d-grid",
|
||||
"neutrik-powercon-20a",
|
||||
@@ -330,6 +331,7 @@
|
||||
"5gbase-t",
|
||||
"10gbase-t",
|
||||
"10gbase-cx4",
|
||||
"100base-x-sfp",
|
||||
"1000base-x-gbic",
|
||||
"1000base-x-sfp",
|
||||
"10gbase-x-sfpp",
|
||||
@@ -381,6 +383,7 @@
|
||||
"ieee802.11ay",
|
||||
"ieee802.11be",
|
||||
"ieee802.15.1",
|
||||
"ieee802.15.4",
|
||||
"other-wireless",
|
||||
"gsm",
|
||||
"cdma",
|
||||
|
||||
18
docs/_theme/partials/copyright.html
vendored
Normal file
18
docs/_theme/partials/copyright.html
vendored
Normal file
@@ -0,0 +1,18 @@
|
||||
<div class="md-copyright">
|
||||
{% if config.copyright %}
|
||||
<div class="md-copyright__highlight">
|
||||
{{ config.copyright }}
|
||||
</div>
|
||||
{% endif %}
|
||||
{% if not config.extra.generator == false %}
|
||||
Made with
|
||||
<a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
|
||||
Material for MkDocs
|
||||
</a>
|
||||
{% endif %}
|
||||
</div>
|
||||
{% if not config.extra.build_public %}
|
||||
<div class="md-copyright">
|
||||
ℹ️ Documentation is being served locally
|
||||
</div>
|
||||
{% endif %}
|
||||
@@ -13,6 +13,9 @@ To enable remote data synchronization, the NetBox administrator first designates
|
||||
!!! info
|
||||
Data backends which connect to external sources typically require the installation of one or more supporting Python libraries. The Git backend requires the [`dulwich`](https://www.dulwich.io/) package, and the S3 backend requires the [`boto3`](https://boto3.amazonaws.com/v1/documentation/api/latest/index.html) package. These must be installed within NetBox's environment to enable these backends.
|
||||
|
||||
!!! info
|
||||
If you are configuring Git and have `HTTP_PROXIES` configured to use the SOCKS protocol, you will also need to install the [`python_socks`](https://pypi.org/project/python-socks/) Python library.
|
||||
|
||||
Each type of remote source has its own configuration parameters. For instance, a git source will ask the user to specify a branch and authentication credentials. Once the source has been created, a synchronization job is run to automatically replicate remote files in the local database.
|
||||
|
||||
The following NetBox models can be associated with replicated data files:
|
||||
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 6.8 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 3.8 KiB |
@@ -1,6 +1,6 @@
|
||||
# ASNs
|
||||
|
||||
An Autonomous System Number (ASN) is a numeric identifier used in the BGP protocol to identify which [autonomous system](https://en.wikipedia.org/wiki/Autonomous_system_%28Internet%29) a particular prefix is originating and transiting through. NetBox support both 32- and 64- ASNs.
|
||||
An Autonomous System Number (ASN) is a numeric identifier used in the Border Gateway Protocol (BGP) to identify which [autonomous system](https://en.wikipedia.org/wiki/Autonomous_system_%28Internet%29) a particular prefix is originating from or transiting through. NetBox supports both 16- and 32-bit ASNs.
|
||||
|
||||
ASNs must be globally unique within NetBox, and may be allocated from within a [defined range](./asnrange.md). Each ASN may be assigned to multiple [sites](../dcim/site.md).
|
||||
|
||||
@@ -8,7 +8,7 @@ ASNs must be globally unique within NetBox, and may be allocated from within a [
|
||||
|
||||
### AS Number
|
||||
|
||||
The 32- or 64-bit AS number.
|
||||
The 16- or 32-bit AS number.
|
||||
|
||||
### RIR
|
||||
|
||||
|
||||
@@ -1,5 +1,53 @@
|
||||
# NetBox v4.1
|
||||
|
||||
## v4.1.3 (2024-10-02)
|
||||
|
||||
### Enhancements
|
||||
|
||||
* [#17639](https://github.com/netbox-community/netbox/issues/17639) - Add SOCKS support to proxy settings for Git remote data sources
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* [#17558](https://github.com/netbox-community/netbox/issues/17558) - Raise validation error when attempting to remove a custom field choice in use
|
||||
|
||||
---
|
||||
|
||||
## v4.1.2 (2024-09-26)
|
||||
|
||||
### Enhancements
|
||||
|
||||
* [#14201](https://github.com/netbox-community/netbox/issues/14201) - Enable global search for AS numbers using "AS" prefix
|
||||
* [#15408](https://github.com/netbox-community/netbox/issues/15408) - Enable bulk import of primary IPv4 & IPv6 addresses for virtual device contexts (VDCs)
|
||||
* [#16781](https://github.com/netbox-community/netbox/issues/16781) - Add 100Base-X SFP interface type
|
||||
* [#17255](https://github.com/netbox-community/netbox/issues/17255) - Include return URL when creating new IP address from prefix IPs list
|
||||
* [#17471](https://github.com/netbox-community/netbox/issues/17471) - Add Eaton C39 power outlet type
|
||||
* [#17482](https://github.com/netbox-community/netbox/issues/17482) - Do not preload Branch & StagedChange models in `nbshell`
|
||||
* [#17550](https://github.com/netbox-community/netbox/issues/17550) - Add IEEE 802.15.4 wireless interface type
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* [#16837](https://github.com/netbox-community/netbox/issues/16837) - Fix filtering of cables with no type assigned
|
||||
* [#17083](https://github.com/netbox-community/netbox/issues/17083) - Trim clickable area of form field labels
|
||||
* [#17126](https://github.com/netbox-community/netbox/issues/17126) - Show total device weight in both imperial & metric units
|
||||
* [#17360](https://github.com/netbox-community/netbox/issues/17360) - Fix AttributeError under child object views when experimental HTMX navigation is enabled
|
||||
* [#17406](https://github.com/netbox-community/netbox/issues/17406) - Fix the cleanup of stale custom field data after removing a plugin
|
||||
* [#17419](https://github.com/netbox-community/netbox/issues/17419) - Rebuild MPTT for module bays on upgrade to v4.1
|
||||
* [#17492](https://github.com/netbox-community/netbox/issues/17492) - Fix URL resolution in `NetBoxModelSerializer` for plugin models
|
||||
* [#17497](https://github.com/netbox-community/netbox/issues/17497) - Fix uncaught FieldError exception when referencing an invalid field on a related object during bulk import
|
||||
* [#17498](https://github.com/netbox-community/netbox/issues/17498) - Fix MultipleObjectsReturned exception when importing a device type without uniquely specifying a manufacturer
|
||||
* [#17501](https://github.com/netbox-community/netbox/issues/17501) - Fix reporting of last run time & status for custom scripts under UI
|
||||
* [#17511](https://github.com/netbox-community/netbox/issues/17511) - Restore consistent font support for non-Latin characters
|
||||
* [#17517](https://github.com/netbox-community/netbox/issues/17517) - Fix cable termination selection after switching termination type
|
||||
* [#17521](https://github.com/netbox-community/netbox/issues/17521) - Correct text color in notification pop-ups under dark mode
|
||||
* [#17522](https://github.com/netbox-community/netbox/issues/17522) - Fix language translation of form field labels under user preferences
|
||||
* [#17537](https://github.com/netbox-community/netbox/issues/17537) - Fix global search support for ASN range names
|
||||
* [#17555](https://github.com/netbox-community/netbox/issues/17555) - Fix toggling disconnected interfaces under device view
|
||||
* [#17601](https://github.com/netbox-community/netbox/issues/17601) - Record change to terminating object when disconnecting a cable
|
||||
* [#17605](https://github.com/netbox-community/netbox/issues/17605) - Fix calculation of aggregate VM disk space under cluster view
|
||||
* [#17611](https://github.com/netbox-community/netbox/issues/17611) - Correct custom field minimum value validation error message
|
||||
|
||||
---
|
||||
|
||||
## v4.1.1 (2024-09-12)
|
||||
|
||||
### Enhancements
|
||||
|
||||
@@ -8,10 +8,13 @@ from urllib.parse import urlparse
|
||||
|
||||
from django import forms
|
||||
from django.conf import settings
|
||||
from django.core.exceptions import ImproperlyConfigured
|
||||
from django.utils.translation import gettext as _
|
||||
|
||||
from netbox.data_backends import DataBackend
|
||||
from netbox.utils import register_data_backend
|
||||
from utilities.constants import HTTP_PROXY_SUPPORTED_SCHEMAS, HTTP_PROXY_SUPPORTED_SOCK_SCHEMAS
|
||||
from utilities.socks import ProxyPoolManager
|
||||
from .exceptions import SyncError
|
||||
|
||||
__all__ = (
|
||||
@@ -67,11 +70,18 @@ class GitBackend(DataBackend):
|
||||
|
||||
# Initialize backend config
|
||||
config = ConfigDict()
|
||||
self.use_socks = False
|
||||
|
||||
# Apply HTTP proxy (if configured)
|
||||
if settings.HTTP_PROXIES and self.url_scheme in ('http', 'https'):
|
||||
if proxy := settings.HTTP_PROXIES.get(self.url_scheme):
|
||||
config.set("http", "proxy", proxy)
|
||||
if settings.HTTP_PROXIES:
|
||||
if proxy := settings.HTTP_PROXIES.get(self.url_scheme, None):
|
||||
if urlparse(proxy).scheme not in HTTP_PROXY_SUPPORTED_SCHEMAS:
|
||||
raise ImproperlyConfigured(f"Unsupported Git DataSource proxy scheme: {urlparse(proxy).scheme}")
|
||||
|
||||
if self.url_scheme in ('http', 'https'):
|
||||
config.set("http", "proxy", proxy)
|
||||
if urlparse(proxy).scheme in HTTP_PROXY_SUPPORTED_SOCK_SCHEMAS:
|
||||
self.use_socks = True
|
||||
|
||||
return config
|
||||
|
||||
@@ -87,6 +97,10 @@ class GitBackend(DataBackend):
|
||||
"errstream": porcelain.NoneStream(),
|
||||
}
|
||||
|
||||
# check if using socks for proxy - if so need to use custom pool_manager
|
||||
if self.use_socks:
|
||||
clone_args['pool_manager'] = ProxyPoolManager(settings.HTTP_PROXIES.get(self.url_scheme))
|
||||
|
||||
if self.url_scheme in ('http', 'https'):
|
||||
if self.params.get('username'):
|
||||
clone_args.update(
|
||||
|
||||
@@ -11,6 +11,10 @@ from core.models import ObjectType
|
||||
from users.models import User
|
||||
|
||||
APPS = ('circuits', 'core', 'dcim', 'extras', 'ipam', 'tenancy', 'users', 'virtualization', 'vpn', 'wireless')
|
||||
EXCLUDE_MODELS = (
|
||||
'extras.branch',
|
||||
'extras.stagedchange',
|
||||
)
|
||||
|
||||
BANNER_TEXT = """### NetBox interactive shell ({node})
|
||||
### Python {python} | Django {django} | NetBox {netbox}
|
||||
@@ -44,12 +48,16 @@ class Command(BaseCommand):
|
||||
|
||||
# Gather Django models and constants from each app
|
||||
for app in APPS:
|
||||
self.django_models[app] = []
|
||||
models = []
|
||||
|
||||
# Load models from each app
|
||||
for model in apps.get_app_config(app).get_models():
|
||||
namespace[model.__name__] = model
|
||||
self.django_models[app].append(model.__name__)
|
||||
app_label = model._meta.app_label
|
||||
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
|
||||
try:
|
||||
|
||||
@@ -684,6 +684,7 @@ class PowerOutletTypeChoices(ChoiceSet):
|
||||
# Direct current (DC)
|
||||
TYPE_DC = 'dc-terminal'
|
||||
# Proprietary
|
||||
TYPE_EATON_C39 = 'eaton-c39'
|
||||
TYPE_HDOT_CX = 'hdot-cx'
|
||||
TYPE_SAF_D_GRID = 'saf-d-grid'
|
||||
TYPE_NEUTRIK_POWERCON_20A = 'neutrik-powercon-20a'
|
||||
@@ -805,6 +806,7 @@ class PowerOutletTypeChoices(ChoiceSet):
|
||||
(TYPE_DC, 'DC Terminal'),
|
||||
)),
|
||||
(_('Proprietary'), (
|
||||
(TYPE_EATON_C39, 'Eaton C39'),
|
||||
(TYPE_HDOT_CX, 'HDOT Cx'),
|
||||
(TYPE_SAF_D_GRID, 'Saf-D-Grid'),
|
||||
(TYPE_NEUTRIK_POWERCON_20A, 'Neutrik powerCON (20A)'),
|
||||
@@ -861,6 +863,7 @@ class InterfaceTypeChoices(ChoiceSet):
|
||||
TYPE_100ME_LFX = '100base-lfx'
|
||||
TYPE_100ME_FIXED = '100base-tx'
|
||||
TYPE_100ME_T1 = '100base-t1'
|
||||
TYPE_100ME_SFP = '100base-x-sfp'
|
||||
TYPE_1GE_FIXED = '1000base-t'
|
||||
TYPE_1GE_TX_FIXED = '1000base-tx'
|
||||
TYPE_1GE_GBIC = '1000base-x-gbic'
|
||||
@@ -922,6 +925,7 @@ class InterfaceTypeChoices(ChoiceSet):
|
||||
TYPE_80211AY = 'ieee802.11ay'
|
||||
TYPE_80211BE = 'ieee802.11be'
|
||||
TYPE_802151 = 'ieee802.15.1'
|
||||
TYPE_802154 = 'ieee802.15.4'
|
||||
TYPE_OTHER_WIRELESS = 'other-wireless'
|
||||
|
||||
# Cellular
|
||||
@@ -1033,6 +1037,7 @@ class InterfaceTypeChoices(ChoiceSet):
|
||||
(
|
||||
_('Ethernet (modular)'),
|
||||
(
|
||||
(TYPE_100ME_SFP, 'SFP (100ME)'),
|
||||
(TYPE_1GE_GBIC, 'GBIC (1GE)'),
|
||||
(TYPE_1GE_SFP, 'SFP (1GE)'),
|
||||
(TYPE_10GE_SFP_PLUS, 'SFP+ (10GE)'),
|
||||
@@ -1094,6 +1099,7 @@ class InterfaceTypeChoices(ChoiceSet):
|
||||
(TYPE_80211AY, 'IEEE 802.11ay'),
|
||||
(TYPE_80211BE, 'IEEE 802.11be'),
|
||||
(TYPE_802151, 'IEEE 802.15.1 (Bluetooth)'),
|
||||
(TYPE_802154, 'IEEE 802.15.4 (LR-WPAN)'),
|
||||
(TYPE_OTHER_WIRELESS, 'Other (Wireless)'),
|
||||
)
|
||||
),
|
||||
|
||||
@@ -51,6 +51,7 @@ WIRELESS_IFACE_TYPES = [
|
||||
InterfaceTypeChoices.TYPE_80211AY,
|
||||
InterfaceTypeChoices.TYPE_80211BE,
|
||||
InterfaceTypeChoices.TYPE_802151,
|
||||
InterfaceTypeChoices.TYPE_802154,
|
||||
InterfaceTypeChoices.TYPE_OTHER_WIRELESS,
|
||||
]
|
||||
|
||||
|
||||
@@ -9,7 +9,7 @@ from dcim.choices import *
|
||||
from dcim.constants import *
|
||||
from dcim.models import *
|
||||
from extras.models import ConfigTemplate
|
||||
from ipam.models import VRF
|
||||
from ipam.models import VRF, IPAddress
|
||||
from netbox.forms import NetBoxModelImportForm
|
||||
from tenancy.models import Tenant
|
||||
from utilities.forms.fields import (
|
||||
@@ -367,13 +367,13 @@ class ManufacturerImportForm(NetBoxModelImportForm):
|
||||
|
||||
|
||||
class DeviceTypeImportForm(NetBoxModelImportForm):
|
||||
manufacturer = forms.ModelChoiceField(
|
||||
manufacturer = CSVModelChoiceField(
|
||||
label=_('Manufacturer'),
|
||||
queryset=Manufacturer.objects.all(),
|
||||
to_field_name='name',
|
||||
help_text=_('The manufacturer which produces this device type')
|
||||
)
|
||||
default_platform = forms.ModelChoiceField(
|
||||
default_platform = CSVModelChoiceField(
|
||||
label=_('Default platform'),
|
||||
queryset=Platform.objects.all(),
|
||||
to_field_name='name',
|
||||
@@ -1435,9 +1435,33 @@ class VirtualDeviceContextImportForm(NetBoxModelImportForm):
|
||||
label=_('Status'),
|
||||
choices=VirtualDeviceContextStatusChoices,
|
||||
)
|
||||
primary_ip4 = CSVModelChoiceField(
|
||||
label=_('Primary IPv4'),
|
||||
queryset=IPAddress.objects.all(),
|
||||
required=False,
|
||||
to_field_name='address',
|
||||
help_text=_('IPv4 address with mask, e.g. 1.2.3.4/24')
|
||||
)
|
||||
primary_ip6 = CSVModelChoiceField(
|
||||
label=_('Primary IPv6'),
|
||||
queryset=IPAddress.objects.all(),
|
||||
required=False,
|
||||
to_field_name='address',
|
||||
help_text=_('IPv6 address with prefix length, e.g. 2001:db8::1/64')
|
||||
)
|
||||
|
||||
class Meta:
|
||||
fields = [
|
||||
'name', 'device', 'status', 'tenant', 'identifier', 'comments',
|
||||
'name', 'device', 'status', 'tenant', 'identifier', 'comments', 'primary_ip4', 'primary_ip6',
|
||||
]
|
||||
model = VirtualDeviceContext
|
||||
|
||||
def __init__(self, data=None, *args, **kwargs):
|
||||
super().__init__(data, *args, **kwargs)
|
||||
|
||||
if data:
|
||||
|
||||
# Limit primary_ip4/ip6 querysets by assigned device
|
||||
params = {f"interface__device__{self.fields['device'].to_field_name}": data.get('device')}
|
||||
self.fields['primary_ip4'].queryset = self.fields['primary_ip4'].queryset.filter(**params)
|
||||
self.fields['primary_ip6'].queryset = self.fields['primary_ip6'].queryset.filter(**params)
|
||||
|
||||
@@ -1351,7 +1351,8 @@ class InterfaceForm(InterfaceCommonForm, ModularDeviceComponentForm):
|
||||
vlan_group = DynamicModelChoiceField(
|
||||
queryset=VLANGroup.objects.all(),
|
||||
required=False,
|
||||
label=_('VLAN group')
|
||||
label=_('VLAN group'),
|
||||
help_text=_("Filter VLANs available for assignment by group.")
|
||||
)
|
||||
untagged_vlan = DynamicModelChoiceField(
|
||||
queryset=VLAN.objects.all(),
|
||||
|
||||
26
netbox/dcim/migrations/0191_module_bay_rebuild.py
Normal file
26
netbox/dcim/migrations/0191_module_bay_rebuild.py
Normal file
@@ -0,0 +1,26 @@
|
||||
from django.db import migrations
|
||||
import mptt
|
||||
import mptt.managers
|
||||
|
||||
|
||||
def rebuild_mptt(apps, schema_editor):
|
||||
manager = mptt.managers.TreeManager()
|
||||
ModuleBay = apps.get_model('dcim', 'ModuleBay')
|
||||
manager.model = ModuleBay
|
||||
mptt.register(ModuleBay)
|
||||
manager.contribute_to_class(ModuleBay, 'objects')
|
||||
manager.rebuild()
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('dcim', '0190_nested_modules'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.RunPython(
|
||||
code=rebuild_mptt,
|
||||
reverse_code=migrations.RunPython.noop
|
||||
),
|
||||
]
|
||||
@@ -164,7 +164,7 @@ class Cable(PrimaryModel):
|
||||
if self.length is not None and not self.length_unit:
|
||||
raise ValidationError(_("Must specify a unit when setting a cable length"))
|
||||
|
||||
if self.pk is None and (not self.a_terminations or not self.b_terminations):
|
||||
if self._state.adding and (not self.a_terminations or not self.b_terminations):
|
||||
raise ValidationError(_("Must define A and B terminations when creating a new cable."))
|
||||
|
||||
if self._terminations_modified:
|
||||
@@ -366,11 +366,11 @@ class CableTermination(ChangeLoggedModel):
|
||||
def delete(self, *args, **kwargs):
|
||||
|
||||
# Delete the cable association on the terminating object
|
||||
termination_model = self.termination._meta.model
|
||||
termination_model.objects.filter(pk=self.termination_id).update(
|
||||
cable=None,
|
||||
cable_end=''
|
||||
)
|
||||
termination = self.termination._meta.model.objects.get(pk=self.termination_id)
|
||||
termination.snapshot()
|
||||
termination.cable = None
|
||||
termination.cable_end = ''
|
||||
termination.save()
|
||||
|
||||
super().delete(*args, **kwargs)
|
||||
|
||||
|
||||
@@ -98,7 +98,7 @@ class ComponentTemplateModel(ChangeLoggedModel, TrackingModelMixin):
|
||||
def clean(self):
|
||||
super().clean()
|
||||
|
||||
if self.pk is not None and self._original_device_type != self.device_type_id:
|
||||
if not self._state.adding and self._original_device_type != self.device_type_id:
|
||||
raise ValidationError({
|
||||
"device_type": _("Component templates cannot be moved to a different device type.")
|
||||
})
|
||||
|
||||
@@ -561,7 +561,7 @@ class BaseInterface(models.Model):
|
||||
self.untagged_vlan = None
|
||||
|
||||
# Only "tagged" interfaces may have tagged VLANs assigned. ("tagged all" implies all VLANs are assigned.)
|
||||
if self.pk and self.mode != InterfaceModeChoices.MODE_TAGGED:
|
||||
if not self._state.adding and self.mode != InterfaceModeChoices.MODE_TAGGED:
|
||||
self.tagged_vlans.clear()
|
||||
|
||||
return super().save(*args, **kwargs)
|
||||
@@ -1072,7 +1072,7 @@ class RearPort(ModularComponentModel, CabledObjectModel, TrackingModelMixin):
|
||||
super().clean()
|
||||
|
||||
# Check that positions count is greater than or equal to the number of associated FrontPorts
|
||||
if self.pk:
|
||||
if not self._state.adding:
|
||||
frontport_count = self.frontports.count()
|
||||
if self.positions < frontport_count:
|
||||
raise ValidationError({
|
||||
@@ -1314,7 +1314,7 @@ class InventoryItem(MPTTModel, ComponentModel, TrackingModelMixin):
|
||||
})
|
||||
|
||||
# Validation for moving InventoryItems
|
||||
if self.pk:
|
||||
if not self._state.adding:
|
||||
# Cannot move an InventoryItem to another device if it has a parent
|
||||
if self.parent and self.parent.device != self.device:
|
||||
raise ValidationError({
|
||||
|
||||
@@ -293,7 +293,7 @@ class DeviceType(ImageAttachmentsMixin, PrimaryModel, WeightMixin):
|
||||
# If editing an existing DeviceType to have a larger u_height, first validate that *all* instances of it have
|
||||
# room to expand within their racks. This validation will impose a very high performance penalty when there are
|
||||
# many instances to check, but increasing the u_height of a DeviceType should be a very rare occurrence.
|
||||
if self.pk and self.u_height > self._original_u_height:
|
||||
if not self._state.adding and self.u_height > self._original_u_height:
|
||||
for d in Device.objects.filter(device_type=self, position__isnull=False):
|
||||
face_required = None if self.is_full_depth else d.face
|
||||
u_available = d.rack.get_available_units(
|
||||
@@ -310,7 +310,7 @@ class DeviceType(ImageAttachmentsMixin, PrimaryModel, WeightMixin):
|
||||
})
|
||||
|
||||
# If modifying the height of an existing DeviceType to 0U, check for any instances assigned to a rack position.
|
||||
elif self.pk and self._original_u_height > 0 and self.u_height == 0:
|
||||
elif not self._state.adding and self._original_u_height > 0 and self.u_height == 0:
|
||||
racked_instance_count = Device.objects.filter(
|
||||
device_type=self,
|
||||
position__isnull=False
|
||||
@@ -1351,7 +1351,7 @@ class VirtualChassis(PrimaryModel):
|
||||
|
||||
# Verify that the selected master device has been assigned to this VirtualChassis. (Skip when creating a new
|
||||
# VirtualChassis.)
|
||||
if self.pk and self.master and self.master not in self.members.all():
|
||||
if not self._state.adding and self.master and self.master not in self.members.all():
|
||||
raise ValidationError({
|
||||
'master': _("The selected master ({master}) is not assigned to this virtual chassis.").format(
|
||||
master=self.master
|
||||
|
||||
@@ -382,7 +382,7 @@ class Rack(ContactsMixin, ImageAttachmentsMixin, RackBase):
|
||||
if self.max_weight and not self.weight_unit:
|
||||
raise ValidationError(_("Must specify a unit when setting a maximum weight"))
|
||||
|
||||
if self.pk:
|
||||
if not self._state.adding:
|
||||
mounted_devices = Device.objects.filter(rack=self).exclude(position__isnull=True).order_by('position')
|
||||
|
||||
# Validate that Rack is tall enough to house the highest mounted Device
|
||||
@@ -468,7 +468,7 @@ class Rack(ContactsMixin, ImageAttachmentsMixin, RackBase):
|
||||
}
|
||||
|
||||
# Add devices to rack units list
|
||||
if self.pk:
|
||||
if not self._state.adding:
|
||||
|
||||
# Retrieve all devices installed within the rack
|
||||
devices = Device.objects.prefetch_related(
|
||||
|
||||
@@ -684,7 +684,8 @@ class DeviceInterfaceTable(InterfaceTable):
|
||||
'data-virtual': lambda record: "true" if record.is_virtual else "false",
|
||||
'data-mark-connected': lambda record: "true" if record.mark_connected else "false",
|
||||
'data-cable-status': lambda record: record.cable.status if record.cable else "",
|
||||
'data-type': lambda record: record.type
|
||||
'data-type': lambda record: record.type,
|
||||
'data-connected': lambda record: "connected" if record.mark_connected or record.cable else "disconnected"
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -5247,6 +5247,10 @@ class CableTestCase(TestCase, ChangeLoggedFilterSetTests):
|
||||
def test_type(self):
|
||||
params = {'type': [CableTypeChoices.TYPE_CAT3, CableTypeChoices.TYPE_CAT5E]}
|
||||
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4)
|
||||
params = {'type__empty': 'true'}
|
||||
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 8)
|
||||
params = {'type__empty': 'false'}
|
||||
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 6)
|
||||
|
||||
def test_status(self):
|
||||
params = {'status': [LinkStatusChoices.STATUS_CONNECTED]}
|
||||
|
||||
@@ -3253,10 +3253,10 @@ class CableEditView(generic.ObjectEditView):
|
||||
doesn't currently provide a hook for dynamic class resolution.
|
||||
"""
|
||||
a_terminations_type = CABLE_TERMINATION_TYPES.get(
|
||||
request.GET.get('a_terminations_type') or request.POST.get('a_terminations_type')
|
||||
request.POST.get('a_terminations_type') or request.GET.get('a_terminations_type')
|
||||
)
|
||||
b_terminations_type = CABLE_TERMINATION_TYPES.get(
|
||||
request.GET.get('b_terminations_type') or request.POST.get('b_terminations_type')
|
||||
request.POST.get('b_terminations_type') or request.GET.get('b_terminations_type')
|
||||
)
|
||||
|
||||
if obj.pk:
|
||||
|
||||
@@ -294,11 +294,11 @@ class CustomField(CloningMixin, ExportTemplatesMixin, ChangeLoggedModel):
|
||||
no longer assigned to a model, or because it has been deleted).
|
||||
"""
|
||||
for ct in content_types:
|
||||
model = ct.model_class()
|
||||
instances = model.objects.filter(custom_field_data__has_key=self.name)
|
||||
for instance in instances:
|
||||
del instance.custom_field_data[self.name]
|
||||
model.objects.bulk_update(instances, ['custom_field_data'], batch_size=100)
|
||||
if model := ct.model_class():
|
||||
instances = model.objects.filter(custom_field_data__has_key=self.name)
|
||||
for instance in instances:
|
||||
del instance.custom_field_data[self.name]
|
||||
model.objects.bulk_update(instances, ['custom_field_data'], batch_size=100)
|
||||
|
||||
def rename_object_data(self, old_name, new_name):
|
||||
"""
|
||||
@@ -661,7 +661,7 @@ class CustomField(CloningMixin, ExportTemplatesMixin, ChangeLoggedModel):
|
||||
raise ValidationError(_("Value must be an integer."))
|
||||
if self.validation_minimum is not None and value < self.validation_minimum:
|
||||
raise ValidationError(
|
||||
_("Value must be at least {minimum}").format(minimum=self.validation_maximum)
|
||||
_("Value must be at least {minimum}").format(minimum=self.validation_minimum)
|
||||
)
|
||||
if self.validation_maximum is not None and value > self.validation_maximum:
|
||||
raise ValidationError(
|
||||
@@ -785,6 +785,12 @@ class CustomFieldChoiceSet(CloningMixin, ExportTemplatesMixin, ChangeLoggedModel
|
||||
def __str__(self):
|
||||
return self.name
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
super().__init__(*args, **kwargs)
|
||||
|
||||
# Cache the initial set of choices for comparison under clean()
|
||||
self._original_extra_choices = self.__dict__.get('extra_choices')
|
||||
|
||||
def get_absolute_url(self):
|
||||
return reverse('extras:customfieldchoiceset', args=[self.pk])
|
||||
|
||||
@@ -818,6 +824,32 @@ class CustomFieldChoiceSet(CloningMixin, ExportTemplatesMixin, ChangeLoggedModel
|
||||
if not self.base_choices and not self.extra_choices:
|
||||
raise ValidationError(_("Must define base or extra choices."))
|
||||
|
||||
# Check whether any choices have been removed. If so, check whether any of the removed
|
||||
# choices are still set in custom field data for any object.
|
||||
original_choices = set([
|
||||
c[0] for c in self._original_extra_choices
|
||||
]) if self._original_extra_choices else set()
|
||||
current_choices = set([
|
||||
c[0] for c in self.extra_choices
|
||||
]) if self.extra_choices else set()
|
||||
if removed_choices := original_choices - current_choices:
|
||||
for custom_field in self.choices_for.all():
|
||||
for object_type in custom_field.object_types.all():
|
||||
model = object_type.model_class()
|
||||
for choice in removed_choices:
|
||||
# Form the query based on the type of custom field
|
||||
if custom_field.type == CustomFieldTypeChoices.TYPE_MULTISELECT:
|
||||
query_args = {f"custom_field_data__{custom_field.name}__contains": choice}
|
||||
else:
|
||||
query_args = {f"custom_field_data__{custom_field.name}": choice}
|
||||
# Raise a ValidationError if there are any objects which still reference the removed choice
|
||||
if model.objects.filter(models.Q(**query_args)).exists():
|
||||
raise ValidationError(
|
||||
_(
|
||||
"Cannot remove choice {choice} as there are {model} objects which reference it."
|
||||
).format(choice=choice, model=object_type)
|
||||
)
|
||||
|
||||
def save(self, *args, **kwargs):
|
||||
|
||||
# Sort choices if alphabetical ordering is enforced
|
||||
|
||||
@@ -343,6 +343,74 @@ class CustomFieldTest(TestCase):
|
||||
instance.refresh_from_db()
|
||||
self.assertIsNone(instance.custom_field_data.get(cf.name))
|
||||
|
||||
def test_remove_selected_choice(self):
|
||||
"""
|
||||
Removing a ChoiceSet choice that is referenced by an object should raise
|
||||
a ValidationError exception.
|
||||
"""
|
||||
CHOICES = (
|
||||
('a', 'Option A'),
|
||||
('b', 'Option B'),
|
||||
('c', 'Option C'),
|
||||
('d', 'Option D'),
|
||||
)
|
||||
|
||||
# Create a set of custom field choices
|
||||
choice_set = CustomFieldChoiceSet.objects.create(
|
||||
name='Custom Field Choice Set 1',
|
||||
extra_choices=CHOICES
|
||||
)
|
||||
|
||||
# Create a select custom field
|
||||
cf = CustomField.objects.create(
|
||||
name='select_field',
|
||||
type=CustomFieldTypeChoices.TYPE_SELECT,
|
||||
required=False,
|
||||
choice_set=choice_set
|
||||
)
|
||||
cf.object_types.set([self.object_type])
|
||||
|
||||
# Create a multi-select custom field
|
||||
cf_multiselect = CustomField.objects.create(
|
||||
name='multiselect_field',
|
||||
type=CustomFieldTypeChoices.TYPE_MULTISELECT,
|
||||
required=False,
|
||||
choice_set=choice_set
|
||||
)
|
||||
cf_multiselect.object_types.set([self.object_type])
|
||||
|
||||
# Assign a choice for both custom fields on an object
|
||||
instance = Site.objects.first()
|
||||
instance.custom_field_data[cf.name] = 'a'
|
||||
instance.custom_field_data[cf_multiselect.name] = ['b', 'c']
|
||||
instance.save()
|
||||
|
||||
# Attempting to delete a selected choice should fail
|
||||
with self.assertRaises(ValidationError):
|
||||
choice_set.extra_choices = (
|
||||
('b', 'Option B'),
|
||||
('c', 'Option C'),
|
||||
('d', 'Option D'),
|
||||
)
|
||||
choice_set.full_clean()
|
||||
|
||||
# Attempting to delete either of the multi-select choices should fail
|
||||
with self.assertRaises(ValidationError):
|
||||
choice_set.extra_choices = (
|
||||
('a', 'Option A'),
|
||||
('b', 'Option B'),
|
||||
('d', 'Option D'),
|
||||
)
|
||||
choice_set.full_clean()
|
||||
|
||||
# Removing a non-selected choice should succeed
|
||||
choice_set.extra_choices = (
|
||||
('a', 'Option A'),
|
||||
('b', 'Option B'),
|
||||
('c', 'Option C'),
|
||||
)
|
||||
choice_set.full_clean()
|
||||
|
||||
def test_object_field(self):
|
||||
value = VLAN.objects.create(name='VLAN 1', vid=1).pk
|
||||
|
||||
|
||||
@@ -149,3 +149,7 @@ class ASN(PrimaryModel):
|
||||
return f'{self.asn} ({self.asn // 65536}.{self.asn % 65536})'
|
||||
else:
|
||||
return self.asn
|
||||
|
||||
@property
|
||||
def prefixed_name(self):
|
||||
return f'AS{self.asn_with_asdot}'
|
||||
|
||||
@@ -19,6 +19,7 @@ class ASNIndex(SearchIndex):
|
||||
model = models.ASN
|
||||
fields = (
|
||||
('asn', 100),
|
||||
('prefixed_name', 110),
|
||||
('description', 500),
|
||||
)
|
||||
display_attrs = ('rir', 'tenant', 'description')
|
||||
@@ -28,6 +29,7 @@ class ASNIndex(SearchIndex):
|
||||
class ASNRangeIndex(SearchIndex):
|
||||
model = models.ASNRange
|
||||
fields = (
|
||||
('name', 100),
|
||||
('description', 500),
|
||||
)
|
||||
display_attrs = ('rir', 'tenant', 'description')
|
||||
|
||||
@@ -51,7 +51,7 @@ IPADDRESS_LINK = """
|
||||
{% if record.pk %}
|
||||
<a href="{{ record.get_absolute_url }}" id="ipaddress_{{ record.pk }}">{{ record.address }}</a>
|
||||
{% elif perms.ipam.add_ipaddress %}
|
||||
<a href="{% url 'ipam:ipaddress_add' %}?address={{ record.1 }}{% if object.vrf %}&vrf={{ object.vrf.pk }}{% endif %}{% if object.tenant %}&tenant={{ object.tenant.pk }}{% endif %}" class="btn btn-sm btn-success">{% if record.0 <= 65536 %}{{ record.0 }}{% else %}Many{% endif %} IP{{ record.0|pluralize }} available</a>
|
||||
<a href="{% url 'ipam:ipaddress_add' %}?address={{ record.1 }}{% if object.vrf %}&vrf={{ object.vrf.pk }}{% endif %}{% if object.tenant %}&tenant={{ object.tenant.pk }}{% endif %}&return_url={% url 'ipam:prefix_ipaddresses' pk=object.pk %}" class="btn btn-sm btn-success">{% if record.0 <= 65536 %}{{ record.0 }}{% else %}Many{% endif %} IP{{ record.0|pluralize }} available</a>
|
||||
{% else %}
|
||||
{% if record.0 <= 65536 %}{{ record.0 }}{% else %}Many{% endif %} IP{{ record.0|pluralize }} available
|
||||
{% endif %}
|
||||
|
||||
@@ -1,5 +1,8 @@
|
||||
from django.utils.translation import gettext_lazy as _
|
||||
from rest_framework import serializers
|
||||
|
||||
from utilities.views import get_viewname
|
||||
|
||||
__all__ = (
|
||||
'NetBoxAPIHyperlinkedIdentityField',
|
||||
'NetBoxURLHyperlinkedIdentityField',
|
||||
@@ -30,12 +33,10 @@ class BaseNetBoxHyperlinkedIdentityField(serializers.HyperlinkedIdentityField):
|
||||
lookup_value = getattr(obj, self.lookup_field)
|
||||
kwargs = {self.lookup_url_kwarg: lookup_value}
|
||||
|
||||
model_name = self.parent.Meta.model._meta.model_name
|
||||
app_name = self.parent.Meta.model._meta.app_label
|
||||
view_name = self.get_view_name(app_name, model_name)
|
||||
view_name = self.get_view_name(obj)
|
||||
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(
|
||||
class_name=self.__class__.__name__
|
||||
))
|
||||
@@ -43,11 +44,11 @@ class BaseNetBoxHyperlinkedIdentityField(serializers.HyperlinkedIdentityField):
|
||||
|
||||
class NetBoxAPIHyperlinkedIdentityField(BaseNetBoxHyperlinkedIdentityField):
|
||||
|
||||
def get_view_name(self, app_name, model_name):
|
||||
return f'{app_name}-api:{model_name}-detail'
|
||||
def get_view_name(self, model):
|
||||
return get_viewname(model=model, action='detail', rest_api=True)
|
||||
|
||||
|
||||
class NetBoxURLHyperlinkedIdentityField(BaseNetBoxHyperlinkedIdentityField):
|
||||
|
||||
def get_view_name(self, app_name, model_name):
|
||||
return f'{app_name}:{model_name}'
|
||||
def get_view_name(self, model):
|
||||
return get_viewname(model=model)
|
||||
|
||||
@@ -133,7 +133,7 @@ class BaseFilterSet(django_filters.FilterSet):
|
||||
django_filters.ModelChoiceFilter,
|
||||
django_filters.ModelMultipleChoiceFilter,
|
||||
TagFilter
|
||||
)) or existing_filter.extra.get('choices'):
|
||||
)):
|
||||
# These filter types support only negation
|
||||
return FILTER_NEGATION_LOOKUP_MAP
|
||||
|
||||
@@ -172,6 +172,7 @@ class BaseFilterSet(django_filters.FilterSet):
|
||||
# Create new filters for each lookup expression in the map
|
||||
for lookup_name, lookup_expr in lookup_map.items():
|
||||
new_filter_name = f'{existing_filter_name}__{lookup_name}'
|
||||
existing_filter_extra = deepcopy(existing_filter.extra)
|
||||
|
||||
try:
|
||||
if existing_filter_name in cls.declared_filters:
|
||||
@@ -179,6 +180,8 @@ class BaseFilterSet(django_filters.FilterSet):
|
||||
# create the new filter with the same type because there is no guarantee the defined type
|
||||
# is the same as the default type for the field
|
||||
resolve_field(field, lookup_expr) # Will raise FieldLookupError if the lookup is invalid
|
||||
for field_to_remove in ('choices', 'null_value'):
|
||||
existing_filter_extra.pop(field_to_remove, None)
|
||||
filter_cls = django_filters.BooleanFilter if lookup_expr == 'empty' else type(existing_filter)
|
||||
new_filter = filter_cls(
|
||||
field_name=field_name,
|
||||
@@ -186,7 +189,7 @@ class BaseFilterSet(django_filters.FilterSet):
|
||||
label=existing_filter.label,
|
||||
exclude=existing_filter.exclude,
|
||||
distinct=existing_filter.distinct,
|
||||
**existing_filter.extra
|
||||
**existing_filter_extra
|
||||
)
|
||||
elif hasattr(existing_filter, 'custom_field'):
|
||||
# Filter is for a custom field
|
||||
|
||||
@@ -162,7 +162,7 @@ class NestedGroupModel(NetBoxFeatureSet, MPTTModel):
|
||||
super().clean()
|
||||
|
||||
# An MPTT model cannot be its own parent
|
||||
if self.pk and self.parent and self.parent in self.get_descendants(include_self=True):
|
||||
if not self._state.adding and self.parent and self.parent in self.get_descendants(include_self=True):
|
||||
raise ValidationError({
|
||||
"parent": "Cannot assign self or child {type} as parent.".format(type=self._meta.verbose_name)
|
||||
})
|
||||
|
||||
@@ -408,14 +408,9 @@ class JobsMixin(models.Model):
|
||||
|
||||
def get_latest_jobs(self):
|
||||
"""
|
||||
Return a dictionary mapping of the most recent jobs for this instance.
|
||||
Return a list of the most recent jobs for this instance.
|
||||
"""
|
||||
return {
|
||||
job.name: job
|
||||
for job in self.jobs.filter(
|
||||
status__in=JobStatusChoices.TERMINAL_STATE_CHOICES
|
||||
).order_by('name', '-created').distinct('name').defer('data')
|
||||
}
|
||||
return self.jobs.filter(status__in=JobStatusChoices.TERMINAL_STATE_CHOICES).order_by('-created').defer('data')
|
||||
|
||||
|
||||
class JournalingMixin(models.Model):
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
from django.conf import settings
|
||||
from django.utils.translation import gettext as _
|
||||
from django.utils.translation import gettext_lazy as _
|
||||
|
||||
from netbox.registry import registry
|
||||
from users.preferences import UserPreference
|
||||
|
||||
@@ -146,10 +146,12 @@ class ObjectChildrenView(ObjectView, ActionsMixin, TableMixin):
|
||||
return render(request, 'htmx/table.html', {
|
||||
'object': instance,
|
||||
'table': table,
|
||||
'model': self.child_model,
|
||||
})
|
||||
|
||||
return render(request, self.get_template_name(), {
|
||||
'object': instance,
|
||||
'model': self.child_model,
|
||||
'child_model': self.child_model,
|
||||
'base_template': f'{instance._meta.app_label}/{instance._meta.model_name}.html',
|
||||
'table': table,
|
||||
|
||||
BIN
netbox/project-static/dist/Inter-Black-7VL4YR6G.woff
vendored
Normal file
BIN
netbox/project-static/dist/Inter-Black-7VL4YR6G.woff
vendored
Normal file
Binary file not shown.
BIN
netbox/project-static/dist/Inter-Black-NU3KAVPI.woff2
vendored
Normal file
BIN
netbox/project-static/dist/Inter-Black-NU3KAVPI.woff2
vendored
Normal file
Binary file not shown.
BIN
netbox/project-static/dist/Inter-BlackItalic-4BVAVUVI.woff2
vendored
Normal file
BIN
netbox/project-static/dist/Inter-BlackItalic-4BVAVUVI.woff2
vendored
Normal file
Binary file not shown.
BIN
netbox/project-static/dist/Inter-BlackItalic-HJLUEYVW.woff
vendored
Normal file
BIN
netbox/project-static/dist/Inter-BlackItalic-HJLUEYVW.woff
vendored
Normal file
Binary file not shown.
BIN
netbox/project-static/dist/Inter-Bold-6AVOS7AV.woff2
vendored
Normal file
BIN
netbox/project-static/dist/Inter-Bold-6AVOS7AV.woff2
vendored
Normal file
Binary file not shown.
BIN
netbox/project-static/dist/Inter-Bold-RTIBL5DO.woff
vendored
Normal file
BIN
netbox/project-static/dist/Inter-Bold-RTIBL5DO.woff
vendored
Normal file
Binary file not shown.
BIN
netbox/project-static/dist/Inter-BoldItalic-AID2XGS3.woff2
vendored
Normal file
BIN
netbox/project-static/dist/Inter-BoldItalic-AID2XGS3.woff2
vendored
Normal file
Binary file not shown.
BIN
netbox/project-static/dist/Inter-BoldItalic-UU7SOVRI.woff
vendored
Normal file
BIN
netbox/project-static/dist/Inter-BoldItalic-UU7SOVRI.woff
vendored
Normal file
Binary file not shown.
BIN
netbox/project-static/dist/Inter-ExtraBold-B5RSZK6R.woff
vendored
Normal file
BIN
netbox/project-static/dist/Inter-ExtraBold-B5RSZK6R.woff
vendored
Normal file
Binary file not shown.
BIN
netbox/project-static/dist/Inter-ExtraBold-VAPCTO5F.woff2
vendored
Normal file
BIN
netbox/project-static/dist/Inter-ExtraBold-VAPCTO5F.woff2
vendored
Normal file
Binary file not shown.
BIN
netbox/project-static/dist/Inter-ExtraBoldItalic-R7DLWYIK.woff
vendored
Normal file
BIN
netbox/project-static/dist/Inter-ExtraBoldItalic-R7DLWYIK.woff
vendored
Normal file
Binary file not shown.
BIN
netbox/project-static/dist/Inter-ExtraBoldItalic-W26CJYY7.woff2
vendored
Normal file
BIN
netbox/project-static/dist/Inter-ExtraBoldItalic-W26CJYY7.woff2
vendored
Normal file
Binary file not shown.
BIN
netbox/project-static/dist/Inter-ExtraLight-A7NHN7KT.woff
vendored
Normal file
BIN
netbox/project-static/dist/Inter-ExtraLight-A7NHN7KT.woff
vendored
Normal file
Binary file not shown.
BIN
netbox/project-static/dist/Inter-ExtraLight-DVW3SATI.woff2
vendored
Normal file
BIN
netbox/project-static/dist/Inter-ExtraLight-DVW3SATI.woff2
vendored
Normal file
Binary file not shown.
BIN
netbox/project-static/dist/Inter-ExtraLightItalic-KXZYPKOE.woff2
vendored
Normal file
BIN
netbox/project-static/dist/Inter-ExtraLightItalic-KXZYPKOE.woff2
vendored
Normal file
Binary file not shown.
BIN
netbox/project-static/dist/Inter-ExtraLightItalic-SKGXKLLA.woff
vendored
Normal file
BIN
netbox/project-static/dist/Inter-ExtraLightItalic-SKGXKLLA.woff
vendored
Normal file
Binary file not shown.
BIN
netbox/project-static/dist/Inter-Italic-GHDVOOKA.woff
vendored
Normal file
BIN
netbox/project-static/dist/Inter-Italic-GHDVOOKA.woff
vendored
Normal file
Binary file not shown.
BIN
netbox/project-static/dist/Inter-Italic-RW2ZALTO.woff2
vendored
Normal file
BIN
netbox/project-static/dist/Inter-Italic-RW2ZALTO.woff2
vendored
Normal file
Binary file not shown.
BIN
netbox/project-static/dist/Inter-Light-ARG5Y6MT.woff
vendored
Normal file
BIN
netbox/project-static/dist/Inter-Light-ARG5Y6MT.woff
vendored
Normal file
Binary file not shown.
BIN
netbox/project-static/dist/Inter-Light-XBRUIIRZ.woff2
vendored
Normal file
BIN
netbox/project-static/dist/Inter-Light-XBRUIIRZ.woff2
vendored
Normal file
Binary file not shown.
BIN
netbox/project-static/dist/Inter-LightItalic-4OWY6V5R.woff2
vendored
Normal file
BIN
netbox/project-static/dist/Inter-LightItalic-4OWY6V5R.woff2
vendored
Normal file
Binary file not shown.
BIN
netbox/project-static/dist/Inter-LightItalic-WFS25IQZ.woff
vendored
Normal file
BIN
netbox/project-static/dist/Inter-LightItalic-WFS25IQZ.woff
vendored
Normal file
Binary file not shown.
BIN
netbox/project-static/dist/Inter-Medium-JV63DMR7.woff2
vendored
Normal file
BIN
netbox/project-static/dist/Inter-Medium-JV63DMR7.woff2
vendored
Normal file
Binary file not shown.
BIN
netbox/project-static/dist/Inter-Medium-KH2CGZVE.woff
vendored
Normal file
BIN
netbox/project-static/dist/Inter-Medium-KH2CGZVE.woff
vendored
Normal file
Binary file not shown.
BIN
netbox/project-static/dist/Inter-MediumItalic-P7H6BBYU.woff2
vendored
Normal file
BIN
netbox/project-static/dist/Inter-MediumItalic-P7H6BBYU.woff2
vendored
Normal file
Binary file not shown.
BIN
netbox/project-static/dist/Inter-MediumItalic-PO2E4FIG.woff
vendored
Normal file
BIN
netbox/project-static/dist/Inter-MediumItalic-PO2E4FIG.woff
vendored
Normal file
Binary file not shown.
BIN
netbox/project-static/dist/Inter-Regular-373XMOLM.woff2
vendored
Normal file
BIN
netbox/project-static/dist/Inter-Regular-373XMOLM.woff2
vendored
Normal file
Binary file not shown.
BIN
netbox/project-static/dist/Inter-Regular-DR3VC6YG.woff
vendored
Normal file
BIN
netbox/project-static/dist/Inter-Regular-DR3VC6YG.woff
vendored
Normal file
Binary file not shown.
BIN
netbox/project-static/dist/Inter-SemiBold-TJ6HPMMH.woff
vendored
Normal file
BIN
netbox/project-static/dist/Inter-SemiBold-TJ6HPMMH.woff
vendored
Normal file
Binary file not shown.
BIN
netbox/project-static/dist/Inter-SemiBold-UMRILHOG.woff2
vendored
Normal file
BIN
netbox/project-static/dist/Inter-SemiBold-UMRILHOG.woff2
vendored
Normal file
Binary file not shown.
BIN
netbox/project-static/dist/Inter-SemiBoldItalic-ABO2DCC7.woff2
vendored
Normal file
BIN
netbox/project-static/dist/Inter-SemiBoldItalic-ABO2DCC7.woff2
vendored
Normal file
Binary file not shown.
BIN
netbox/project-static/dist/Inter-SemiBoldItalic-DM4JJSFU.woff
vendored
Normal file
BIN
netbox/project-static/dist/Inter-SemiBoldItalic-DM4JJSFU.woff
vendored
Normal file
Binary file not shown.
BIN
netbox/project-static/dist/Inter-Thin-MEKOZMGA.woff
vendored
Normal file
BIN
netbox/project-static/dist/Inter-Thin-MEKOZMGA.woff
vendored
Normal file
Binary file not shown.
BIN
netbox/project-static/dist/Inter-Thin-TCINWRKS.woff2
vendored
Normal file
BIN
netbox/project-static/dist/Inter-Thin-TCINWRKS.woff2
vendored
Normal file
Binary file not shown.
BIN
netbox/project-static/dist/Inter-ThinItalic-WRULPH3M.woff2
vendored
Normal file
BIN
netbox/project-static/dist/Inter-ThinItalic-WRULPH3M.woff2
vendored
Normal file
Binary file not shown.
BIN
netbox/project-static/dist/Inter-ThinItalic-ZFOL6JFL.woff
vendored
Normal file
BIN
netbox/project-static/dist/Inter-ThinItalic-ZFOL6JFL.woff
vendored
Normal file
Binary file not shown.
BIN
netbox/project-static/dist/Inter-italic.var-7LS4VCXC.woff2
vendored
Normal file
BIN
netbox/project-static/dist/Inter-italic.var-7LS4VCXC.woff2
vendored
Normal file
Binary file not shown.
BIN
netbox/project-static/dist/Inter-roman.var-EDENVCUS.woff2
vendored
Normal file
BIN
netbox/project-static/dist/Inter-roman.var-EDENVCUS.woff2
vendored
Normal file
Binary file not shown.
BIN
netbox/project-static/dist/Inter.var-FTIQFLGO.woff2
vendored
Normal file
BIN
netbox/project-static/dist/Inter.var-FTIQFLGO.woff2
vendored
Normal file
Binary file not shown.
File diff suppressed because one or more lines are too long
2
netbox/project-static/dist/netbox.css
vendored
2
netbox/project-static/dist/netbox.css
vendored
File diff suppressed because one or more lines are too long
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -22,17 +22,17 @@
|
||||
"validate:formatting:scripts": "prettier -c src/**/*.ts"
|
||||
},
|
||||
"dependencies": {
|
||||
"@fontsource-variable/plus-jakarta-sans": "^5.1.0",
|
||||
"@mdi/font": "7.4.47",
|
||||
"@tabler/core": "1.0.0-beta20",
|
||||
"@tabler/core": "1.0.0-beta21",
|
||||
"bootstrap": "5.3.3",
|
||||
"clipboard": "2.0.11",
|
||||
"flatpickr": "4.6.13",
|
||||
"gridstack": "10.3.1",
|
||||
"htmx.org": "1.9.12",
|
||||
"query-string": "9.1.0",
|
||||
"sass": "1.78.0",
|
||||
"sass": "1.79.3",
|
||||
"tom-select": "2.3.1",
|
||||
"typeface-inter": "3.18.1",
|
||||
"typeface-roboto-mono": "1.1.13"
|
||||
},
|
||||
"devDependencies": {
|
||||
|
||||
@@ -1,10 +1,9 @@
|
||||
// Global variables
|
||||
|
||||
// Set base fonts
|
||||
$font-family-sans-serif: 'Plus Jakarta Sans Variable', system-ui, sans-serif;
|
||||
$font-family-sans-serif: 'Inter', system-ui, sans-serif;
|
||||
// See https://github.com/tabler/tabler/issues/1812
|
||||
$font-family-monospace: 'Roboto Mono';
|
||||
$font-weight-base: 500;
|
||||
|
||||
// Set the navigation sidebar width
|
||||
$sidebar-width: 18rem;
|
||||
|
||||
@@ -4,5 +4,5 @@
|
||||
@import 'gridstack/dist/gridstack.min.css';
|
||||
|
||||
// Fonts
|
||||
@import url("../node_modules/typeface-inter/inter.css");
|
||||
@import url("../node_modules/typeface-roboto-mono/index.css");
|
||||
@import url("../node_modules/@fontsource-variable/plus-jakarta-sans/index.css");
|
||||
|
||||
@@ -128,6 +128,9 @@ body[data-bs-theme=dark] {
|
||||
.footer .text-primary {
|
||||
color: white !important;
|
||||
}
|
||||
.toast {
|
||||
color: var(--#{$prefix}body-color);
|
||||
}
|
||||
}
|
||||
|
||||
// Do not apply padding to <code> elements inside a <pre>
|
||||
|
||||
@@ -200,11 +200,6 @@
|
||||
resolved "https://registry.yarnpkg.com/@floating-ui/utils/-/utils-0.2.2.tgz#d8bae93ac8b815b2bd7a98078cf91e2724ef11e5"
|
||||
integrity sha512-J4yDIIthosAsRZ5CPYP/jQvUAQtlZTTD/4suA08/FEnlxqW3sKS9iAhgsa9VYLZ6vDHn/ixJgIqRQPotoBjxIw==
|
||||
|
||||
"@fontsource-variable/plus-jakarta-sans@^5.1.0":
|
||||
version "5.1.0"
|
||||
resolved "https://registry.yarnpkg.com/@fontsource-variable/plus-jakarta-sans/-/plus-jakarta-sans-5.1.0.tgz#9dd5aa72277c43d408f6e34cd658d823fbef1fe1"
|
||||
integrity sha512-K7o2GO7/quVFFyfjTqYZu0ng4KJGf60KSAGbvUWwKuH+/Giyl6Qe/EqnGLcjrl9AmXZzTvtRB1xpkASn8FNFoQ==
|
||||
|
||||
"@graphiql/plugin-explorer@3.2.2":
|
||||
version "3.2.2"
|
||||
resolved "https://registry.yarnpkg.com/@graphiql/plugin-explorer/-/plugin-explorer-3.2.2.tgz#973d6015b6db15041902e95c3e4b746473313eb6"
|
||||
@@ -675,19 +670,19 @@
|
||||
resolved "https://registry.yarnpkg.com/@rtsao/scc/-/scc-1.1.0.tgz#927dd2fae9bc3361403ac2c7a00c32ddce9ad7e8"
|
||||
integrity sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==
|
||||
|
||||
"@tabler/core@1.0.0-beta20":
|
||||
version "1.0.0-beta20"
|
||||
resolved "https://registry.yarnpkg.com/@tabler/core/-/core-1.0.0-beta20.tgz#3fcc3b5634ca89a413ba9c077df7bdfc531ab93c"
|
||||
integrity sha512-OzKpur+Ug7e+HMbNJrMcSuWZGUsJTvu7HYboBNRE8qyo1RKIWqvwL5YewKBJ+odW5pDOqBPzbsS4je3EBQQxHw==
|
||||
"@tabler/core@1.0.0-beta21":
|
||||
version "1.0.0-beta21"
|
||||
resolved "https://registry.yarnpkg.com/@tabler/core/-/core-1.0.0-beta21.tgz#cd10d7648b3b7b31927a430fd776d3304e796403"
|
||||
integrity sha512-9ZKu38BScc0eHruhX/SlVDSiXenBFSgBp2WDq6orkuC8J/1yutKDt7CdXuJpBwkiADEk5yqYV31Ku+CnhwOc3Q==
|
||||
dependencies:
|
||||
"@popperjs/core" "^2.11.8"
|
||||
"@tabler/icons" "^2.32.0"
|
||||
bootstrap "5.3.1"
|
||||
"@tabler/icons" "^3.14.0"
|
||||
bootstrap "5.3.3"
|
||||
|
||||
"@tabler/icons@^2.32.0":
|
||||
version "2.47.0"
|
||||
resolved "https://registry.yarnpkg.com/@tabler/icons/-/icons-2.47.0.tgz#c41c680d1947e3ab2d60af3febc4132287c60596"
|
||||
integrity sha512-4w5evLh+7FUUiA1GucvGj2ReX2TvOjEr4ejXdwL/bsjoSkof6r1gQmzqI+VHrE2CpJpB3al7bCTulOkFa/RcyA==
|
||||
"@tabler/icons@^3.14.0":
|
||||
version "3.16.0"
|
||||
resolved "https://registry.yarnpkg.com/@tabler/icons/-/icons-3.16.0.tgz#d618670b80163925a31a6c2290e8775f6058d81a"
|
||||
integrity sha512-GU7MSx4uQEr55BmyON6hD/QYTl6k1v0YlRhM91gBWDoKAbyCt6QIYw7rpJ/ecdh5zrHaTOJKPenZ4+luoutwFA==
|
||||
|
||||
"@tanstack/react-virtual@^3.0.0-beta.60":
|
||||
version "3.5.0"
|
||||
@@ -977,11 +972,6 @@ binary-extensions@^2.0.0:
|
||||
resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522"
|
||||
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:
|
||||
version "5.3.3"
|
||||
resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-5.3.3.tgz#de35e1a765c897ac940021900fcbb831602bac38"
|
||||
@@ -1048,6 +1038,13 @@ chalk@^4.0.0:
|
||||
optionalDependencies:
|
||||
fsevents "~2.3.2"
|
||||
|
||||
chokidar@^4.0.0:
|
||||
version "4.0.1"
|
||||
resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-4.0.1.tgz#4a6dff66798fb0f72a94f616abbd7e1a19f31d41"
|
||||
integrity sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA==
|
||||
dependencies:
|
||||
readdirp "^4.0.1"
|
||||
|
||||
client-only@^0.0.1:
|
||||
version "0.0.1"
|
||||
resolved "https://registry.yarnpkg.com/client-only/-/client-only-0.0.1.tgz#38bba5d403c41ab150bff64a95c85013cf73bca1"
|
||||
@@ -2477,6 +2474,11 @@ react@18.3.1:
|
||||
dependencies:
|
||||
loose-envify "^1.1.0"
|
||||
|
||||
readdirp@^4.0.1:
|
||||
version "4.0.1"
|
||||
resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-4.0.1.tgz#b2fe35f8dca63183cd3b86883ecc8f720ea96ae6"
|
||||
integrity sha512-GkMg9uOTpIWWKbSsgwb5fA4EavTR+SG/PMPoAY8hkhHfEEY0/vqljY+XHqtDf2cr2IJtoNRDbrrEpZUiZCkYRw==
|
||||
|
||||
readdirp@~3.6.0:
|
||||
version "3.6.0"
|
||||
resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7"
|
||||
@@ -2561,12 +2563,12 @@ safe-regex-test@^1.0.3:
|
||||
es-errors "^1.3.0"
|
||||
is-regex "^1.1.4"
|
||||
|
||||
sass@1.78.0:
|
||||
version "1.78.0"
|
||||
resolved "https://registry.yarnpkg.com/sass/-/sass-1.78.0.tgz#cef369b2f9dc21ea1d2cf22c979f52365da60841"
|
||||
integrity sha512-AaIqGSrjo5lA2Yg7RvFZrlXDBCp3nV4XP73GrLGvdRWWwk+8H3l0SDvq/5bA4eF+0RFPLuWUk3E+P1U/YqnpsQ==
|
||||
sass@1.79.3:
|
||||
version "1.79.3"
|
||||
resolved "https://registry.yarnpkg.com/sass/-/sass-1.79.3.tgz#7811b000eb68195fe51dea89177e73e7ef7f546f"
|
||||
integrity sha512-m7dZxh0W9EZ3cw50Me5GOuYm/tVAJAn91SUnohLRo9cXBixGUOdvmryN+dXpwR831bhoY3Zv7rEFt85PUwTmzA==
|
||||
dependencies:
|
||||
chokidar ">=3.0.0 <4.0.0"
|
||||
chokidar "^4.0.0"
|
||||
immutable "^4.0.0"
|
||||
source-map-js ">=0.6.2 <2.0.0"
|
||||
|
||||
@@ -2857,6 +2859,11 @@ typed-array-length@^1.0.6:
|
||||
is-typed-array "^1.1.13"
|
||||
possible-typed-array-names "^1.0.0"
|
||||
|
||||
typeface-inter@3.18.1:
|
||||
version "3.18.1"
|
||||
resolved "https://registry.yarnpkg.com/typeface-inter/-/typeface-inter-3.18.1.tgz#24cccdf29923f318589783997be20a662cd3ab9c"
|
||||
integrity sha512-c+TBanYFCvmg3j5vPk+zxK4ocMZbPxMEmjnwG7rPQoV87xvQ6b07VbAOC0Va0XBbbZCGw6cWNeFuLeg1YQru3Q==
|
||||
|
||||
typeface-roboto-mono@1.1.13:
|
||||
version "1.1.13"
|
||||
resolved "https://registry.yarnpkg.com/typeface-roboto-mono/-/typeface-roboto-mono-1.1.13.tgz#2af8662db8f9119c00efd55d6ed8877d2a69ec94"
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version: "4.1.1"
|
||||
version: "4.1.3"
|
||||
edition: "Community"
|
||||
published: "2024-09-12"
|
||||
published: "2024-10-02"
|
||||
|
||||
@@ -325,6 +325,7 @@
|
||||
<td>
|
||||
{% if object.total_weight %}
|
||||
{{ object.total_weight|floatformat }} {% trans "Kilograms" %}
|
||||
({{ object.total_weight|kg_to_pounds|floatformat }} {% trans "Pounds" %})
|
||||
{% else %}
|
||||
{{ ''|placeholder }}
|
||||
{% endif %}
|
||||
|
||||
@@ -103,8 +103,12 @@
|
||||
<tr>
|
||||
<th scope="row">{% trans "Total Weight" %}</th>
|
||||
<td>
|
||||
{{ object.total_weight|floatformat }} {% trans "Kilograms" %}
|
||||
({{ object.total_weight|kg_to_pounds|floatformat }} {% trans "Pounds" %})
|
||||
{% if object.total_weight %}
|
||||
{{ object.total_weight|floatformat }} {% trans "Kilograms" %}
|
||||
({{ object.total_weight|kg_to_pounds|floatformat }} {% trans "Pounds" %})
|
||||
{% else %}
|
||||
{{ ''|placeholder }}
|
||||
{% endif %}
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
@@ -50,7 +50,7 @@
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for script in module.scripts.all %}
|
||||
{% with last_job=script.get_latest_jobs|get_key:script.name %}
|
||||
{% with last_job=script.get_latest_jobs|first %}
|
||||
<tr>
|
||||
<td>
|
||||
{% if script.is_executable %}
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
|
||||
{# Title #}
|
||||
<div>
|
||||
<h1 class="page-title mt-1 mb-2">{% block title %}{% endblock title %}</h1>
|
||||
<h1 class="page-title">{% block title %}{% endblock title %}</h1>
|
||||
{% block subtitle %}{% endblock %}
|
||||
</div>
|
||||
|
||||
|
||||
@@ -69,7 +69,7 @@
|
||||
<th scope="row"><i class="mdi mdi-harddisk"></i> {% trans "Disk Space" %}</th>
|
||||
<td>
|
||||
{% if disk_sum %}
|
||||
{{ disk_sum }} {% trans "GB" context "Abbreviation for gigabyte" %}
|
||||
{{ disk_sum|humanize_megabytes }}
|
||||
{% else %}
|
||||
{{ ''|placeholder }}
|
||||
{% endif %}
|
||||
|
||||
Binary file not shown.
@@ -12,7 +12,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2024-09-12 05:02+0000\n"
|
||||
"POT-Creation-Date: 2024-09-25 05:02+0000\n"
|
||||
"PO-Revision-Date: 2023-10-30 17:48+0000\n"
|
||||
"Last-Translator: Jeremy Stretch, 2024\n"
|
||||
"Language-Team: Czech (https://app.transifex.com/netbox-community/teams/178115/cs/)\n"
|
||||
@@ -87,8 +87,8 @@ msgstr "Vaše heslo bylo úspěšně změněno."
|
||||
|
||||
#: netbox/circuits/choices.py:21 netbox/dcim/choices.py:20
|
||||
#: netbox/dcim/choices.py:102 netbox/dcim/choices.py:185
|
||||
#: netbox/dcim/choices.py:231 netbox/dcim/choices.py:1518
|
||||
#: netbox/dcim/choices.py:1594 netbox/dcim/choices.py:1644
|
||||
#: netbox/dcim/choices.py:231 netbox/dcim/choices.py:1522
|
||||
#: netbox/dcim/choices.py:1598 netbox/dcim/choices.py:1648
|
||||
#: netbox/virtualization/choices.py:20 netbox/virtualization/choices.py:45
|
||||
#: netbox/vpn/choices.py:18
|
||||
msgid "Planned"
|
||||
@@ -101,7 +101,7 @@ msgstr "Zajišťování"
|
||||
#: netbox/circuits/choices.py:23 netbox/core/tables/tasks.py:22
|
||||
#: netbox/dcim/choices.py:22 netbox/dcim/choices.py:103
|
||||
#: netbox/dcim/choices.py:184 netbox/dcim/choices.py:230
|
||||
#: netbox/dcim/choices.py:1593 netbox/dcim/choices.py:1643
|
||||
#: netbox/dcim/choices.py:1597 netbox/dcim/choices.py:1647
|
||||
#: netbox/extras/tables/tables.py:495 netbox/ipam/choices.py:31
|
||||
#: netbox/ipam/choices.py:49 netbox/ipam/choices.py:69
|
||||
#: netbox/ipam/choices.py:154 netbox/templates/extras/configcontext.html:25
|
||||
@@ -112,8 +112,8 @@ msgid "Active"
|
||||
msgstr "Aktivní"
|
||||
|
||||
#: netbox/circuits/choices.py:24 netbox/dcim/choices.py:183
|
||||
#: netbox/dcim/choices.py:229 netbox/dcim/choices.py:1592
|
||||
#: netbox/dcim/choices.py:1645 netbox/virtualization/choices.py:24
|
||||
#: netbox/dcim/choices.py:229 netbox/dcim/choices.py:1596
|
||||
#: netbox/dcim/choices.py:1649 netbox/virtualization/choices.py:24
|
||||
#: netbox/virtualization/choices.py:43
|
||||
msgid "Offline"
|
||||
msgstr "Vypnuto"
|
||||
@@ -126,7 +126,7 @@ msgstr "Zrušení přidělování"
|
||||
msgid "Decommissioned"
|
||||
msgstr "Vyřazeno z provozu"
|
||||
|
||||
#: netbox/circuits/choices.py:90 netbox/dcim/choices.py:1605
|
||||
#: netbox/circuits/choices.py:90 netbox/dcim/choices.py:1609
|
||||
#: netbox/tenancy/choices.py:17
|
||||
msgid "Primary"
|
||||
msgstr "Primární"
|
||||
@@ -332,7 +332,7 @@ msgstr "Zakončení A (ID)"
|
||||
#: netbox/extras/filtersets.py:348 netbox/extras/filtersets.py:391
|
||||
#: netbox/extras/filtersets.py:438 netbox/extras/filtersets.py:498
|
||||
#: netbox/extras/filtersets.py:657 netbox/extras/filtersets.py:703
|
||||
#: netbox/ipam/forms/model_forms.py:449 netbox/netbox/filtersets.py:277
|
||||
#: netbox/ipam/forms/model_forms.py:449 netbox/netbox/filtersets.py:280
|
||||
#: netbox/netbox/forms/__init__.py:22 netbox/netbox/forms/base.py:167
|
||||
#: netbox/templates/htmx/object_selector.html:28
|
||||
#: netbox/templates/inc/filter_list.html:45
|
||||
@@ -570,8 +570,8 @@ msgstr "ID služby"
|
||||
#: netbox/dcim/forms/bulk_edit.py:1173 netbox/dcim/forms/bulk_edit.py:1200
|
||||
#: netbox/dcim/forms/bulk_edit.py:1678 netbox/dcim/forms/filtersets.py:1064
|
||||
#: netbox/dcim/forms/filtersets.py:1455 netbox/dcim/forms/filtersets.py:1479
|
||||
#: netbox/dcim/tables/devices.py:700 netbox/dcim/tables/devices.py:757
|
||||
#: netbox/dcim/tables/devices.py:999 netbox/dcim/tables/devicetypes.py:250
|
||||
#: netbox/dcim/tables/devices.py:701 netbox/dcim/tables/devices.py:758
|
||||
#: netbox/dcim/tables/devices.py:1000 netbox/dcim/tables/devicetypes.py:250
|
||||
#: netbox/dcim/tables/devicetypes.py:265 netbox/dcim/tables/racks.py:33
|
||||
#: netbox/extras/forms/bulk_edit.py:270 netbox/extras/tables/tables.py:443
|
||||
#: netbox/templates/circuits/circuittype.html:30
|
||||
@@ -608,7 +608,7 @@ msgstr "Barva"
|
||||
#: netbox/dcim/forms/object_import.py:84
|
||||
#: netbox/dcim/forms/object_import.py:113
|
||||
#: netbox/dcim/forms/object_import.py:145 netbox/dcim/tables/devices.py:178
|
||||
#: netbox/dcim/tables/devices.py:810 netbox/dcim/tables/power.py:77
|
||||
#: netbox/dcim/tables/devices.py:811 netbox/dcim/tables/power.py:77
|
||||
#: netbox/dcim/tables/racks.py:138 netbox/extras/forms/bulk_import.py:42
|
||||
#: netbox/extras/tables/tables.py:405 netbox/extras/tables/tables.py:465
|
||||
#: netbox/netbox/tables/tables.py:240
|
||||
@@ -665,8 +665,8 @@ msgstr "Účet poskytovatele"
|
||||
#: netbox/dcim/forms/filtersets.py:359 netbox/dcim/forms/filtersets.py:799
|
||||
#: netbox/dcim/forms/filtersets.py:924 netbox/dcim/forms/filtersets.py:958
|
||||
#: netbox/dcim/forms/filtersets.py:1059 netbox/dcim/forms/filtersets.py:1170
|
||||
#: netbox/dcim/tables/devices.py:140 netbox/dcim/tables/devices.py:813
|
||||
#: netbox/dcim/tables/devices.py:1059 netbox/dcim/tables/modules.py:69
|
||||
#: netbox/dcim/tables/devices.py:140 netbox/dcim/tables/devices.py:814
|
||||
#: netbox/dcim/tables/devices.py:1060 netbox/dcim/tables/modules.py:69
|
||||
#: netbox/dcim/tables/power.py:74 netbox/dcim/tables/racks.py:126
|
||||
#: netbox/dcim/tables/sites.py:82 netbox/dcim/tables/sites.py:138
|
||||
#: netbox/ipam/forms/bulk_edit.py:255 netbox/ipam/forms/bulk_edit.py:305
|
||||
@@ -815,7 +815,7 @@ msgstr "Parametry služby"
|
||||
#: netbox/circuits/forms/model_forms.py:183
|
||||
#: netbox/dcim/forms/model_forms.py:139 netbox/dcim/forms/model_forms.py:181
|
||||
#: netbox/dcim/forms/model_forms.py:266 netbox/dcim/forms/model_forms.py:323
|
||||
#: netbox/dcim/forms/model_forms.py:768 netbox/dcim/forms/model_forms.py:1691
|
||||
#: netbox/dcim/forms/model_forms.py:768 netbox/dcim/forms/model_forms.py:1692
|
||||
#: netbox/ipam/forms/model_forms.py:64 netbox/ipam/forms/model_forms.py:81
|
||||
#: netbox/ipam/forms/model_forms.py:115 netbox/ipam/forms/model_forms.py:136
|
||||
#: netbox/ipam/forms/model_forms.py:160 netbox/ipam/forms/model_forms.py:232
|
||||
@@ -1397,11 +1397,11 @@ msgstr "sítě poskytovatelů"
|
||||
#: netbox/dcim/tables/devices.py:134 netbox/dcim/tables/devices.py:289
|
||||
#: netbox/dcim/tables/devices.py:392 netbox/dcim/tables/devices.py:433
|
||||
#: netbox/dcim/tables/devices.py:482 netbox/dcim/tables/devices.py:531
|
||||
#: netbox/dcim/tables/devices.py:645 netbox/dcim/tables/devices.py:727
|
||||
#: netbox/dcim/tables/devices.py:774 netbox/dcim/tables/devices.py:837
|
||||
#: netbox/dcim/tables/devices.py:907 netbox/dcim/tables/devices.py:970
|
||||
#: netbox/dcim/tables/devices.py:990 netbox/dcim/tables/devices.py:1019
|
||||
#: netbox/dcim/tables/devices.py:1049 netbox/dcim/tables/devicetypes.py:32
|
||||
#: netbox/dcim/tables/devices.py:645 netbox/dcim/tables/devices.py:728
|
||||
#: netbox/dcim/tables/devices.py:775 netbox/dcim/tables/devices.py:838
|
||||
#: netbox/dcim/tables/devices.py:908 netbox/dcim/tables/devices.py:971
|
||||
#: netbox/dcim/tables/devices.py:991 netbox/dcim/tables/devices.py:1020
|
||||
#: netbox/dcim/tables/devices.py:1050 netbox/dcim/tables/devicetypes.py:32
|
||||
#: netbox/dcim/tables/power.py:22 netbox/dcim/tables/power.py:62
|
||||
#: netbox/dcim/tables/racks.py:24 netbox/dcim/tables/racks.py:113
|
||||
#: netbox/dcim/tables/sites.py:24 netbox/dcim/tables/sites.py:51
|
||||
@@ -1539,7 +1539,7 @@ msgstr "Míra odevzdání"
|
||||
#: netbox/circuits/tables/circuits.py:80
|
||||
#: netbox/circuits/tables/providers.py:48
|
||||
#: netbox/circuits/tables/providers.py:82
|
||||
#: netbox/circuits/tables/providers.py:107 netbox/dcim/tables/devices.py:1032
|
||||
#: netbox/circuits/tables/providers.py:107 netbox/dcim/tables/devices.py:1033
|
||||
#: netbox/dcim/tables/devicetypes.py:93 netbox/dcim/tables/modules.py:29
|
||||
#: netbox/dcim/tables/modules.py:72 netbox/dcim/tables/power.py:39
|
||||
#: netbox/dcim/tables/power.py:96 netbox/dcim/tables/racks.py:84
|
||||
@@ -1618,7 +1618,7 @@ msgstr "Dokončeno"
|
||||
#: netbox/core/choices.py:22 netbox/core/choices.py:59
|
||||
#: netbox/core/constants.py:20 netbox/core/tables/tasks.py:34
|
||||
#: netbox/dcim/choices.py:187 netbox/dcim/choices.py:233
|
||||
#: netbox/dcim/choices.py:1595 netbox/virtualization/choices.py:47
|
||||
#: netbox/dcim/choices.py:1599 netbox/virtualization/choices.py:47
|
||||
msgid "Failed"
|
||||
msgstr "Neuspěl"
|
||||
|
||||
@@ -1943,7 +1943,7 @@ msgstr ""
|
||||
msgid "Rack Elevations"
|
||||
msgstr "Výšky stojanů"
|
||||
|
||||
#: netbox/core/forms/model_forms.py:157 netbox/dcim/choices.py:1506
|
||||
#: netbox/core/forms/model_forms.py:157 netbox/dcim/choices.py:1510
|
||||
#: netbox/dcim/forms/bulk_edit.py:969 netbox/dcim/forms/bulk_edit.py:1357
|
||||
#: netbox/dcim/forms/bulk_edit.py:1375 netbox/dcim/tables/racks.py:158
|
||||
#: netbox/netbox/navigation/menu.py:291 netbox/netbox/navigation/menu.py:295
|
||||
@@ -2516,7 +2516,7 @@ msgid "Staging"
|
||||
msgstr "Inscenace"
|
||||
|
||||
#: netbox/dcim/choices.py:23 netbox/dcim/choices.py:189
|
||||
#: netbox/dcim/choices.py:234 netbox/dcim/choices.py:1519
|
||||
#: netbox/dcim/choices.py:234 netbox/dcim/choices.py:1523
|
||||
#: netbox/virtualization/choices.py:23 netbox/virtualization/choices.py:48
|
||||
msgid "Decommissioning"
|
||||
msgstr "Vyřazení z provozu"
|
||||
@@ -2580,7 +2580,7 @@ msgstr "Zastaralé"
|
||||
msgid "Millimeters"
|
||||
msgstr "Milimetry"
|
||||
|
||||
#: netbox/dcim/choices.py:115 netbox/dcim/choices.py:1541
|
||||
#: netbox/dcim/choices.py:115 netbox/dcim/choices.py:1545
|
||||
msgid "Inches"
|
||||
msgstr "palce"
|
||||
|
||||
@@ -2602,9 +2602,9 @@ msgstr "Zezadu dopředu"
|
||||
#: netbox/dcim/forms/bulk_import.py:1088 netbox/dcim/forms/filtersets.py:234
|
||||
#: netbox/dcim/forms/model_forms.py:74 netbox/dcim/forms/model_forms.py:93
|
||||
#: netbox/dcim/forms/model_forms.py:170 netbox/dcim/forms/model_forms.py:1062
|
||||
#: netbox/dcim/forms/model_forms.py:1501
|
||||
#: netbox/dcim/forms/model_forms.py:1502
|
||||
#: netbox/dcim/forms/object_import.py:176 netbox/dcim/tables/devices.py:653
|
||||
#: netbox/dcim/tables/devices.py:865 netbox/dcim/tables/devices.py:950
|
||||
#: netbox/dcim/tables/devices.py:866 netbox/dcim/tables/devices.py:951
|
||||
#: netbox/extras/tables/tables.py:223 netbox/ipam/tables/fhrp.py:59
|
||||
#: netbox/ipam/tables/ip.py:378 netbox/ipam/tables/services.py:44
|
||||
#: netbox/templates/dcim/interface.html:102
|
||||
@@ -2634,15 +2634,15 @@ msgstr "Rodič"
|
||||
msgid "Child"
|
||||
msgstr "Dítě"
|
||||
|
||||
#: netbox/dcim/choices.py:166 netbox/templates/dcim/device.html:339
|
||||
#: netbox/templates/dcim/rack.html:129
|
||||
#: netbox/dcim/choices.py:166 netbox/templates/dcim/device.html:340
|
||||
#: netbox/templates/dcim/rack.html:133
|
||||
#: netbox/templates/dcim/rack_elevation_list.html:20
|
||||
#: netbox/templates/dcim/rackreservation.html:76
|
||||
msgid "Front"
|
||||
msgstr "Fronta"
|
||||
|
||||
#: netbox/dcim/choices.py:167 netbox/templates/dcim/device.html:345
|
||||
#: netbox/templates/dcim/rack.html:135
|
||||
#: netbox/dcim/choices.py:167 netbox/templates/dcim/device.html:346
|
||||
#: netbox/templates/dcim/rack.html:139
|
||||
#: netbox/templates/dcim/rack_elevation_list.html:21
|
||||
#: netbox/templates/dcim/rackreservation.html:82
|
||||
msgid "Rear"
|
||||
@@ -2670,7 +2670,7 @@ msgid "Side to rear"
|
||||
msgstr "Ze strany dozadu"
|
||||
|
||||
#: netbox/dcim/choices.py:209 netbox/dcim/choices.py:253
|
||||
#: netbox/dcim/choices.py:1291
|
||||
#: netbox/dcim/choices.py:1295
|
||||
msgid "Passive"
|
||||
msgstr "pasivní"
|
||||
|
||||
@@ -2678,15 +2678,15 @@ msgstr "pasivní"
|
||||
msgid "Mixed"
|
||||
msgstr "Smíšené"
|
||||
|
||||
#: netbox/dcim/choices.py:478 netbox/dcim/choices.py:726
|
||||
#: netbox/dcim/choices.py:478 netbox/dcim/choices.py:727
|
||||
msgid "NEMA (Non-locking)"
|
||||
msgstr "NEMA (bez blokování)"
|
||||
|
||||
#: netbox/dcim/choices.py:500 netbox/dcim/choices.py:748
|
||||
#: netbox/dcim/choices.py:500 netbox/dcim/choices.py:749
|
||||
msgid "NEMA (Locking)"
|
||||
msgstr "NEMA (zamykání)"
|
||||
|
||||
#: netbox/dcim/choices.py:524 netbox/dcim/choices.py:772
|
||||
#: netbox/dcim/choices.py:524 netbox/dcim/choices.py:773
|
||||
msgid "California Style"
|
||||
msgstr "Kalifornský styl"
|
||||
|
||||
@@ -2694,42 +2694,42 @@ msgstr "Kalifornský styl"
|
||||
msgid "International/ITA"
|
||||
msgstr "Mezinárodní/ITA"
|
||||
|
||||
#: netbox/dcim/choices.py:567 netbox/dcim/choices.py:807
|
||||
#: netbox/dcim/choices.py:567 netbox/dcim/choices.py:808
|
||||
msgid "Proprietary"
|
||||
msgstr "Proprietární"
|
||||
|
||||
#: netbox/dcim/choices.py:575 netbox/dcim/choices.py:816
|
||||
#: netbox/dcim/choices.py:1207 netbox/dcim/choices.py:1209
|
||||
#: netbox/dcim/choices.py:1435 netbox/dcim/choices.py:1437
|
||||
#: netbox/dcim/choices.py:575 netbox/dcim/choices.py:818
|
||||
#: netbox/dcim/choices.py:1211 netbox/dcim/choices.py:1213
|
||||
#: netbox/dcim/choices.py:1439 netbox/dcim/choices.py:1441
|
||||
#: netbox/netbox/navigation/menu.py:200
|
||||
msgid "Other"
|
||||
msgstr "Ostatní"
|
||||
|
||||
#: netbox/dcim/choices.py:780
|
||||
#: netbox/dcim/choices.py:781
|
||||
msgid "ITA/International"
|
||||
msgstr "ITA/Mezinárodní"
|
||||
|
||||
#: netbox/dcim/choices.py:846
|
||||
#: netbox/dcim/choices.py:848
|
||||
msgid "Physical"
|
||||
msgstr "Fyzické"
|
||||
|
||||
#: netbox/dcim/choices.py:847 netbox/dcim/choices.py:1013
|
||||
#: netbox/dcim/choices.py:849 netbox/dcim/choices.py:1016
|
||||
msgid "Virtual"
|
||||
msgstr "Virtuální"
|
||||
|
||||
#: netbox/dcim/choices.py:848 netbox/dcim/choices.py:1086
|
||||
#: netbox/dcim/choices.py:850 netbox/dcim/choices.py:1089
|
||||
#: netbox/dcim/forms/bulk_edit.py:1515 netbox/dcim/forms/filtersets.py:1330
|
||||
#: netbox/dcim/forms/model_forms.py:988 netbox/dcim/forms/model_forms.py:1396
|
||||
#: netbox/dcim/forms/model_forms.py:988 netbox/dcim/forms/model_forms.py:1397
|
||||
#: netbox/netbox/navigation/menu.py:140 netbox/netbox/navigation/menu.py:144
|
||||
#: netbox/templates/dcim/interface.html:210
|
||||
msgid "Wireless"
|
||||
msgstr "Bezdrátové"
|
||||
|
||||
#: netbox/dcim/choices.py:1011
|
||||
#: netbox/dcim/choices.py:1014
|
||||
msgid "Virtual interfaces"
|
||||
msgstr "Virtuální rozhraní"
|
||||
|
||||
#: netbox/dcim/choices.py:1014 netbox/dcim/forms/bulk_edit.py:1410
|
||||
#: netbox/dcim/choices.py:1017 netbox/dcim/forms/bulk_edit.py:1410
|
||||
#: netbox/dcim/forms/bulk_import.py:840 netbox/dcim/forms/model_forms.py:974
|
||||
#: netbox/dcim/tables/devices.py:657 netbox/templates/dcim/interface.html:106
|
||||
#: netbox/templates/virtualization/vminterface.html:43
|
||||
@@ -2739,27 +2739,27 @@ msgstr "Virtuální rozhraní"
|
||||
msgid "Bridge"
|
||||
msgstr "Most"
|
||||
|
||||
#: netbox/dcim/choices.py:1015
|
||||
#: netbox/dcim/choices.py:1018
|
||||
msgid "Link Aggregation Group (LAG)"
|
||||
msgstr "Agregační skupina (LAG)"
|
||||
|
||||
#: netbox/dcim/choices.py:1019
|
||||
#: netbox/dcim/choices.py:1022
|
||||
msgid "Ethernet (fixed)"
|
||||
msgstr "Ethernet (pevný)"
|
||||
|
||||
#: netbox/dcim/choices.py:1034
|
||||
#: netbox/dcim/choices.py:1037
|
||||
msgid "Ethernet (modular)"
|
||||
msgstr "Ethernet (modulární)"
|
||||
|
||||
#: netbox/dcim/choices.py:1070
|
||||
#: netbox/dcim/choices.py:1073
|
||||
msgid "Ethernet (backplane)"
|
||||
msgstr "Ethernet (propojovací deska)"
|
||||
|
||||
#: netbox/dcim/choices.py:1101
|
||||
#: netbox/dcim/choices.py:1105
|
||||
msgid "Cellular"
|
||||
msgstr "Buněčný"
|
||||
|
||||
#: netbox/dcim/choices.py:1153 netbox/dcim/forms/filtersets.py:383
|
||||
#: netbox/dcim/choices.py:1157 netbox/dcim/forms/filtersets.py:383
|
||||
#: netbox/dcim/forms/filtersets.py:809 netbox/dcim/forms/filtersets.py:963
|
||||
#: netbox/dcim/forms/filtersets.py:1542
|
||||
#: netbox/templates/dcim/inventoryitem.html:52
|
||||
@@ -2767,129 +2767,130 @@ msgstr "Buněčný"
|
||||
msgid "Serial"
|
||||
msgstr "Sériový"
|
||||
|
||||
#: netbox/dcim/choices.py:1168
|
||||
#: netbox/dcim/choices.py:1172
|
||||
msgid "Coaxial"
|
||||
msgstr "Koaxiální"
|
||||
|
||||
#: netbox/dcim/choices.py:1188
|
||||
#: netbox/dcim/choices.py:1192
|
||||
msgid "Stacking"
|
||||
msgstr "Stohování"
|
||||
|
||||
#: netbox/dcim/choices.py:1238
|
||||
#: netbox/dcim/choices.py:1242
|
||||
msgid "Half"
|
||||
msgstr "Poloviční"
|
||||
|
||||
#: netbox/dcim/choices.py:1239
|
||||
#: netbox/dcim/choices.py:1243
|
||||
msgid "Full"
|
||||
msgstr "Plný"
|
||||
|
||||
#: netbox/dcim/choices.py:1240 netbox/netbox/preferences.py:31
|
||||
#: netbox/dcim/choices.py:1244 netbox/netbox/preferences.py:31
|
||||
#: netbox/wireless/choices.py:480
|
||||
msgid "Auto"
|
||||
msgstr "Auto"
|
||||
|
||||
#: netbox/dcim/choices.py:1251
|
||||
#: netbox/dcim/choices.py:1255
|
||||
msgid "Access"
|
||||
msgstr "Přístup"
|
||||
|
||||
#: netbox/dcim/choices.py:1252 netbox/ipam/tables/vlans.py:172
|
||||
#: netbox/dcim/choices.py:1256 netbox/ipam/tables/vlans.py:172
|
||||
#: netbox/ipam/tables/vlans.py:217
|
||||
#: netbox/templates/dcim/inc/interface_vlans_table.html:7
|
||||
msgid "Tagged"
|
||||
msgstr "Označeno"
|
||||
|
||||
#: netbox/dcim/choices.py:1253
|
||||
#: netbox/dcim/choices.py:1257
|
||||
msgid "Tagged (All)"
|
||||
msgstr "Označeno (Vše)"
|
||||
|
||||
#: netbox/dcim/choices.py:1282
|
||||
#: netbox/dcim/choices.py:1286
|
||||
msgid "IEEE Standard"
|
||||
msgstr "Norma IEEE"
|
||||
|
||||
#: netbox/dcim/choices.py:1293
|
||||
#: netbox/dcim/choices.py:1297
|
||||
msgid "Passive 24V (2-pair)"
|
||||
msgstr "Pasivní 24V (2 páry)"
|
||||
|
||||
#: netbox/dcim/choices.py:1294
|
||||
#: netbox/dcim/choices.py:1298
|
||||
msgid "Passive 24V (4-pair)"
|
||||
msgstr "Pasivní 24V (4 páry)"
|
||||
|
||||
#: netbox/dcim/choices.py:1295
|
||||
#: netbox/dcim/choices.py:1299
|
||||
msgid "Passive 48V (2-pair)"
|
||||
msgstr "Pasivní 48V (2 páry)"
|
||||
|
||||
#: netbox/dcim/choices.py:1296
|
||||
#: netbox/dcim/choices.py:1300
|
||||
msgid "Passive 48V (4-pair)"
|
||||
msgstr "Pasivní 48V (4 páry)"
|
||||
|
||||
#: netbox/dcim/choices.py:1366 netbox/dcim/choices.py:1476
|
||||
#: netbox/dcim/choices.py:1370 netbox/dcim/choices.py:1480
|
||||
msgid "Copper"
|
||||
msgstr "měď"
|
||||
|
||||
#: netbox/dcim/choices.py:1389
|
||||
#: netbox/dcim/choices.py:1393
|
||||
msgid "Fiber Optic"
|
||||
msgstr "Optická vlákna"
|
||||
|
||||
#: netbox/dcim/choices.py:1422 netbox/dcim/choices.py:1505
|
||||
#: netbox/dcim/choices.py:1426 netbox/dcim/choices.py:1509
|
||||
msgid "USB"
|
||||
msgstr "USB"
|
||||
|
||||
#: netbox/dcim/choices.py:1492
|
||||
#: netbox/dcim/choices.py:1496
|
||||
msgid "Fiber"
|
||||
msgstr "Vlákno"
|
||||
|
||||
#: netbox/dcim/choices.py:1517 netbox/dcim/forms/filtersets.py:1227
|
||||
#: netbox/dcim/choices.py:1521 netbox/dcim/forms/filtersets.py:1227
|
||||
msgid "Connected"
|
||||
msgstr "Připojeno"
|
||||
|
||||
#: netbox/dcim/choices.py:1536 netbox/wireless/choices.py:497
|
||||
#: netbox/dcim/choices.py:1540 netbox/wireless/choices.py:497
|
||||
msgid "Kilometers"
|
||||
msgstr "Kilometry"
|
||||
|
||||
#: netbox/dcim/choices.py:1537 netbox/templates/dcim/cable_trace.html:65
|
||||
#: netbox/dcim/choices.py:1541 netbox/templates/dcim/cable_trace.html:65
|
||||
#: netbox/wireless/choices.py:498
|
||||
msgid "Meters"
|
||||
msgstr "Metry"
|
||||
|
||||
#: netbox/dcim/choices.py:1538
|
||||
#: netbox/dcim/choices.py:1542
|
||||
msgid "Centimeters"
|
||||
msgstr "Centimetry"
|
||||
|
||||
#: netbox/dcim/choices.py:1539 netbox/wireless/choices.py:499
|
||||
#: netbox/dcim/choices.py:1543 netbox/wireless/choices.py:499
|
||||
msgid "Miles"
|
||||
msgstr "Míle"
|
||||
|
||||
#: netbox/dcim/choices.py:1540 netbox/templates/dcim/cable_trace.html:66
|
||||
#: netbox/dcim/choices.py:1544 netbox/templates/dcim/cable_trace.html:66
|
||||
#: netbox/wireless/choices.py:500
|
||||
msgid "Feet"
|
||||
msgstr "Stopy"
|
||||
|
||||
#: netbox/dcim/choices.py:1556 netbox/templates/dcim/device.html:327
|
||||
#: netbox/templates/dcim/rack.html:106
|
||||
#: netbox/dcim/choices.py:1560 netbox/templates/dcim/device.html:327
|
||||
#: netbox/templates/dcim/rack.html:107
|
||||
msgid "Kilograms"
|
||||
msgstr "Kilogramy"
|
||||
|
||||
#: netbox/dcim/choices.py:1557
|
||||
#: netbox/dcim/choices.py:1561
|
||||
msgid "Grams"
|
||||
msgstr "Gramy"
|
||||
|
||||
#: netbox/dcim/choices.py:1558 netbox/templates/dcim/rack.html:107
|
||||
#: netbox/dcim/choices.py:1562 netbox/templates/dcim/device.html:328
|
||||
#: netbox/templates/dcim/rack.html:108
|
||||
msgid "Pounds"
|
||||
msgstr "libry"
|
||||
|
||||
#: netbox/dcim/choices.py:1559
|
||||
#: netbox/dcim/choices.py:1563
|
||||
msgid "Ounces"
|
||||
msgstr "Unce"
|
||||
|
||||
#: netbox/dcim/choices.py:1606
|
||||
#: netbox/dcim/choices.py:1610
|
||||
msgid "Redundant"
|
||||
msgstr "Redundantní"
|
||||
|
||||
#: netbox/dcim/choices.py:1627
|
||||
#: netbox/dcim/choices.py:1631
|
||||
msgid "Single phase"
|
||||
msgstr "Jednofázový"
|
||||
|
||||
#: netbox/dcim/choices.py:1628
|
||||
#: netbox/dcim/choices.py:1632
|
||||
msgid "Three-phase"
|
||||
msgstr "Třífázový"
|
||||
|
||||
@@ -3259,7 +3260,7 @@ msgstr "Přiřazené VID"
|
||||
|
||||
#: netbox/dcim/filtersets.py:1613 netbox/dcim/forms/bulk_edit.py:1489
|
||||
#: netbox/dcim/forms/bulk_import.py:891 netbox/dcim/forms/filtersets.py:1428
|
||||
#: netbox/dcim/forms/model_forms.py:1377
|
||||
#: netbox/dcim/forms/model_forms.py:1378
|
||||
#: netbox/dcim/models/device_components.py:712
|
||||
#: netbox/dcim/tables/devices.py:623 netbox/ipam/filtersets.py:316
|
||||
#: netbox/ipam/filtersets.py:327 netbox/ipam/filtersets.py:483
|
||||
@@ -3338,7 +3339,7 @@ msgid "LAG interface (ID)"
|
||||
msgstr "Rozhraní LAG (ID)"
|
||||
|
||||
#: netbox/dcim/filtersets.py:1713 netbox/dcim/filtersets.py:1725
|
||||
#: netbox/dcim/forms/filtersets.py:1345 netbox/dcim/forms/model_forms.py:1689
|
||||
#: netbox/dcim/forms/filtersets.py:1345 netbox/dcim/forms/model_forms.py:1690
|
||||
#: netbox/templates/dcim/virtualdevicecontext.html:15
|
||||
msgid "Virtual Device Context"
|
||||
msgstr "Kontext virtuálního zařízení"
|
||||
@@ -3413,7 +3414,7 @@ msgstr "Značky"
|
||||
#: netbox/dcim/forms/model_forms.py:488 netbox/dcim/forms/model_forms.py:546
|
||||
#: netbox/dcim/forms/object_create.py:197
|
||||
#: netbox/dcim/forms/object_create.py:353 netbox/dcim/tables/devices.py:165
|
||||
#: netbox/dcim/tables/devices.py:703 netbox/dcim/tables/devicetypes.py:247
|
||||
#: netbox/dcim/tables/devices.py:704 netbox/dcim/tables/devicetypes.py:247
|
||||
#: netbox/templates/dcim/device.html:43 netbox/templates/dcim/device.html:131
|
||||
#: netbox/templates/dcim/modulebay.html:38
|
||||
#: netbox/templates/dcim/virtualchassis.html:66
|
||||
@@ -3460,9 +3461,9 @@ msgstr "Časové pásmo"
|
||||
#: netbox/dcim/forms/model_forms.py:207 netbox/dcim/forms/model_forms.py:337
|
||||
#: netbox/dcim/forms/model_forms.py:349 netbox/dcim/forms/model_forms.py:395
|
||||
#: netbox/dcim/forms/model_forms.py:436 netbox/dcim/forms/model_forms.py:1075
|
||||
#: netbox/dcim/forms/model_forms.py:1514
|
||||
#: netbox/dcim/forms/model_forms.py:1515
|
||||
#: netbox/dcim/forms/object_import.py:187 netbox/dcim/tables/devices.py:96
|
||||
#: netbox/dcim/tables/devices.py:172 netbox/dcim/tables/devices.py:936
|
||||
#: netbox/dcim/tables/devices.py:172 netbox/dcim/tables/devices.py:937
|
||||
#: netbox/dcim/tables/devicetypes.py:81 netbox/dcim/tables/devicetypes.py:309
|
||||
#: netbox/dcim/tables/modules.py:20 netbox/dcim/tables/modules.py:60
|
||||
#: netbox/dcim/tables/racks.py:58 netbox/dcim/tables/racks.py:132
|
||||
@@ -3586,9 +3587,9 @@ msgstr "Číslování"
|
||||
#: netbox/dcim/forms/bulk_import.py:1076 netbox/dcim/forms/filtersets.py:367
|
||||
#: netbox/dcim/forms/filtersets.py:777 netbox/dcim/forms/filtersets.py:1534
|
||||
#: netbox/dcim/forms/model_forms.py:251 netbox/dcim/forms/model_forms.py:1070
|
||||
#: netbox/dcim/forms/model_forms.py:1509
|
||||
#: netbox/dcim/forms/model_forms.py:1510
|
||||
#: netbox/dcim/forms/object_import.py:181 netbox/dcim/tables/devices.py:169
|
||||
#: netbox/dcim/tables/devices.py:805 netbox/dcim/tables/devices.py:933
|
||||
#: netbox/dcim/tables/devices.py:806 netbox/dcim/tables/devices.py:934
|
||||
#: netbox/dcim/tables/devicetypes.py:305 netbox/dcim/tables/racks.py:129
|
||||
#: netbox/extras/filtersets.py:552 netbox/ipam/forms/bulk_edit.py:260
|
||||
#: netbox/ipam/forms/bulk_edit.py:310 netbox/ipam/forms/bulk_edit.py:358
|
||||
@@ -3678,7 +3679,7 @@ msgstr "Stojan"
|
||||
#: netbox/dcim/forms/filtersets.py:325 netbox/dcim/forms/filtersets.py:398
|
||||
#: netbox/dcim/forms/filtersets.py:481 netbox/dcim/forms/filtersets.py:608
|
||||
#: netbox/dcim/forms/filtersets.py:721 netbox/dcim/forms/filtersets.py:942
|
||||
#: netbox/dcim/forms/model_forms.py:670 netbox/dcim/forms/model_forms.py:1579
|
||||
#: netbox/dcim/forms/model_forms.py:670 netbox/dcim/forms/model_forms.py:1580
|
||||
#: netbox/templates/dcim/device_edit.html:20
|
||||
msgid "Hardware"
|
||||
msgstr "Hardware"
|
||||
@@ -3786,15 +3787,15 @@ msgstr "Nástupiště"
|
||||
#: netbox/dcim/forms/filtersets.py:1592 netbox/dcim/forms/filtersets.py:1616
|
||||
#: netbox/dcim/forms/filtersets.py:1640 netbox/dcim/forms/model_forms.py:633
|
||||
#: netbox/dcim/forms/model_forms.py:849 netbox/dcim/forms/model_forms.py:1208
|
||||
#: netbox/dcim/forms/model_forms.py:1663
|
||||
#: netbox/dcim/forms/model_forms.py:1664
|
||||
#: netbox/dcim/forms/object_create.py:257 netbox/dcim/tables/connections.py:22
|
||||
#: netbox/dcim/tables/connections.py:41 netbox/dcim/tables/connections.py:60
|
||||
#: netbox/dcim/tables/devices.py:285 netbox/dcim/tables/devices.py:371
|
||||
#: netbox/dcim/tables/devices.py:412 netbox/dcim/tables/devices.py:454
|
||||
#: netbox/dcim/tables/devices.py:505 netbox/dcim/tables/devices.py:594
|
||||
#: netbox/dcim/tables/devices.py:693 netbox/dcim/tables/devices.py:750
|
||||
#: netbox/dcim/tables/devices.py:797 netbox/dcim/tables/devices.py:857
|
||||
#: netbox/dcim/tables/devices.py:926 netbox/dcim/tables/devices.py:1053
|
||||
#: netbox/dcim/tables/devices.py:694 netbox/dcim/tables/devices.py:751
|
||||
#: netbox/dcim/tables/devices.py:798 netbox/dcim/tables/devices.py:858
|
||||
#: netbox/dcim/tables/devices.py:927 netbox/dcim/tables/devices.py:1054
|
||||
#: netbox/dcim/tables/modules.py:52 netbox/extras/forms/filtersets.py:321
|
||||
#: netbox/ipam/forms/bulk_import.py:304 netbox/ipam/forms/bulk_import.py:481
|
||||
#: netbox/ipam/forms/filtersets.py:551 netbox/ipam/forms/model_forms.py:319
|
||||
@@ -3938,7 +3939,7 @@ msgstr "Přidělený příkon (W)"
|
||||
|
||||
#: netbox/dcim/forms/bulk_edit.py:1078 netbox/dcim/forms/bulk_import.py:786
|
||||
#: netbox/dcim/forms/model_forms.py:953 netbox/dcim/forms/model_forms.py:1278
|
||||
#: netbox/dcim/forms/model_forms.py:1566 netbox/dcim/forms/object_import.py:55
|
||||
#: netbox/dcim/forms/model_forms.py:1567 netbox/dcim/forms/object_import.py:55
|
||||
msgid "Power port"
|
||||
msgstr "Napájecí port"
|
||||
|
||||
@@ -4026,14 +4027,14 @@ msgstr "Režim"
|
||||
msgid "VLAN group"
|
||||
msgstr "Skupina VLAN"
|
||||
|
||||
#: netbox/dcim/forms/bulk_edit.py:1476 netbox/dcim/forms/model_forms.py:1359
|
||||
#: netbox/dcim/forms/bulk_edit.py:1476 netbox/dcim/forms/model_forms.py:1360
|
||||
#: netbox/dcim/tables/devices.py:579
|
||||
#: netbox/virtualization/forms/bulk_edit.py:248
|
||||
#: netbox/virtualization/forms/model_forms.py:326
|
||||
msgid "Untagged VLAN"
|
||||
msgstr "Neznačené VLAN"
|
||||
|
||||
#: netbox/dcim/forms/bulk_edit.py:1484 netbox/dcim/forms/model_forms.py:1368
|
||||
#: netbox/dcim/forms/bulk_edit.py:1484 netbox/dcim/forms/model_forms.py:1369
|
||||
#: netbox/dcim/tables/devices.py:585
|
||||
#: netbox/virtualization/forms/bulk_edit.py:256
|
||||
#: netbox/virtualization/forms/model_forms.py:335
|
||||
@@ -4052,7 +4053,7 @@ msgid "Wireless LANs"
|
||||
msgstr "Bezdrátové LAN sítě"
|
||||
|
||||
#: netbox/dcim/forms/bulk_edit.py:1508 netbox/dcim/forms/filtersets.py:1328
|
||||
#: netbox/dcim/forms/model_forms.py:1389 netbox/ipam/forms/bulk_edit.py:285
|
||||
#: netbox/dcim/forms/model_forms.py:1390 netbox/ipam/forms/bulk_edit.py:285
|
||||
#: netbox/ipam/forms/bulk_edit.py:377 netbox/ipam/forms/filtersets.py:169
|
||||
#: netbox/templates/dcim/interface.html:122
|
||||
#: netbox/templates/ipam/prefix.html:95
|
||||
@@ -4061,24 +4062,24 @@ msgid "Addressing"
|
||||
msgstr "Adresování"
|
||||
|
||||
#: netbox/dcim/forms/bulk_edit.py:1509 netbox/dcim/forms/filtersets.py:720
|
||||
#: netbox/dcim/forms/model_forms.py:1390
|
||||
#: netbox/dcim/forms/model_forms.py:1391
|
||||
#: netbox/virtualization/forms/model_forms.py:350
|
||||
msgid "Operation"
|
||||
msgstr "Operace"
|
||||
|
||||
#: netbox/dcim/forms/bulk_edit.py:1510 netbox/dcim/forms/filtersets.py:1329
|
||||
#: netbox/dcim/forms/model_forms.py:987 netbox/dcim/forms/model_forms.py:1392
|
||||
#: netbox/dcim/forms/model_forms.py:987 netbox/dcim/forms/model_forms.py:1393
|
||||
msgid "PoE"
|
||||
msgstr "PoE"
|
||||
|
||||
#: netbox/dcim/forms/bulk_edit.py:1511 netbox/dcim/forms/model_forms.py:1391
|
||||
#: netbox/dcim/forms/bulk_edit.py:1511 netbox/dcim/forms/model_forms.py:1392
|
||||
#: netbox/templates/dcim/interface.html:99
|
||||
#: netbox/virtualization/forms/bulk_edit.py:267
|
||||
#: netbox/virtualization/forms/model_forms.py:351
|
||||
msgid "Related Interfaces"
|
||||
msgstr "Související rozhraní"
|
||||
|
||||
#: netbox/dcim/forms/bulk_edit.py:1512 netbox/dcim/forms/model_forms.py:1393
|
||||
#: netbox/dcim/forms/bulk_edit.py:1512 netbox/dcim/forms/model_forms.py:1394
|
||||
#: netbox/virtualization/forms/bulk_edit.py:268
|
||||
#: netbox/virtualization/forms/model_forms.py:352
|
||||
msgid "802.1Q Switching"
|
||||
@@ -4417,7 +4418,7 @@ msgid "VDC {vdc} is not assigned to device {device}"
|
||||
msgstr "VDC {vdc} není přiřazen k zařízení {device}"
|
||||
|
||||
#: netbox/dcim/forms/bulk_import.py:951 netbox/dcim/forms/model_forms.py:1000
|
||||
#: netbox/dcim/forms/model_forms.py:1574
|
||||
#: netbox/dcim/forms/model_forms.py:1575
|
||||
#: netbox/dcim/forms/object_import.py:117
|
||||
msgid "Rear port"
|
||||
msgstr "Zadní port"
|
||||
@@ -4431,7 +4432,7 @@ msgstr "Odpovídající zadní port"
|
||||
msgid "Physical medium classification"
|
||||
msgstr "Klasifikace fyzického média"
|
||||
|
||||
#: netbox/dcim/forms/bulk_import.py:1028 netbox/dcim/tables/devices.py:818
|
||||
#: netbox/dcim/forms/bulk_import.py:1028 netbox/dcim/tables/devices.py:819
|
||||
msgid "Installed device"
|
||||
msgstr "Nainstalované zařízení"
|
||||
|
||||
@@ -4520,7 +4521,7 @@ msgid "{side_upper} side termination not found: {device} {name}"
|
||||
msgstr "Zakončení strany {side_upper} nebylo nalezeno: {device} {name}"
|
||||
|
||||
#: netbox/dcim/forms/bulk_import.py:1293 netbox/dcim/forms/model_forms.py:785
|
||||
#: netbox/dcim/tables/devices.py:1023 netbox/templates/dcim/device.html:132
|
||||
#: netbox/dcim/tables/devices.py:1024 netbox/templates/dcim/device.html:132
|
||||
#: netbox/templates/dcim/virtualchassis.html:27
|
||||
#: netbox/templates/dcim/virtualchassis.html:67
|
||||
msgid "Master"
|
||||
@@ -4550,6 +4551,28 @@ msgstr "Typ napájení (AC/DC)"
|
||||
msgid "Single or three-phase"
|
||||
msgstr "Jednofázové nebo třífázové"
|
||||
|
||||
#: netbox/dcim/forms/bulk_import.py:1439 netbox/dcim/forms/model_forms.py:1670
|
||||
#: netbox/templates/dcim/device.html:190
|
||||
#: netbox/templates/dcim/virtualdevicecontext.html:30
|
||||
#: netbox/templates/virtualization/virtualmachine.html:52
|
||||
msgid "Primary IPv4"
|
||||
msgstr "Primární IPv4"
|
||||
|
||||
#: netbox/dcim/forms/bulk_import.py:1443
|
||||
msgid "IPv4 address with mask, e.g. 1.2.3.4/24"
|
||||
msgstr "IPv4 adresa s maskou, např. 1.2.3.4/24"
|
||||
|
||||
#: netbox/dcim/forms/bulk_import.py:1446 netbox/dcim/forms/model_forms.py:1679
|
||||
#: netbox/templates/dcim/device.html:206
|
||||
#: netbox/templates/dcim/virtualdevicecontext.html:41
|
||||
#: netbox/templates/virtualization/virtualmachine.html:68
|
||||
msgid "Primary IPv6"
|
||||
msgstr "Primární IPv6"
|
||||
|
||||
#: netbox/dcim/forms/bulk_import.py:1450
|
||||
msgid "IPv6 address with prefix length, e.g. 2001:db8::1/64"
|
||||
msgstr "IPv6 adresa s délkou předpony, např. 2001:db8: :1/64"
|
||||
|
||||
#: netbox/dcim/forms/common.py:24 netbox/dcim/models/device_components.py:528
|
||||
#: netbox/templates/dcim/interface.html:57
|
||||
#: netbox/templates/virtualization/vminterface.html:55
|
||||
@@ -4712,7 +4735,7 @@ msgstr "Druh"
|
||||
msgid "Mgmt only"
|
||||
msgstr "Pouze správa"
|
||||
|
||||
#: netbox/dcim/forms/filtersets.py:1389 netbox/dcim/forms/model_forms.py:1382
|
||||
#: netbox/dcim/forms/filtersets.py:1389 netbox/dcim/forms/model_forms.py:1383
|
||||
#: netbox/dcim/models/device_components.py:630
|
||||
#: netbox/templates/dcim/interface.html:129
|
||||
msgid "WWN"
|
||||
@@ -4746,7 +4769,7 @@ msgstr "Vysílací výkon (dBm)"
|
||||
msgid "Cable"
|
||||
msgstr "Kabel"
|
||||
|
||||
#: netbox/dcim/forms/filtersets.py:1550 netbox/dcim/tables/devices.py:945
|
||||
#: netbox/dcim/forms/filtersets.py:1550 netbox/dcim/tables/devices.py:946
|
||||
msgid "Discovered"
|
||||
msgstr "objeveno"
|
||||
|
||||
@@ -4843,8 +4866,8 @@ msgstr "Šablona napájecího portu"
|
||||
msgid "Rear port template"
|
||||
msgstr "Šablona zadního portu"
|
||||
|
||||
#: netbox/dcim/forms/model_forms.py:1144 netbox/dcim/forms/model_forms.py:1387
|
||||
#: netbox/dcim/forms/model_forms.py:1550 netbox/dcim/forms/model_forms.py:1582
|
||||
#: netbox/dcim/forms/model_forms.py:1144 netbox/dcim/forms/model_forms.py:1388
|
||||
#: netbox/dcim/forms/model_forms.py:1551 netbox/dcim/forms/model_forms.py:1583
|
||||
#: netbox/dcim/tables/connections.py:65 netbox/ipam/forms/bulk_import.py:318
|
||||
#: netbox/ipam/forms/model_forms.py:280 netbox/ipam/forms/model_forms.py:289
|
||||
#: netbox/ipam/tables/fhrp.py:64 netbox/ipam/tables/ip.py:372
|
||||
@@ -4868,7 +4891,7 @@ msgstr "Šablona zadního portu"
|
||||
msgid "Interface"
|
||||
msgstr "Rozhraní"
|
||||
|
||||
#: netbox/dcim/forms/model_forms.py:1145 netbox/dcim/forms/model_forms.py:1583
|
||||
#: netbox/dcim/forms/model_forms.py:1145 netbox/dcim/forms/model_forms.py:1584
|
||||
#: netbox/dcim/tables/connections.py:27
|
||||
#: netbox/templates/dcim/consoleport.html:17
|
||||
#: netbox/templates/dcim/consoleserverport.html:74
|
||||
@@ -4876,14 +4899,14 @@ msgstr "Rozhraní"
|
||||
msgid "Console Port"
|
||||
msgstr "Port konzoly"
|
||||
|
||||
#: netbox/dcim/forms/model_forms.py:1146 netbox/dcim/forms/model_forms.py:1584
|
||||
#: netbox/dcim/forms/model_forms.py:1146 netbox/dcim/forms/model_forms.py:1585
|
||||
#: netbox/templates/dcim/consoleport.html:73
|
||||
#: netbox/templates/dcim/consoleserverport.html:17
|
||||
#: netbox/templates/dcim/frontport.html:109
|
||||
msgid "Console Server Port"
|
||||
msgstr "Port konzolového serveru"
|
||||
|
||||
#: netbox/dcim/forms/model_forms.py:1147 netbox/dcim/forms/model_forms.py:1585
|
||||
#: netbox/dcim/forms/model_forms.py:1147 netbox/dcim/forms/model_forms.py:1586
|
||||
#: netbox/templates/circuits/inc/circuit_termination_fields.html:52
|
||||
#: netbox/templates/dcim/consoleport.html:76
|
||||
#: netbox/templates/dcim/consoleserverport.html:77
|
||||
@@ -4894,8 +4917,8 @@ msgstr "Port konzolového serveru"
|
||||
msgid "Front Port"
|
||||
msgstr "Přední port"
|
||||
|
||||
#: netbox/dcim/forms/model_forms.py:1148 netbox/dcim/forms/model_forms.py:1586
|
||||
#: netbox/dcim/tables/devices.py:706
|
||||
#: netbox/dcim/forms/model_forms.py:1148 netbox/dcim/forms/model_forms.py:1587
|
||||
#: netbox/dcim/tables/devices.py:707
|
||||
#: netbox/templates/circuits/inc/circuit_termination_fields.html:53
|
||||
#: netbox/templates/dcim/consoleport.html:79
|
||||
#: netbox/templates/dcim/consoleserverport.html:80
|
||||
@@ -4907,24 +4930,24 @@ msgstr "Přední port"
|
||||
msgid "Rear Port"
|
||||
msgstr "Zadní port"
|
||||
|
||||
#: netbox/dcim/forms/model_forms.py:1149 netbox/dcim/forms/model_forms.py:1587
|
||||
#: netbox/dcim/forms/model_forms.py:1149 netbox/dcim/forms/model_forms.py:1588
|
||||
#: netbox/dcim/tables/connections.py:46 netbox/dcim/tables/devices.py:512
|
||||
#: netbox/templates/dcim/poweroutlet.html:44
|
||||
#: netbox/templates/dcim/powerport.html:17
|
||||
msgid "Power Port"
|
||||
msgstr "Napájecí port"
|
||||
|
||||
#: netbox/dcim/forms/model_forms.py:1150 netbox/dcim/forms/model_forms.py:1588
|
||||
#: netbox/dcim/forms/model_forms.py:1150 netbox/dcim/forms/model_forms.py:1589
|
||||
#: netbox/templates/dcim/poweroutlet.html:17
|
||||
#: netbox/templates/dcim/powerport.html:77
|
||||
msgid "Power Outlet"
|
||||
msgstr "Napájecí zásuvka"
|
||||
|
||||
#: netbox/dcim/forms/model_forms.py:1152 netbox/dcim/forms/model_forms.py:1590
|
||||
#: netbox/dcim/forms/model_forms.py:1152 netbox/dcim/forms/model_forms.py:1591
|
||||
msgid "Component Assignment"
|
||||
msgstr "Přiřazení komponent"
|
||||
|
||||
#: netbox/dcim/forms/model_forms.py:1195 netbox/dcim/forms/model_forms.py:1637
|
||||
#: netbox/dcim/forms/model_forms.py:1195 netbox/dcim/forms/model_forms.py:1638
|
||||
msgid "An InventoryItem can only be assigned to a single component."
|
||||
msgstr "InventoryItem lze přiřadit pouze k jedné komponentě."
|
||||
|
||||
@@ -4932,11 +4955,15 @@ msgstr "InventoryItem lze přiřadit pouze k jedné komponentě."
|
||||
msgid "LAG interface"
|
||||
msgstr "Rozhraní LAG"
|
||||
|
||||
#: netbox/dcim/forms/model_forms.py:1483
|
||||
#: netbox/dcim/forms/model_forms.py:1355
|
||||
msgid "Filter VLANs available for assignment by group."
|
||||
msgstr "Filtrujte sítě VLAN dostupné pro přiřazení podle skupiny."
|
||||
|
||||
#: netbox/dcim/forms/model_forms.py:1484
|
||||
msgid "Child Device"
|
||||
msgstr "Podřazené zařízení"
|
||||
|
||||
#: netbox/dcim/forms/model_forms.py:1484
|
||||
#: netbox/dcim/forms/model_forms.py:1485
|
||||
msgid ""
|
||||
"Child devices must first be created and assigned to the site and rack of the"
|
||||
" parent device."
|
||||
@@ -4944,44 +4971,32 @@ msgstr ""
|
||||
"Podřízená zařízení musí být nejprve vytvořena a přiřazena k staveništi a "
|
||||
"stojanu nadřazeného zařízení."
|
||||
|
||||
#: netbox/dcim/forms/model_forms.py:1526
|
||||
#: netbox/dcim/forms/model_forms.py:1527
|
||||
msgid "Console port"
|
||||
msgstr "Port konzoly"
|
||||
|
||||
#: netbox/dcim/forms/model_forms.py:1534
|
||||
#: netbox/dcim/forms/model_forms.py:1535
|
||||
msgid "Console server port"
|
||||
msgstr "Port konzolového serveru"
|
||||
|
||||
#: netbox/dcim/forms/model_forms.py:1542
|
||||
#: netbox/dcim/forms/model_forms.py:1543
|
||||
msgid "Front port"
|
||||
msgstr "Přední port"
|
||||
|
||||
#: netbox/dcim/forms/model_forms.py:1558
|
||||
#: netbox/dcim/forms/model_forms.py:1559
|
||||
msgid "Power outlet"
|
||||
msgstr "Napájecí zásuvka"
|
||||
|
||||
#: netbox/dcim/forms/model_forms.py:1578
|
||||
#: netbox/dcim/forms/model_forms.py:1579
|
||||
#: netbox/templates/dcim/inventoryitem.html:17
|
||||
msgid "Inventory Item"
|
||||
msgstr "Položka inventáře"
|
||||
|
||||
#: netbox/dcim/forms/model_forms.py:1651
|
||||
#: netbox/dcim/forms/model_forms.py:1652
|
||||
#: netbox/templates/dcim/inventoryitemrole.html:15
|
||||
msgid "Inventory Item Role"
|
||||
msgstr "Role položky inventáře"
|
||||
|
||||
#: netbox/dcim/forms/model_forms.py:1669 netbox/templates/dcim/device.html:190
|
||||
#: netbox/templates/dcim/virtualdevicecontext.html:30
|
||||
#: netbox/templates/virtualization/virtualmachine.html:52
|
||||
msgid "Primary IPv4"
|
||||
msgstr "Primární IPv4"
|
||||
|
||||
#: netbox/dcim/forms/model_forms.py:1678 netbox/templates/dcim/device.html:206
|
||||
#: netbox/templates/dcim/virtualdevicecontext.html:41
|
||||
#: netbox/templates/virtualization/virtualmachine.html:68
|
||||
msgid "Primary IPv6"
|
||||
msgstr "Primární IPv6"
|
||||
|
||||
#: netbox/dcim/forms/object_create.py:48
|
||||
#: netbox/dcim/forms/object_create.py:199
|
||||
#: netbox/dcim/forms/object_create.py:355
|
||||
@@ -5039,7 +5054,7 @@ msgstr ""
|
||||
"Počet předních portů, které mají být vytvořeny ({frontport_count}), musí "
|
||||
"odpovídat zvolenému počtu pozic zadních portů ({rearport_count})."
|
||||
|
||||
#: netbox/dcim/forms/object_create.py:409 netbox/dcim/tables/devices.py:1029
|
||||
#: netbox/dcim/forms/object_create.py:409 netbox/dcim/tables/devices.py:1030
|
||||
#: netbox/ipam/tables/fhrp.py:31 netbox/templates/dcim/virtualchassis.html:53
|
||||
#: netbox/templates/dcim/virtualchassis_edit.html:47
|
||||
#: netbox/templates/ipam/fhrpgroup.html:38
|
||||
@@ -6615,7 +6630,7 @@ msgstr "Konfigurační šablona"
|
||||
msgid "Site Group"
|
||||
msgstr "Skupina stránek"
|
||||
|
||||
#: netbox/dcim/tables/devices.py:187 netbox/dcim/tables/devices.py:1064
|
||||
#: netbox/dcim/tables/devices.py:187 netbox/dcim/tables/devices.py:1065
|
||||
#: netbox/ipam/forms/bulk_import.py:503 netbox/ipam/forms/model_forms.py:306
|
||||
#: netbox/ipam/forms/model_forms.py:315 netbox/ipam/tables/ip.py:356
|
||||
#: netbox/ipam/tables/ip.py:423 netbox/ipam/tables/ip.py:446
|
||||
@@ -6624,12 +6639,12 @@ msgstr "Skupina stránek"
|
||||
msgid "IP Address"
|
||||
msgstr "IP adresa"
|
||||
|
||||
#: netbox/dcim/tables/devices.py:191 netbox/dcim/tables/devices.py:1068
|
||||
#: netbox/dcim/tables/devices.py:191 netbox/dcim/tables/devices.py:1069
|
||||
#: netbox/virtualization/tables/virtualmachines.py:86
|
||||
msgid "IPv4 Address"
|
||||
msgstr "IPv4 Adresa"
|
||||
|
||||
#: netbox/dcim/tables/devices.py:195 netbox/dcim/tables/devices.py:1072
|
||||
#: netbox/dcim/tables/devices.py:195 netbox/dcim/tables/devices.py:1073
|
||||
#: netbox/virtualization/tables/virtualmachines.py:90
|
||||
msgid "IPv6 Address"
|
||||
msgstr "Adresa IPv6"
|
||||
@@ -6667,7 +6682,7 @@ msgstr "Napájecí porty"
|
||||
msgid "Power outlets"
|
||||
msgstr "Elektrické zásuvky"
|
||||
|
||||
#: netbox/dcim/tables/devices.py:246 netbox/dcim/tables/devices.py:1077
|
||||
#: netbox/dcim/tables/devices.py:246 netbox/dcim/tables/devices.py:1078
|
||||
#: netbox/dcim/tables/devicetypes.py:129 netbox/dcim/views.py:1042
|
||||
#: netbox/dcim/views.py:1281 netbox/dcim/views.py:1977
|
||||
#: netbox/netbox/navigation/menu.py:94 netbox/netbox/navigation/menu.py:250
|
||||
@@ -6774,28 +6789,28 @@ msgstr "Pouze správa"
|
||||
msgid "VDCs"
|
||||
msgstr "VDC"
|
||||
|
||||
#: netbox/dcim/tables/devices.py:869 netbox/templates/dcim/modulebay.html:53
|
||||
#: netbox/dcim/tables/devices.py:870 netbox/templates/dcim/modulebay.html:53
|
||||
msgid "Installed Module"
|
||||
msgstr "Instalovaný modul"
|
||||
|
||||
#: netbox/dcim/tables/devices.py:872
|
||||
#: netbox/dcim/tables/devices.py:873
|
||||
msgid "Module Serial"
|
||||
msgstr "Sériový modul"
|
||||
|
||||
#: netbox/dcim/tables/devices.py:876
|
||||
#: netbox/dcim/tables/devices.py:877
|
||||
msgid "Module Asset Tag"
|
||||
msgstr "Štítek aktiv modulu"
|
||||
|
||||
#: netbox/dcim/tables/devices.py:885
|
||||
#: netbox/dcim/tables/devices.py:886
|
||||
msgid "Module Status"
|
||||
msgstr "Stav modulu"
|
||||
|
||||
#: netbox/dcim/tables/devices.py:940 netbox/dcim/tables/devicetypes.py:313
|
||||
#: netbox/dcim/tables/devices.py:941 netbox/dcim/tables/devicetypes.py:313
|
||||
#: netbox/templates/dcim/inventoryitem.html:40
|
||||
msgid "Component"
|
||||
msgstr "Komponenta"
|
||||
|
||||
#: netbox/dcim/tables/devices.py:996
|
||||
#: netbox/dcim/tables/devices.py:997
|
||||
msgid "Items"
|
||||
msgstr "Položky"
|
||||
|
||||
@@ -10362,7 +10377,7 @@ msgstr "Rozsahy musí být specifikovány ve formuláři (dolní, horní)."
|
||||
msgid "Range boundaries must be defined as integers."
|
||||
msgstr "Hranice rozsahu musí být definovány jako celá čísla."
|
||||
|
||||
#: netbox/netbox/api/serializers/fields.py:39
|
||||
#: netbox/netbox/api/serializers/fields.py:40
|
||||
#, python-brace-format
|
||||
msgid "{class_name} must implement get_view_name()"
|
||||
msgstr "{class_name} musí implementovat get_view_name ()"
|
||||
@@ -10712,32 +10727,32 @@ msgstr "Vlastní pole '{name}Musí mít jedinečnou hodnotu."
|
||||
msgid "Missing required custom field '{name}'."
|
||||
msgstr "Chybí povinné vlastní pole '{name}„."
|
||||
|
||||
#: netbox/netbox/models/features.py:467
|
||||
#: netbox/netbox/models/features.py:462
|
||||
msgid "Remote data source"
|
||||
msgstr "Vzdálený zdroj dat"
|
||||
|
||||
#: netbox/netbox/models/features.py:477
|
||||
#: netbox/netbox/models/features.py:472
|
||||
msgid "data path"
|
||||
msgstr "datová cesta"
|
||||
|
||||
#: netbox/netbox/models/features.py:481
|
||||
#: netbox/netbox/models/features.py:476
|
||||
msgid "Path to remote file (relative to data source root)"
|
||||
msgstr "Cesta ke vzdálenému souboru (vzhledem k kořenovému zdroji dat)"
|
||||
|
||||
#: netbox/netbox/models/features.py:484
|
||||
#: netbox/netbox/models/features.py:479
|
||||
msgid "auto sync enabled"
|
||||
msgstr "automatická synchronizace povolena"
|
||||
|
||||
#: netbox/netbox/models/features.py:486
|
||||
#: netbox/netbox/models/features.py:481
|
||||
msgid "Enable automatic synchronization of data when the data file is updated"
|
||||
msgstr ""
|
||||
"Povolit automatickou synchronizaci dat při aktualizaci datového souboru"
|
||||
|
||||
#: netbox/netbox/models/features.py:489
|
||||
#: netbox/netbox/models/features.py:484
|
||||
msgid "date synced"
|
||||
msgstr "datum synchronizováno"
|
||||
|
||||
#: netbox/netbox/models/features.py:583
|
||||
#: netbox/netbox/models/features.py:578
|
||||
#, python-brace-format
|
||||
msgid "{class_name} must implement a sync_data() method."
|
||||
msgstr "{class_name} musí implementovat metodu sync_data ()."
|
||||
@@ -12472,7 +12487,7 @@ msgid "Parent Bay"
|
||||
msgstr "Mateřská zátoka"
|
||||
|
||||
#: netbox/templates/dcim/device_edit.html:48
|
||||
#: netbox/utilities/templates/form_helpers/render_field.html:20
|
||||
#: netbox/utilities/templates/form_helpers/render_field.html:22
|
||||
msgid "Regenerate Slug"
|
||||
msgstr "Regenerujte slimáka"
|
||||
|
||||
@@ -12817,17 +12832,17 @@ msgstr "Maximální hmotnost"
|
||||
msgid "Total Weight"
|
||||
msgstr "Celková hmotnost"
|
||||
|
||||
#: netbox/templates/dcim/rack.html:121
|
||||
#: netbox/templates/dcim/rack.html:125
|
||||
#: netbox/templates/dcim/rack_elevation_list.html:15
|
||||
msgid "Images and Labels"
|
||||
msgstr "Obrázky a štítky"
|
||||
|
||||
#: netbox/templates/dcim/rack.html:122
|
||||
#: netbox/templates/dcim/rack.html:126
|
||||
#: netbox/templates/dcim/rack_elevation_list.html:16
|
||||
msgid "Images only"
|
||||
msgstr "Pouze obrázky"
|
||||
|
||||
#: netbox/templates/dcim/rack.html:123
|
||||
#: netbox/templates/dcim/rack.html:127
|
||||
#: netbox/templates/dcim/rack_elevation_list.html:17
|
||||
msgid "Labels only"
|
||||
msgstr "Pouze štítky"
|
||||
@@ -15099,15 +15114,15 @@ msgstr "Odhlásit"
|
||||
msgid "Subscribe"
|
||||
msgstr "Přihlásit"
|
||||
|
||||
#: netbox/utilities/templates/form_helpers/render_field.html:39
|
||||
#: netbox/utilities/templates/form_helpers/render_field.html:41
|
||||
msgid "Copy to clipboard"
|
||||
msgstr "Kopírovat do schránky"
|
||||
|
||||
#: netbox/utilities/templates/form_helpers/render_field.html:55
|
||||
#: netbox/utilities/templates/form_helpers/render_field.html:57
|
||||
msgid "This field is required"
|
||||
msgstr "Toto pole je povinné"
|
||||
|
||||
#: netbox/utilities/templates/form_helpers/render_field.html:68
|
||||
#: netbox/utilities/templates/form_helpers/render_field.html:70
|
||||
msgid "Set Null"
|
||||
msgstr "Nastavit Null"
|
||||
|
||||
|
||||
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user