Compare commits

...

51 Commits

Author SHA1 Message Date
Jeremy Stretch
6ea0c0c3e9 Merge pull request #17658 from netbox-community/develop
Release v4.1.3
2024-10-02 10:10:06 -04:00
Jeremy Stretch
6a6154f02f Release v4.1.3 2024-10-02 14:41:09 +01:00
Jeremy Stretch
5b2f2e1da6 Remove old logos 2024-10-02 14:16:39 +01:00
github-actions
23f94839ad Update source translation strings 2024-10-02 05:01:57 +00:00
Arthur Hanson
92d8aa583a Add support for socks connection to Git backend (#17640)
* Add support for socks connection to Git backend

* cleanup socks detection

* add documentation for installing python_socks

* dont need lower()

* cleanup

* refactor Socks to utilities

* fix imports

* fix missing comma

* Update docs/features/synchronized-data.md

Co-authored-by: Jeremy Stretch <jstretch@netboxlabs.com>

* review feedback

* Update docs/features/synchronized-data.md

Co-authored-by: Jeremy Stretch <jstretch@netboxlabs.com>

* review changes

---------

Co-authored-by: Jeremy Stretch <jstretch@netboxlabs.com>
2024-10-01 12:11:44 -04:00
github-actions
d9028f9202 Update source translation strings 2024-10-01 05:02:14 +00:00
Jeremy Stretch
976f9310f9 Changelog for #17558 2024-09-30 14:59:39 -04:00
Arthur Hanson
a9fee5cd32 17558 raise validation error if removing used choice from ChoiceSet (#17591)
* 17558 raise validation error if removing choice from choiceset that is currently used

* 17558 raise validation error if removing choice from choiceset that is currently used

* 17558 raise validation error if removing choice from choiceset that is currently used

* 17558 add tests

* 17558 add tests

* Tightened up choice evaluation logic a bit; cleaned up test

---------

Co-authored-by: Jeremy Stretch <jstretch@netboxlabs.com>
2024-09-30 13:17:01 -04:00
DM3740
5013a6c692 Fixes: #17612 : Update ASN types in asn.md (#17625)
* Update asn.md

There are no 64-bit AS Numbers - 16- and 32-bit only :
https://www.iana.org/assignments/as-numbers/as-numbers.xhtml

* Update docs/models/ipam/asn.md

Co-authored-by: bluikko <14869000+bluikko@users.noreply.github.com>

---------

Co-authored-by: bluikko <14869000+bluikko@users.noreply.github.com>
2024-09-27 16:20:49 -04:00
github-actions
8624734610 Update source translation strings 2024-09-27 05:01:59 +00:00
Jeremy Stretch
ead6e637f4 Merge pull request #17626 from netbox-community/develop
Release v4.1.2
2024-09-26 16:31:22 -04:00
Jeremy Stretch
b4e181c015 Release v4.1.2 2024-09-26 16:13:57 -04:00
transifex-integration[bot]
2a8b11de8e Updates for project NetBox (#17624)
* Translate django.po in fr

100% translated source file: 'django.po'
on 'fr'.

* Translate django.po in it

100% translated source file: 'django.po'
on 'it'.

* Translate django.po in ru

100% translated source file: 'django.po'
on 'ru'.

* Translate django.po in de

100% translated source file: 'django.po'
on 'de'.

* Translate django.po in uk

100% translated source file: 'django.po'
on 'uk'.

* Translate django.po in nl

100% translated source file: 'django.po'
on 'nl'.

* Translate django.po in ja

100% translated source file: 'django.po'
on 'ja'.

* Translate django.po in pl

100% translated source file: 'django.po'
on 'pl'.

* Translate django.po in tr

100% translated source file: 'django.po'
on 'tr'.

* Translate django.po in cs

100% translated source file: 'django.po'
on 'cs'.

* Translate django.po in zh

100% translated source file: 'django.po'
on 'zh'.

* Translate django.po in da

100% translated source file: 'django.po'
on 'da'.

* Translate django.po in pt

100% translated source file: 'django.po'
on 'pt'.

* Translate django.po in es

100% translated source file: 'django.po'
on 'es'.

---------

Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com>
2024-09-26 16:08:01 -04:00
Costas Drogos
dee8e6f733 Fixes: #17611: Fix a ValidationError message 2024-09-26 16:04:17 -04:00
bctiemann
e93719e4f9 Fixes: #17360 - Ensure model is defined when rendering bulk_edit_button (#17535)
* Ensure model is defined when rendering bulk_edit_button

* Move model check to inner conditional

* Set model in context

* Return child_model instead of model for use in bulk_edit_button
2024-09-26 15:36:42 -04:00
bctiemann
52a0b454c0 Fixes: #17497 - Handle invalid accessor fields in bulk import forms (#17594)
* Add handling for FieldError to CSVModelChoiceField.to_python to handle invalid accessor field

* manufacturer & default_platform should be CSVModelChoiceFields

* Fix string translation

---------

Co-authored-by: Jeremy Stretch <jstretch@netboxlabs.com>
2024-09-26 15:31:07 -04:00
Arthur Hanson
0ec632e548 17419 fix MPTT issue with migrations for nested module bays (#17553)
* 17419 rebuild module bay tree on upgrade

* 17419 rebuild module bay tree on upgrade

* 17419 use get_model
2024-09-26 15:24:32 -04:00
Brian Tiemann
cc6f21ded2 Change manufacturer to a CSVModelChoiceField in DeviceTypeImportForm 2024-09-26 15:17:28 -04:00
Jeremy Stretch
b4dd71d578 Fixes #17511: Restore consistent font support for non-Latin characters 2024-09-26 14:59:10 -04:00
Arthur Hanson
9bccc11c28 17604 fix cluster disk space display 2024-09-26 14:58:00 -04:00
Alexander Haase
5485b04bcd Add interface type SFP (100 Base-FX) 2024-09-26 14:55:08 -04:00
Alexander Haase
68bd37a08f Add return URL to available IPs table link
As with other buttons to create objects, the 'x IPs available' button
in tables now returns to this URL after the IP address has been created.
2024-09-26 14:51:11 -04:00
Jeremy Stretch
85396866bc Fixes #17601: Record change to terminating object when disconnecting a cable 2024-09-25 10:20:31 -04:00
github-actions
50df0a1073 Update source translation strings 2024-09-25 05:02:13 +00:00
Jeremy Stretch
01db481bc3 Update changelog 2024-09-24 17:14:02 -04:00
bctiemann
cfb5696d29 Fixes: #17126 - Respect the weight unit of the DeviceType when displaying the Device detail (#17579)
* Respect the weight unit of the DeviceType when displaying the Device details

* Reuse the same weight formatting construct as in rack.html, and add placeholder in rack if empty
2024-09-24 16:53:39 -04:00
Arthur Hanson
8420af8562 17569 Add help text to VLAN Group that is not saved on the interface (#17578)
* 17569 Add help text to VLAN Group that is not saved on the interface

* 17569 review changes
2024-09-24 16:49:41 -04:00
iamk3
b7df06ae7f create 802.15.4 interface type 2024-09-24 10:18:19 -04:00
Arthur Hanson
88abb6902d 17537 add name field to ASN Range Search 2024-09-24 10:05:04 -04:00
bctiemann
116a423d8f Closes: #16837 - Fix type__empty filter in character-based filters (#17574)
* Fix type__empty filter in character-based filters

* Add tests
2024-09-24 10:02:49 -04:00
Arthur Hanson
9c9c4fbd6e 17501 fix showing last run of script execution in list view (#17581)
* 17501 fix showing last run of script job execution in list view

* 17501 fix showing last run of script job execution in list view
2024-09-24 09:45:38 -04:00
Arthur Hanson
896b5b9b74 17555 fix interface filter on device for hide-disconnected 2024-09-24 09:31:52 -04:00
Jeremy Stretch
dd0774d8d4 Update changelog 2024-09-24 09:23:14 -04:00
Jeremy Stretch
b46a89640f Closes #17577: Reference ModelState when determining whether an object is being created 2024-09-24 09:14:07 -04:00
github-actions
6b219a279b Update source translation strings 2024-09-20 05:02:25 +00:00
bctiemann
2dd5c82845 Fixes: #15408 - Add primary_ip4 and primary_ip6 to bulk import form for VDC (#17509)
* Add primary_ip4 and primary_ip6 to bulk import form for VDC

* Specify IPAddress querysets with address field accessor and labels

* Filter primary_ip4/ip6 querysets to only those IPs available on the device

* Fix comment

* Make ipv6 help text more correct

* Shorten IPv6 example

---------

Co-authored-by: Jeremy Stretch <jstretch@netboxlabs.com>
2024-09-19 13:51:24 -04:00
Arthur Hanson
f4d4483050 17517 fix cable creation when switching device type 2024-09-19 13:24:49 -04:00
bctiemann
8deaaae44b Fixes: #17083 - Wrap labels in a div to reduce inadvertently clickable area to their left in forms (#17525)
* Wrap labels in a div to reduce inadvertently clickable area to their left in forms

* Set form label to be inline-block
2024-09-19 13:07:36 -04:00
Arthur Hanson
6d0a3485a1 17522 enable localization of user preference form 2024-09-19 10:11:56 -04:00
Arthur Hanson
8e6a15a25e 14201 allow searching for ASN with prefix AS 2024-09-19 10:08:54 -04:00
Arthur Hanson
44c7786cd9 17521 fix error message toast color in dark mode 2024-09-19 10:04:04 -04:00
github-actions
f7dd09da08 Update source translation strings 2024-09-18 05:02:30 +00:00
Jeremy Stretch
3000407a5f Closes #16669: Include a notice when rendering docs locally 2024-09-17 14:44:51 -04:00
Jeremy Stretch
7167f20ca5 Increase stale PR timer from 15 to 30 days 2024-09-17 09:29:59 -04:00
Jonathan Senecal
c79c664e96 Update choices.py to add C39 Type outlets
(cherry picked from commit e92d0ec2e642b00506a64c1333e95cea8a36feae)
2024-09-17 09:28:21 -04:00
Arthur Hanson
f5d6f5d997 17406 allow deletion of plugin custom field if plugin removed 2024-09-17 09:26:33 -04:00
Arthur Hanson
48ca5d4d7e 17406 allow deletion of plugin custom field if plugin removed 2024-09-17 09:26:33 -04:00
Daniel Sheppard
893adef79c Fixes: #17492 - Change methods on NetBox*HyperlinkedIdentityField to use get_viewname 2024-09-17 09:21:18 -04:00
Jeremy Stretch
bdf182ffd6 Increase operations limit for stale action 2024-09-16 11:49:15 -04:00
Jeremy Stretch
65f81ab81d Closes #17482: Ignore Branch & StagedChange in nbshell 2024-09-16 09:10:21 -04:00
Jeremy Stretch
fa1e89d3d2 Closes #17477: Upgrade tabler to 1.0.0-beta21 2024-09-16 08:45:44 -04:00
129 changed files with 3485 additions and 2871 deletions

View File

@@ -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

View File

@@ -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

View File

@@ -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'

View File

@@ -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!

View File

@@ -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
View 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 %}

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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(

View File

@@ -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:

View File

@@ -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)'),
)
),

View File

@@ -51,6 +51,7 @@ WIRELESS_IFACE_TYPES = [
InterfaceTypeChoices.TYPE_80211AY,
InterfaceTypeChoices.TYPE_80211BE,
InterfaceTypeChoices.TYPE_802151,
InterfaceTypeChoices.TYPE_802154,
InterfaceTypeChoices.TYPE_OTHER_WIRELESS,
]

View File

@@ -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)

View File

@@ -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(),

View 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
),
]

View File

@@ -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)

View File

@@ -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.")
})

View File

@@ -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({

View File

@@ -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

View File

@@ -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(

View File

@@ -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"
}

View File

@@ -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]}

View File

@@ -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:

View File

@@ -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

View File

@@ -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

View File

@@ -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}'

View File

@@ -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')

View File

@@ -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 %}

View File

@@ -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)

View File

@@ -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

View File

@@ -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)
})

View File

@@ -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):

View File

@@ -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

View File

@@ -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,

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -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": {

View File

@@ -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;

View File

@@ -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");

View File

@@ -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>

View File

@@ -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"

View File

@@ -1,3 +1,3 @@
version: "4.1.1"
version: "4.1.3"
edition: "Community"
published: "2024-09-12"
published: "2024-10-02"

View File

@@ -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 %}

View File

@@ -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>

View File

@@ -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 %}

View File

@@ -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>

View File

@@ -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 %}

View File

@@ -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"

File diff suppressed because it is too large Load Diff

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