mirror of
https://github.com/netbox-community/netbox.git
synced 2025-07-27 10:58:37 -06:00
Merge branch 'main' into fix-openapi-request-pk
This commit is contained in:
commit
43d21e3411
@ -15,7 +15,7 @@ body:
|
||||
attributes:
|
||||
label: NetBox version
|
||||
description: What version of NetBox are you currently running?
|
||||
placeholder: v4.2.3
|
||||
placeholder: v4.2.4
|
||||
validations:
|
||||
required: true
|
||||
- type: dropdown
|
||||
|
2
.github/ISSUE_TEMPLATE/02-bug_report.yaml
vendored
2
.github/ISSUE_TEMPLATE/02-bug_report.yaml
vendored
@ -27,7 +27,7 @@ body:
|
||||
attributes:
|
||||
label: NetBox Version
|
||||
description: What version of NetBox are you currently running?
|
||||
placeholder: v4.2.3
|
||||
placeholder: v4.2.4
|
||||
validations:
|
||||
required: true
|
||||
- type: dropdown
|
||||
|
@ -1,7 +1,7 @@
|
||||
[main]
|
||||
host = https://app.transifex.com
|
||||
|
||||
[o:netbox-community:p:netbox:r:9cbf4fcf95b3d92e4ebbf1a5e5d1caee]
|
||||
[o:netbox-community:p:netbox:r:034999968a7366ba27a8bdf1ab63bf42]
|
||||
file_filter = netbox/translations/<lang>/LC_MESSAGES/django.po
|
||||
source_file = netbox/translations/en/LC_MESSAGES/django.po
|
||||
type = PO
|
||||
|
@ -308,6 +308,7 @@ A particular object within NetBox. Each ObjectVar must specify a particular mode
|
||||
* `query_params` - A dictionary of query parameters to use when retrieving available options (optional)
|
||||
* `context` - A custom dictionary mapping template context variables to fields, used when rendering `<option>` elements within the dropdown menu (optional; see below)
|
||||
* `null_option` - A label representing a "null" or empty choice (optional)
|
||||
* `selector` - A boolean that, when True, includes an advanced object selection widget to assist the user in identifying the desired object (optional; False by default)
|
||||
|
||||
To limit the selections available within the list, additional query parameters can be passed as the `query_params` dictionary. For example, to show only devices with an "active" status:
|
||||
|
||||
|
@ -2,7 +2,7 @@
|
||||
|
||||
## What is a REST API?
|
||||
|
||||
REST stands for [representational state transfer](https://en.wikipedia.org/wiki/Representational_state_transfer). It's a particular type of API which employs HTTP requests and [JavaScript Object Notation (JSON)](https://www.json.org/) to facilitate create, retrieve, update, and delete (CRUD) operations on objects within an application. Each type of operation is associated with a particular HTTP verb:
|
||||
REST stands for [representational state transfer](https://en.wikipedia.org/wiki/REST). It's a particular type of API which employs HTTP requests and [JavaScript Object Notation (JSON)](https://www.json.org/) to facilitate create, retrieve, update, and delete (CRUD) operations on objects within an application. Each type of operation is associated with a particular HTTP verb:
|
||||
|
||||
* `GET`: Retrieve an object or list of objects
|
||||
* `POST`: Create an object
|
||||
|
@ -1,5 +1,32 @@
|
||||
# NetBox v4.2
|
||||
|
||||
## v4.2.4 (2025-02-21)
|
||||
|
||||
### Enhancements
|
||||
|
||||
* [#17309](https://github.com/netbox-community/netbox/issues/17309) - Omit empty counts in related object tables
|
||||
* [#18277](https://github.com/netbox-community/netbox/issues/18277) - Improve multi-table inheritance in serialization of change-logged models
|
||||
* [#18286](https://github.com/netbox-community/netbox/issues/18286) - Add more job duration choices
|
||||
* [#18357](https://github.com/netbox-community/netbox/issues/18357) - Display author name in plugin list for locally installed plugins
|
||||
* [#18408](https://github.com/netbox-community/netbox/issues/18408) - Add Paused status for virtual machines
|
||||
* [#18584](https://github.com/netbox-community/netbox/issues/18584) - Add rack type column to manufacturer list
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* [#17436](https://github.com/netbox-community/netbox/issues/17436) - Fix {module} replacement in module bays
|
||||
* [#18013](https://github.com/netbox-community/netbox/issues/18013) - Limit object type to selected object in change log filter
|
||||
* [#18241](https://github.com/netbox-community/netbox/issues/18241) - Default logging level of custom scripts changed to INFO
|
||||
* [#18247](https://github.com/netbox-community/netbox/issues/18247) - Fix visibility of disabled cable paths in dark mode
|
||||
* [#18480](https://github.com/netbox-community/netbox/issues/18480) - Clean data passed to script in runscript command
|
||||
* [#18555](https://github.com/netbox-community/netbox/issues/18555) - Add default get_absolute_url method to plugin models
|
||||
* [#18585](https://github.com/netbox-community/netbox/issues/18585) - Fix filtering circuits by location
|
||||
* [#18593](https://github.com/netbox-community/netbox/issues/18593) - Fix "Create & Add Another" IP Address workflow
|
||||
* [#18594](https://github.com/netbox-community/netbox/issues/18594) - Enable sorting by ASN count on site and provider lists
|
||||
* [#18619](https://github.com/netbox-community/netbox/issues/18619) - Ensure shift-click selection selects only visible list items
|
||||
* [#18674](https://github.com/netbox-community/netbox/issues/18674) - Preserve form values when selecting speed on circuit termination
|
||||
|
||||
---
|
||||
|
||||
## v4.2.3 (2025-02-04)
|
||||
|
||||
### Enhancements
|
||||
|
@ -349,9 +349,8 @@ class CircuitTermination(
|
||||
def clean(self):
|
||||
super().clean()
|
||||
|
||||
# Must define either site *or* provider network
|
||||
if self.termination is None:
|
||||
raise ValidationError(_("A circuit termination must attach to termination."))
|
||||
raise ValidationError(_("A circuit termination must attach to a terminating object."))
|
||||
|
||||
def save(self, *args, **kwargs):
|
||||
# Cache objects associated with the terminating object (for filtering)
|
||||
|
@ -23,7 +23,6 @@ class ProviderTable(ContactsColumnMixin, NetBoxTable):
|
||||
verbose_name=_('Accounts')
|
||||
)
|
||||
account_count = columns.LinkedCountColumn(
|
||||
accessor=tables.A('accounts__count'),
|
||||
viewname='circuits:provideraccount_list',
|
||||
url_params={'provider_id': 'pk'},
|
||||
verbose_name=_('Account Count')
|
||||
@ -33,7 +32,6 @@ class ProviderTable(ContactsColumnMixin, NetBoxTable):
|
||||
verbose_name=_('ASNs')
|
||||
)
|
||||
asn_count = columns.LinkedCountColumn(
|
||||
accessor=tables.A('asns__count'),
|
||||
viewname='ipam:asn_list',
|
||||
url_params={'provider_id': 'pk'},
|
||||
verbose_name=_('ASN Count')
|
||||
|
@ -4,6 +4,7 @@ from django.shortcuts import get_object_or_404, redirect, render
|
||||
from django.utils.translation import gettext_lazy as _
|
||||
|
||||
from dcim.views import PathTraceView
|
||||
from ipam.models import ASN
|
||||
from netbox.views import generic
|
||||
from tenancy.views import ObjectContactsView
|
||||
from utilities.forms import ConfirmationForm
|
||||
@ -20,7 +21,9 @@ from .models import *
|
||||
@register_model_view(Provider, 'list', path='', detail=False)
|
||||
class ProviderListView(generic.ObjectListView):
|
||||
queryset = Provider.objects.annotate(
|
||||
count_circuits=count_related(Circuit, 'provider')
|
||||
count_circuits=count_related(Circuit, 'provider'),
|
||||
asn_count=count_related(ASN, 'providers'),
|
||||
account_count=count_related(ProviderAccount, 'provider'),
|
||||
)
|
||||
filterset = filtersets.ProviderFilterSet
|
||||
filterset_form = forms.ProviderFilterForm
|
||||
|
@ -2,12 +2,13 @@ import re
|
||||
import typing
|
||||
from collections import OrderedDict
|
||||
|
||||
from drf_spectacular.extensions import OpenApiSerializerFieldExtension
|
||||
from drf_spectacular.extensions import OpenApiSerializerFieldExtension, OpenApiSerializerExtension, _SchemaType
|
||||
from drf_spectacular.openapi import AutoSchema
|
||||
from drf_spectacular.plumbing import (
|
||||
build_basic_type, build_choice_field, build_media_type_object, build_object_type, get_doc,
|
||||
)
|
||||
from drf_spectacular.types import OpenApiTypes
|
||||
from drf_spectacular.utils import Direction
|
||||
|
||||
from netbox.api.fields import ChoiceField
|
||||
from netbox.api.serializers import WritableNestedSerializer
|
||||
@ -279,6 +280,23 @@ class FixSerializedPKRelatedField(OpenApiSerializerFieldExtension):
|
||||
return build_basic_type(OpenApiTypes.INT)
|
||||
|
||||
|
||||
class FixIntegerRangeSerializerSchema(OpenApiSerializerExtension):
|
||||
target_class = 'netbox.api.fields.IntegerRangeSerializer'
|
||||
|
||||
def map_serializer(self, auto_schema: 'AutoSchema', direction: Direction) -> _SchemaType:
|
||||
return {
|
||||
'type': 'array',
|
||||
'items': {
|
||||
'type': 'array',
|
||||
'items': {
|
||||
'type': 'integer',
|
||||
},
|
||||
'minItems': 2,
|
||||
'maxItems': 2,
|
||||
},
|
||||
}
|
||||
|
||||
|
||||
# Nested models can be passed by ID in requests
|
||||
# The logic for this is handled in `BaseModelSerializer.to_internal_value`
|
||||
class FixWritableNestedSerializerAllowPK(OpenApiSerializerFieldExtension):
|
||||
|
@ -165,7 +165,7 @@ class DataFileBulkDeleteView(generic.BulkDeleteView):
|
||||
|
||||
@register_model_view(Job, 'list', path='', detail=False)
|
||||
class JobListView(generic.ObjectListView):
|
||||
queryset = Job.objects.all()
|
||||
queryset = Job.objects.defer('data')
|
||||
filterset = filtersets.JobFilterSet
|
||||
filterset_form = forms.JobFilterForm
|
||||
table = tables.JobTable
|
||||
@ -182,12 +182,12 @@ class JobView(generic.ObjectView):
|
||||
|
||||
@register_model_view(Job, 'delete')
|
||||
class JobDeleteView(generic.ObjectDeleteView):
|
||||
queryset = Job.objects.all()
|
||||
queryset = Job.objects.defer('data')
|
||||
|
||||
|
||||
@register_model_view(Job, 'bulk_delete', path='delete', detail=False)
|
||||
class JobBulkDeleteView(generic.BulkDeleteView):
|
||||
queryset = Job.objects.all()
|
||||
queryset = Job.objects.defer('data')
|
||||
filterset = filtersets.JobFilterSet
|
||||
table = tables.JobTable
|
||||
|
||||
|
@ -1,3 +1,4 @@
|
||||
from django.utils.translation import gettext as _
|
||||
from django.contrib.contenttypes.models import ContentType
|
||||
from drf_spectacular.utils import extend_schema_field
|
||||
from rest_framework import serializers
|
||||
@ -232,8 +233,56 @@ class InterfaceSerializer(NetBoxModelSerializer, CabledObjectSerializer, Connect
|
||||
|
||||
def validate(self, data):
|
||||
|
||||
# Validate many-to-many VLAN assignments
|
||||
if not self.nested:
|
||||
|
||||
# Validate 802.1q mode and vlan(s)
|
||||
mode = None
|
||||
tagged_vlans = []
|
||||
|
||||
# Gather Information
|
||||
if self.instance:
|
||||
mode = data.get('mode') if 'mode' in data.keys() else self.instance.mode
|
||||
untagged_vlan = data.get('untagged_vlan') if 'untagged_vlan' in data.keys() else \
|
||||
self.instance.untagged_vlan
|
||||
qinq_svlan = data.get('qinq_svlan') if 'qinq_svlan' in data.keys() else \
|
||||
self.instance.qinq_svlan
|
||||
tagged_vlans = data.get('tagged_vlans') if 'tagged_vlans' in data.keys() else \
|
||||
self.instance.tagged_vlans.all()
|
||||
else:
|
||||
mode = data.get('mode', None)
|
||||
untagged_vlan = data.get('untagged_vlan') if 'untagged_vlan' in data.keys() else None
|
||||
qinq_svlan = data.get('qinq_svlan') if 'qinq_svlan' in data.keys() else None
|
||||
tagged_vlans = data.get('tagged_vlans') if 'tagged_vlans' in data.keys() else None
|
||||
|
||||
errors = {}
|
||||
|
||||
# Non Q-in-Q mode with service vlan set
|
||||
if mode != InterfaceModeChoices.MODE_Q_IN_Q and qinq_svlan:
|
||||
errors.update({
|
||||
'qinq_svlan': _("Interface mode does not support q-in-q service vlan")
|
||||
})
|
||||
# Routed mode
|
||||
if not mode:
|
||||
# Untagged vlan
|
||||
if untagged_vlan:
|
||||
errors.update({
|
||||
'untagged_vlan': _("Interface mode does not support untagged vlan")
|
||||
})
|
||||
# Tagged vlan
|
||||
if tagged_vlans:
|
||||
errors.update({
|
||||
'tagged_vlans': _("Interface mode does not support tagged vlans")
|
||||
})
|
||||
# Non-tagged mode
|
||||
elif mode in (InterfaceModeChoices.MODE_TAGGED_ALL, InterfaceModeChoices.MODE_ACCESS) and tagged_vlans:
|
||||
errors.update({
|
||||
'tagged_vlans': _("Interface mode does not support tagged vlans")
|
||||
})
|
||||
|
||||
if errors:
|
||||
raise serializers.ValidationError(errors)
|
||||
|
||||
# Validate many-to-many VLAN assignments
|
||||
device = self.instance.device if self.instance else data.get('device')
|
||||
for vlan in data.get('tagged_vlans', []):
|
||||
if vlan.site not in [device.site, None]:
|
||||
|
2
netbox/dcim/exceptions.py
Normal file
2
netbox/dcim/exceptions.py
Normal file
@ -0,0 +1,2 @@
|
||||
class UnsupportedCablePath(Exception):
|
||||
pass
|
@ -1193,6 +1193,7 @@ class DeviceFilterSet(
|
||||
return queryset
|
||||
return queryset.filter(
|
||||
Q(name__icontains=value) |
|
||||
Q(virtual_chassis__name__icontains=value) |
|
||||
Q(serial__icontains=value.strip()) |
|
||||
Q(inventoryitems__serial__icontains=value.strip()) |
|
||||
Q(asset_tag__icontains=value.strip()) |
|
||||
|
@ -1411,7 +1411,7 @@ class InterfaceBulkEditForm(
|
||||
form_from_model(Interface, [
|
||||
'label', 'type', 'parent', 'bridge', 'lag', 'speed', 'duplex', 'wwn', 'mtu', 'mgmt_only', 'mark_connected',
|
||||
'description', 'mode', 'rf_role', 'rf_channel', 'rf_channel_frequency', 'rf_channel_width', 'tx_power',
|
||||
'wireless_lans'
|
||||
'wireless_lans', 'vlan_translation_policy'
|
||||
])
|
||||
):
|
||||
enabled = forms.NullBooleanField(
|
||||
@ -1564,7 +1564,9 @@ class InterfaceBulkEditForm(
|
||||
FieldSet('vdcs', 'mtu', 'tx_power', 'enabled', 'mgmt_only', 'mark_connected', name=_('Operation')),
|
||||
FieldSet('poe_mode', 'poe_type', name=_('PoE')),
|
||||
FieldSet('parent', 'bridge', 'lag', name=_('Related Interfaces')),
|
||||
FieldSet('mode', 'vlan_group', 'untagged_vlan', 'qinq_svlan', name=_('802.1Q Switching')),
|
||||
FieldSet(
|
||||
'mode', 'vlan_group', 'untagged_vlan', 'qinq_svlan', 'vlan_translation_policy', name=_('802.1Q Switching')
|
||||
),
|
||||
FieldSet(
|
||||
TabbedGroups(
|
||||
FieldSet('tagged_vlans', name=_('Assignment')),
|
||||
@ -1579,7 +1581,7 @@ class InterfaceBulkEditForm(
|
||||
nullable_fields = (
|
||||
'module', 'label', 'parent', 'bridge', 'lag', 'speed', 'duplex', 'wwn', 'vdcs', 'mtu', 'description',
|
||||
'poe_mode', 'poe_type', 'mode', 'rf_channel', 'rf_channel_frequency', 'rf_channel_width', 'tx_power',
|
||||
'untagged_vlan', 'tagged_vlans', 'qinq_svlan', 'vrf', 'wireless_lans'
|
||||
'untagged_vlan', 'tagged_vlans', 'qinq_svlan', 'vrf', 'wireless_lans', 'vlan_translation_policy',
|
||||
)
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
|
@ -43,20 +43,14 @@ class InterfaceCommonForm(forms.Form):
|
||||
super().clean()
|
||||
|
||||
parent_field = 'device' if 'device' in self.cleaned_data else 'virtual_machine'
|
||||
tagged_vlans = self.cleaned_data.get('tagged_vlans')
|
||||
|
||||
# Untagged interfaces cannot be assigned tagged VLANs
|
||||
if self.cleaned_data['mode'] == InterfaceModeChoices.MODE_ACCESS and tagged_vlans:
|
||||
raise forms.ValidationError({
|
||||
'mode': _("An access interface cannot have tagged VLANs assigned.")
|
||||
})
|
||||
|
||||
# Remove all tagged VLAN assignments from "tagged all" interfaces
|
||||
elif self.cleaned_data['mode'] == InterfaceModeChoices.MODE_TAGGED_ALL:
|
||||
self.cleaned_data['tagged_vlans'] = []
|
||||
if 'tagged_vlans' in self.fields.keys():
|
||||
tagged_vlans = self.cleaned_data.get('tagged_vlans') if self.is_bound else \
|
||||
self.get_initial_for_field(self.fields['tagged_vlans'], 'tagged_vlans')
|
||||
else:
|
||||
tagged_vlans = []
|
||||
|
||||
# Validate tagged VLANs; must be a global VLAN or in the same site
|
||||
elif self.cleaned_data['mode'] == InterfaceModeChoices.MODE_TAGGED and tagged_vlans:
|
||||
if self.cleaned_data['mode'] == InterfaceModeChoices.MODE_TAGGED and tagged_vlans:
|
||||
valid_sites = [None, self.cleaned_data[parent_field].site]
|
||||
invalid_vlans = [str(v) for v in tagged_vlans if v.site not in valid_sites]
|
||||
|
||||
|
@ -15,6 +15,7 @@ from dcim.fields import PathField
|
||||
from dcim.utils import decompile_path_node, object_to_path_node
|
||||
from netbox.models import ChangeLoggedModel, PrimaryModel
|
||||
from utilities.conversion import to_meters
|
||||
from utilities.exceptions import AbortRequest
|
||||
from utilities.fields import ColorField
|
||||
from utilities.querysets import RestrictedQuerySet
|
||||
from wireless.models import WirelessLink
|
||||
@ -26,6 +27,7 @@ __all__ = (
|
||||
'CableTermination',
|
||||
)
|
||||
|
||||
from ..exceptions import UnsupportedCablePath
|
||||
|
||||
trace_paths = Signal()
|
||||
|
||||
@ -236,8 +238,10 @@ class Cable(PrimaryModel):
|
||||
for termination in self.b_terminations:
|
||||
if not termination.pk or termination not in b_terminations:
|
||||
CableTermination(cable=self, cable_end='B', termination=termination).save()
|
||||
|
||||
trace_paths.send(Cable, instance=self, created=_created)
|
||||
try:
|
||||
trace_paths.send(Cable, instance=self, created=_created)
|
||||
except UnsupportedCablePath as e:
|
||||
raise AbortRequest(e)
|
||||
|
||||
def get_status_color(self):
|
||||
return LinkStatusChoices.colors.get(self.status)
|
||||
@ -531,8 +535,8 @@ class CablePath(models.Model):
|
||||
return None
|
||||
|
||||
# Ensure all originating terminations are attached to the same link
|
||||
if len(terminations) > 1:
|
||||
assert all(t.link == terminations[0].link for t in terminations[1:])
|
||||
if len(terminations) > 1 and not all(t.link == terminations[0].link for t in terminations[1:]):
|
||||
raise UnsupportedCablePath(_("All originating terminations must be attached to the same link"))
|
||||
|
||||
path = []
|
||||
position_stack = []
|
||||
@ -543,12 +547,13 @@ class CablePath(models.Model):
|
||||
while terminations:
|
||||
|
||||
# Terminations must all be of the same type
|
||||
assert all(isinstance(t, type(terminations[0])) for t in terminations[1:])
|
||||
if not all(isinstance(t, type(terminations[0])) for t in terminations[1:]):
|
||||
raise UnsupportedCablePath(_("All mid-span terminations must have the same termination type"))
|
||||
|
||||
# All mid-span terminations must all be attached to the same device
|
||||
if not isinstance(terminations[0], PathEndpoint):
|
||||
assert all(isinstance(t, type(terminations[0])) for t in terminations[1:])
|
||||
assert all(t.parent_object == terminations[0].parent_object for t in terminations[1:])
|
||||
if (not isinstance(terminations[0], PathEndpoint) and not
|
||||
all(t.parent_object == terminations[0].parent_object for t in terminations[1:])):
|
||||
raise UnsupportedCablePath(_("All mid-span terminations must have the same parent object"))
|
||||
|
||||
# Check for a split path (e.g. rear port fanning out to multiple front ports with
|
||||
# different cables attached)
|
||||
@ -571,8 +576,10 @@ class CablePath(models.Model):
|
||||
return None
|
||||
# Otherwise, halt the trace if no link exists
|
||||
break
|
||||
assert all(type(link) in (Cable, WirelessLink) for link in links)
|
||||
assert all(isinstance(link, type(links[0])) for link in links)
|
||||
if not all(type(link) in (Cable, WirelessLink) for link in links):
|
||||
raise UnsupportedCablePath(_("All links must be cable or wireless"))
|
||||
if not all(isinstance(link, type(links[0])) for link in links):
|
||||
raise UnsupportedCablePath(_("All links must match first link type"))
|
||||
|
||||
# Step 3: Record asymmetric paths as split
|
||||
not_connected_terminations = [termination.link for termination in terminations if termination.link is None]
|
||||
@ -653,14 +660,18 @@ class CablePath(models.Model):
|
||||
positions = position_stack.pop()
|
||||
|
||||
# Ensure we have a number of positions equal to the amount of remote terminations
|
||||
assert len(remote_terminations) == len(positions)
|
||||
if len(remote_terminations) != len(positions):
|
||||
raise UnsupportedCablePath(
|
||||
_("All positions counts within the path on opposite ends of links must match")
|
||||
)
|
||||
|
||||
# Get our front ports
|
||||
q_filter = Q()
|
||||
for rt in remote_terminations:
|
||||
position = positions.pop()
|
||||
q_filter |= Q(rear_port_id=rt.pk, rear_port_position=position)
|
||||
assert q_filter is not Q()
|
||||
if q_filter is Q():
|
||||
raise UnsupportedCablePath(_("Remote termination position filter is missing"))
|
||||
front_ports = FrontPort.objects.filter(q_filter)
|
||||
# Obtain the individual front ports based on the termination and position
|
||||
elif position_stack:
|
||||
|
@ -934,6 +934,8 @@ class Interface(ModularComponentModel, BaseInterface, CabledObjectModel, PathEnd
|
||||
raise ValidationError({'rf_channel_width': _("Cannot specify custom width with channel selected.")})
|
||||
|
||||
# VLAN validation
|
||||
if not self.mode and self.untagged_vlan:
|
||||
raise ValidationError({'untagged_vlan': _("Interface mode does not support an untagged vlan.")})
|
||||
|
||||
# Validate untagged VLAN
|
||||
if self.untagged_vlan and self.untagged_vlan.site not in [self.device.site, None]:
|
||||
|
@ -802,14 +802,10 @@ class Device(
|
||||
verbose_name_plural = _('devices')
|
||||
|
||||
def __str__(self):
|
||||
if self.name and self.asset_tag:
|
||||
return f'{self.name} ({self.asset_tag})'
|
||||
elif self.name:
|
||||
return self.name
|
||||
elif self.virtual_chassis and self.asset_tag:
|
||||
return f'{self.virtual_chassis.name}:{self.vc_position} ({self.asset_tag})'
|
||||
elif self.virtual_chassis:
|
||||
return f'{self.virtual_chassis.name}:{self.vc_position} ({self.pk})'
|
||||
if self.label and self.asset_tag:
|
||||
return f'{self.label} ({self.asset_tag})'
|
||||
elif self.label:
|
||||
return self.label
|
||||
elif self.device_type and self.asset_tag:
|
||||
return f'{self.device_type.manufacturer} {self.device_type.model} ({self.asset_tag})'
|
||||
elif self.device_type:
|
||||
@ -1073,14 +1069,22 @@ class Device(
|
||||
device.location = self.location
|
||||
device.save()
|
||||
|
||||
@property
|
||||
def label(self):
|
||||
"""
|
||||
Return the device name if set; otherwise return a generated name if available.
|
||||
"""
|
||||
if self.name:
|
||||
return self.name
|
||||
if self.virtual_chassis:
|
||||
return f'{self.virtual_chassis.name}:{self.vc_position}'
|
||||
|
||||
@property
|
||||
def identifier(self):
|
||||
"""
|
||||
Return the device name if set; otherwise return the Device's primary key as {pk}
|
||||
"""
|
||||
if self.name is not None:
|
||||
return self.name
|
||||
return '{{{}}}'.format(self.pk)
|
||||
return self.label or '{{{}}}'.format(self.pk)
|
||||
|
||||
@property
|
||||
def primary_ip(self):
|
||||
@ -1546,7 +1550,10 @@ class MACAddress(PrimaryModel):
|
||||
ct = ObjectType.objects.get_for_id(self._original_assigned_object_type_id)
|
||||
original_assigned_object = ct.get_object_for_this_type(pk=self._original_assigned_object_id)
|
||||
|
||||
if original_assigned_object.primary_mac_address:
|
||||
if (
|
||||
original_assigned_object.primary_mac_address
|
||||
and original_assigned_object.primary_mac_address.pk == self.pk
|
||||
):
|
||||
if not assigned_object:
|
||||
raise ValidationError(
|
||||
_("Cannot unassign MAC Address while it is designated as the primary MAC for an object")
|
||||
|
@ -44,6 +44,7 @@ class DeviceIndex(SearchIndex):
|
||||
('asset_tag', 50),
|
||||
('serial', 60),
|
||||
('name', 100),
|
||||
('virtual_chassis', 200),
|
||||
('description', 500),
|
||||
('comments', 5000),
|
||||
)
|
||||
|
@ -30,10 +30,8 @@ STROKE_RESERVED = '#4d4dff'
|
||||
|
||||
|
||||
def get_device_name(device):
|
||||
if device.virtual_chassis:
|
||||
name = f'{device.virtual_chassis.name}:{device.vc_position}'
|
||||
elif device.name:
|
||||
name = device.name
|
||||
if device.label:
|
||||
name = device.label
|
||||
else:
|
||||
name = str(device.device_type)
|
||||
if device.devicebay_count:
|
||||
|
@ -143,6 +143,7 @@ class PlatformTable(NetBoxTable):
|
||||
class DeviceTable(TenancyColumnsMixin, ContactsColumnMixin, NetBoxTable):
|
||||
name = tables.TemplateColumn(
|
||||
verbose_name=_('Name'),
|
||||
accessor=Accessor('label'),
|
||||
template_code=DEVICE_LINK,
|
||||
linkify=True
|
||||
)
|
||||
@ -671,7 +672,7 @@ class InterfaceTable(BaseInterfaceTable, ModularDeviceComponentTable, PathEndpoi
|
||||
'rf_role', 'rf_channel', 'rf_channel_frequency', 'rf_channel_width', 'tx_power', 'description',
|
||||
'mark_connected', 'cable', 'cable_color', 'wireless_link', 'wireless_lans', 'link_peer', 'connection',
|
||||
'tags', 'vdcs', 'vrf', 'l2vpn', 'tunnel', 'ip_addresses', 'fhrp_groups', 'untagged_vlan', 'tagged_vlans',
|
||||
'qinq_svlan', 'inventory_items', 'created', 'last_updated',
|
||||
'qinq_svlan', 'inventory_items', 'created', 'last_updated', 'vlan_translation_policy'
|
||||
)
|
||||
default_columns = ('pk', 'name', 'device', 'label', 'enabled', 'type', 'description')
|
||||
|
||||
|
@ -94,7 +94,6 @@ class SiteTable(TenancyColumnsMixin, ContactsColumnMixin, NetBoxTable):
|
||||
verbose_name=_('ASNs')
|
||||
)
|
||||
asn_count = columns.LinkedCountColumn(
|
||||
accessor=tables.A('asns__count'),
|
||||
viewname='ipam:asn_list',
|
||||
url_params={'site_id': 'pk'},
|
||||
verbose_name=_('ASN Count')
|
||||
|
@ -1,3 +1,5 @@
|
||||
import json
|
||||
|
||||
from django.test import override_settings
|
||||
from django.urls import reverse
|
||||
from django.utils.translation import gettext as _
|
||||
@ -1748,6 +1750,23 @@ class InterfaceTest(Mixins.ComponentTraceMixin, APIViewTestCases.APIViewTestCase
|
||||
},
|
||||
]
|
||||
|
||||
def _perform_interface_test_with_invalid_data(self, mode: str = None, invalid_data: dict = {}):
|
||||
device = Device.objects.first()
|
||||
data = {
|
||||
'device': device.pk,
|
||||
'name': 'Interface 1',
|
||||
'type': InterfaceTypeChoices.TYPE_1GE_FIXED,
|
||||
}
|
||||
data.update({'mode': mode})
|
||||
data.update(invalid_data)
|
||||
|
||||
response = self.client.post(self._get_list_url(), data, format='json', **self.header)
|
||||
self.assertHttpStatus(response, status.HTTP_400_BAD_REQUEST)
|
||||
content = json.loads(response.content)
|
||||
for key in invalid_data.keys():
|
||||
self.assertIn(key, content)
|
||||
self.assertIsNone(content.get('data'))
|
||||
|
||||
def test_bulk_delete_child_interfaces(self):
|
||||
interface1 = Interface.objects.get(name='Interface 1')
|
||||
device = interface1.device
|
||||
@ -1775,6 +1794,57 @@ class InterfaceTest(Mixins.ComponentTraceMixin, APIViewTestCases.APIViewTestCase
|
||||
self.client.delete(self._get_list_url(), data, format='json', **self.header)
|
||||
self.assertEqual(device.interfaces.count(), 2) # Child & parent were both deleted
|
||||
|
||||
def test_create_child_interfaces_mode_invalid_data(self):
|
||||
"""
|
||||
POST data to test interface mode check and invalid tagged/untagged VLANS.
|
||||
"""
|
||||
self.add_permissions('dcim.add_interface')
|
||||
|
||||
vlans = VLAN.objects.all()[0:3]
|
||||
|
||||
# Routed mode, untagged, tagged and qinq service vlan
|
||||
invalid_data = {
|
||||
'untagged_vlan': vlans[0].pk,
|
||||
'tagged_vlans': [vlans[1].pk, vlans[2].pk],
|
||||
'qinq_svlan': vlans[2].pk
|
||||
}
|
||||
self._perform_interface_test_with_invalid_data(None, invalid_data)
|
||||
|
||||
# Routed mode, untagged and tagged vlan
|
||||
invalid_data = {
|
||||
'untagged_vlan': vlans[0].pk,
|
||||
'tagged_vlans': [vlans[1].pk, vlans[2].pk],
|
||||
}
|
||||
self._perform_interface_test_with_invalid_data(None, invalid_data)
|
||||
|
||||
# Routed mode, untagged vlan
|
||||
invalid_data = {
|
||||
'untagged_vlan': vlans[0].pk,
|
||||
}
|
||||
self._perform_interface_test_with_invalid_data(None, invalid_data)
|
||||
|
||||
invalid_data = {
|
||||
'tagged_vlans': [vlans[1].pk, vlans[2].pk],
|
||||
}
|
||||
# Routed mode, qinq service vlan
|
||||
self._perform_interface_test_with_invalid_data(None, invalid_data)
|
||||
# Access mode, tagged vlans
|
||||
self._perform_interface_test_with_invalid_data(InterfaceModeChoices.MODE_ACCESS, invalid_data)
|
||||
# All tagged mode, tagged vlans
|
||||
self._perform_interface_test_with_invalid_data(InterfaceModeChoices.MODE_TAGGED_ALL, invalid_data)
|
||||
|
||||
invalid_data = {
|
||||
'qinq_svlan': vlans[0].pk,
|
||||
}
|
||||
# Routed mode, qinq service vlan
|
||||
self._perform_interface_test_with_invalid_data(None, invalid_data)
|
||||
# Access mode, qinq service vlan
|
||||
self._perform_interface_test_with_invalid_data(InterfaceModeChoices.MODE_ACCESS, invalid_data)
|
||||
# Tagged mode, qinq service vlan
|
||||
self._perform_interface_test_with_invalid_data(InterfaceModeChoices.MODE_TAGGED, invalid_data)
|
||||
# Tagged-all mode, qinq service vlan
|
||||
self._perform_interface_test_with_invalid_data(InterfaceModeChoices.MODE_TAGGED_ALL, invalid_data)
|
||||
|
||||
|
||||
class FrontPortTest(APIViewTestCases.APIViewTestCase):
|
||||
model = FrontPort
|
||||
|
@ -5,6 +5,7 @@ from dcim.choices import LinkStatusChoices
|
||||
from dcim.models import *
|
||||
from dcim.svg import CableTraceSVG
|
||||
from dcim.utils import object_to_path_node
|
||||
from utilities.exceptions import AbortRequest
|
||||
|
||||
|
||||
class CablePathTestCase(TestCase):
|
||||
@ -2470,7 +2471,7 @@ class CablePathTestCase(TestCase):
|
||||
b_terminations=[frontport1, frontport3],
|
||||
label='C1'
|
||||
)
|
||||
with self.assertRaises(AssertionError):
|
||||
with self.assertRaises(AbortRequest):
|
||||
cable1.save()
|
||||
|
||||
self.assertPathDoesNotExist(
|
||||
@ -2489,7 +2490,7 @@ class CablePathTestCase(TestCase):
|
||||
label='C3'
|
||||
)
|
||||
|
||||
with self.assertRaises(AssertionError):
|
||||
with self.assertRaises(AbortRequest):
|
||||
cable3.save()
|
||||
|
||||
self.assertPathDoesNotExist(
|
||||
|
@ -1,8 +1,9 @@
|
||||
from django.test import TestCase
|
||||
|
||||
from dcim.choices import DeviceFaceChoices, DeviceStatusChoices, InterfaceTypeChoices
|
||||
from dcim.choices import DeviceFaceChoices, DeviceStatusChoices, InterfaceTypeChoices, InterfaceModeChoices
|
||||
from dcim.forms import *
|
||||
from dcim.models import *
|
||||
from ipam.models import VLAN
|
||||
from utilities.testing import create_test_device
|
||||
from virtualization.models import Cluster, ClusterGroup, ClusterType
|
||||
|
||||
@ -117,11 +118,23 @@ class DeviceTestCase(TestCase):
|
||||
self.assertIn('position', form.errors)
|
||||
|
||||
|
||||
class LabelTestCase(TestCase):
|
||||
class InterfaceTestCase(TestCase):
|
||||
|
||||
@classmethod
|
||||
def setUpTestData(cls):
|
||||
cls.device = create_test_device('Device 1')
|
||||
cls.vlans = (
|
||||
VLAN(name='VLAN 1', vid=1),
|
||||
VLAN(name='VLAN 2', vid=2),
|
||||
VLAN(name='VLAN 3', vid=3),
|
||||
)
|
||||
VLAN.objects.bulk_create(cls.vlans)
|
||||
cls.interface = Interface.objects.create(
|
||||
device=cls.device,
|
||||
name='Interface 1',
|
||||
type=InterfaceTypeChoices.TYPE_1GE_GBIC,
|
||||
mode=InterfaceModeChoices.MODE_TAGGED,
|
||||
)
|
||||
|
||||
def test_interface_label_count_valid(self):
|
||||
"""
|
||||
@ -151,3 +164,152 @@ class LabelTestCase(TestCase):
|
||||
|
||||
self.assertFalse(form.is_valid())
|
||||
self.assertIn('label', form.errors)
|
||||
|
||||
def test_create_interface_mode_valid_data(self):
|
||||
"""
|
||||
Test that saving valid interface mode and tagged/untagged vlans works properly
|
||||
"""
|
||||
|
||||
# Validate access mode
|
||||
data = {
|
||||
'device': self.device.pk,
|
||||
'name': 'ethernet1/1',
|
||||
'type': InterfaceTypeChoices.TYPE_1GE_GBIC,
|
||||
'mode': InterfaceModeChoices.MODE_ACCESS,
|
||||
'untagged_vlan': self.vlans[0].pk
|
||||
}
|
||||
form = InterfaceCreateForm(data)
|
||||
|
||||
self.assertTrue(form.is_valid())
|
||||
|
||||
# Validate tagged vlans
|
||||
data = {
|
||||
'device': self.device.pk,
|
||||
'name': 'ethernet1/2',
|
||||
'type': InterfaceTypeChoices.TYPE_1GE_GBIC,
|
||||
'mode': InterfaceModeChoices.MODE_TAGGED,
|
||||
'untagged_vlan': self.vlans[0].pk,
|
||||
'tagged_vlans': [self.vlans[1].pk, self.vlans[2].pk]
|
||||
}
|
||||
form = InterfaceCreateForm(data)
|
||||
self.assertTrue(form.is_valid())
|
||||
|
||||
# Validate tagged vlans
|
||||
data = {
|
||||
'device': self.device.pk,
|
||||
'name': 'ethernet1/3',
|
||||
'type': InterfaceTypeChoices.TYPE_1GE_GBIC,
|
||||
'mode': InterfaceModeChoices.MODE_TAGGED_ALL,
|
||||
'untagged_vlan': self.vlans[0].pk,
|
||||
}
|
||||
form = InterfaceCreateForm(data)
|
||||
self.assertTrue(form.is_valid())
|
||||
|
||||
def test_create_interface_mode_access_invalid_data(self):
|
||||
"""
|
||||
Test that saving invalid interface mode and tagged/untagged vlans works properly
|
||||
"""
|
||||
data = {
|
||||
'device': self.device.pk,
|
||||
'name': 'ethernet1/4',
|
||||
'type': InterfaceTypeChoices.TYPE_1GE_GBIC,
|
||||
'mode': InterfaceModeChoices.MODE_ACCESS,
|
||||
'untagged_vlan': self.vlans[0].pk,
|
||||
'tagged_vlans': [self.vlans[1].pk, self.vlans[2].pk]
|
||||
}
|
||||
form = InterfaceCreateForm(data)
|
||||
|
||||
self.assertTrue(form.is_valid())
|
||||
self.assertIn('untagged_vlan', form.cleaned_data.keys())
|
||||
self.assertNotIn('tagged_vlans', form.cleaned_data.keys())
|
||||
self.assertNotIn('qinq_svlan', form.cleaned_data.keys())
|
||||
|
||||
def test_edit_interface_mode_access_invalid_data(self):
|
||||
"""
|
||||
Test that saving invalid interface mode and tagged/untagged vlans works properly
|
||||
"""
|
||||
data = {
|
||||
'device': self.device.pk,
|
||||
'name': 'Ethernet 1/5',
|
||||
'type': InterfaceTypeChoices.TYPE_1GE_GBIC,
|
||||
'mode': InterfaceModeChoices.MODE_ACCESS,
|
||||
'tagged_vlans': [self.vlans[0].pk, self.vlans[1].pk, self.vlans[2].pk]
|
||||
}
|
||||
form = InterfaceForm(data, instance=self.interface)
|
||||
|
||||
self.assertTrue(form.is_valid())
|
||||
self.assertIn('untagged_vlan', form.cleaned_data.keys())
|
||||
self.assertNotIn('tagged_vlans', form.cleaned_data.keys())
|
||||
self.assertNotIn('qinq_svlan', form.cleaned_data.keys())
|
||||
|
||||
def test_create_interface_mode_tagged_all_invalid_data(self):
|
||||
"""
|
||||
Test that saving invalid interface mode and tagged/untagged vlans works properly
|
||||
"""
|
||||
data = {
|
||||
'device': self.device.pk,
|
||||
'name': 'ethernet1/6',
|
||||
'type': InterfaceTypeChoices.TYPE_1GE_GBIC,
|
||||
'mode': InterfaceModeChoices.MODE_TAGGED_ALL,
|
||||
'tagged_vlans': [self.vlans[0].pk, self.vlans[1].pk, self.vlans[2].pk]
|
||||
}
|
||||
form = InterfaceCreateForm(data)
|
||||
|
||||
self.assertTrue(form.is_valid())
|
||||
self.assertIn('untagged_vlan', form.cleaned_data.keys())
|
||||
self.assertNotIn('tagged_vlans', form.cleaned_data.keys())
|
||||
self.assertNotIn('qinq_svlan', form.cleaned_data.keys())
|
||||
|
||||
def test_edit_interface_mode_tagged_all_invalid_data(self):
|
||||
"""
|
||||
Test that saving invalid interface mode and tagged/untagged vlans works properly
|
||||
"""
|
||||
data = {
|
||||
'device': self.device.pk,
|
||||
'name': 'Ethernet 1/7',
|
||||
'type': InterfaceTypeChoices.TYPE_1GE_GBIC,
|
||||
'mode': InterfaceModeChoices.MODE_TAGGED_ALL,
|
||||
'tagged_vlans': [self.vlans[0].pk, self.vlans[1].pk, self.vlans[2].pk]
|
||||
}
|
||||
form = InterfaceForm(data)
|
||||
self.assertTrue(form.is_valid())
|
||||
self.assertIn('untagged_vlan', form.cleaned_data.keys())
|
||||
self.assertNotIn('tagged_vlans', form.cleaned_data.keys())
|
||||
self.assertNotIn('qinq_svlan', form.cleaned_data.keys())
|
||||
|
||||
def test_create_interface_mode_routed_invalid_data(self):
|
||||
"""
|
||||
Test that saving invalid interface mode (routed) and tagged/untagged vlans works properly
|
||||
"""
|
||||
data = {
|
||||
'device': self.device.pk,
|
||||
'name': 'ethernet1/6',
|
||||
'type': InterfaceTypeChoices.TYPE_1GE_GBIC,
|
||||
'mode': None,
|
||||
'untagged_vlan': self.vlans[0].pk,
|
||||
'tagged_vlans': [self.vlans[0].pk, self.vlans[1].pk, self.vlans[2].pk]
|
||||
}
|
||||
form = InterfaceCreateForm(data)
|
||||
|
||||
self.assertTrue(form.is_valid())
|
||||
self.assertNotIn('untagged_vlan', form.cleaned_data.keys())
|
||||
self.assertNotIn('tagged_vlans', form.cleaned_data.keys())
|
||||
self.assertNotIn('qinq_svlan', form.cleaned_data.keys())
|
||||
|
||||
def test_edit_interface_mode_routed_invalid_data(self):
|
||||
"""
|
||||
Test that saving invalid interface mode (routed) and tagged/untagged vlans works properly
|
||||
"""
|
||||
data = {
|
||||
'device': self.device.pk,
|
||||
'name': 'Ethernet 1/7',
|
||||
'type': InterfaceTypeChoices.TYPE_1GE_GBIC,
|
||||
'mode': None,
|
||||
'untagged_vlan': self.vlans[0].pk,
|
||||
'tagged_vlans': [self.vlans[0].pk, self.vlans[1].pk, self.vlans[2].pk]
|
||||
}
|
||||
form = InterfaceForm(data)
|
||||
self.assertTrue(form.is_valid())
|
||||
self.assertNotIn('untagged_vlan', form.cleaned_data.keys())
|
||||
self.assertNotIn('tagged_vlans', form.cleaned_data.keys())
|
||||
self.assertNotIn('qinq_svlan', form.cleaned_data.keys())
|
||||
|
@ -1,5 +1,5 @@
|
||||
from django.core.exceptions import ValidationError
|
||||
from django.test import TestCase
|
||||
from django.test import tag, TestCase
|
||||
|
||||
from circuits.models import *
|
||||
from core.models import ObjectType
|
||||
@ -12,6 +12,43 @@ from utilities.data import drange
|
||||
from virtualization.models import Cluster, ClusterType
|
||||
|
||||
|
||||
class MACAddressTestCase(TestCase):
|
||||
@classmethod
|
||||
def setUpTestData(cls):
|
||||
site = Site.objects.create(name='Test Site 1', slug='test-site-1')
|
||||
manufacturer = Manufacturer.objects.create(name='Test Manufacturer 1', slug='test-manufacturer-1')
|
||||
device_type = DeviceType.objects.create(
|
||||
manufacturer=manufacturer, model='Test Device Type 1', slug='test-device-type-1'
|
||||
)
|
||||
device_role = DeviceRole.objects.create(name='Test Role 1', slug='test-role-1')
|
||||
device = Device.objects.create(
|
||||
name='Device 1', device_type=device_type, role=device_role, site=site,
|
||||
)
|
||||
cls.interface = Interface.objects.create(
|
||||
device=device,
|
||||
name='Interface 1',
|
||||
type=InterfaceTypeChoices.TYPE_1GE_FIXED,
|
||||
mgmt_only=True
|
||||
)
|
||||
|
||||
cls.mac_a = MACAddress.objects.create(mac_address='1234567890ab', assigned_object=cls.interface)
|
||||
cls.mac_b = MACAddress.objects.create(mac_address='1234567890ba', assigned_object=cls.interface)
|
||||
|
||||
cls.interface.primary_mac_address = cls.mac_a
|
||||
cls.interface.save()
|
||||
|
||||
@tag('regression')
|
||||
def test_clean_will_not_allow_removal_of_assigned_object_if_primary(self):
|
||||
self.mac_a.assigned_object = None
|
||||
with self.assertRaisesMessage(ValidationError, 'Cannot unassign MAC Address while'):
|
||||
self.mac_a.clean()
|
||||
|
||||
@tag('regression')
|
||||
def test_clean_will_allow_removal_of_assigned_object_if_not_primary(self):
|
||||
self.mac_b.assigned_object = None
|
||||
self.mac_b.clean()
|
||||
|
||||
|
||||
class LocationTestCase(TestCase):
|
||||
|
||||
def test_change_location_site(self):
|
||||
@ -590,6 +627,32 @@ class DeviceTestCase(TestCase):
|
||||
device2.full_clean()
|
||||
device2.save()
|
||||
|
||||
def test_device_label(self):
|
||||
device1 = Device(
|
||||
site=Site.objects.first(),
|
||||
device_type=DeviceType.objects.first(),
|
||||
role=DeviceRole.objects.first(),
|
||||
name=None,
|
||||
)
|
||||
self.assertEqual(device1.label, None)
|
||||
|
||||
device1.name = 'Test Device 1'
|
||||
self.assertEqual(device1.label, 'Test Device 1')
|
||||
|
||||
virtual_chassis = VirtualChassis.objects.create(name='VC 1')
|
||||
device2 = Device(
|
||||
site=Site.objects.first(),
|
||||
device_type=DeviceType.objects.first(),
|
||||
role=DeviceRole.objects.first(),
|
||||
name=None,
|
||||
virtual_chassis=virtual_chassis,
|
||||
vc_position=2,
|
||||
)
|
||||
self.assertEqual(device2.label, 'VC 1:2')
|
||||
|
||||
device2.name = 'Test Device 2'
|
||||
self.assertEqual(device2.label, 'Test Device 2')
|
||||
|
||||
def test_device_mismatched_site_cluster(self):
|
||||
cluster_type = ClusterType.objects.create(name='Cluster Type 1', slug='cluster-type-1')
|
||||
Cluster.objects.create(name='Cluster 1', type=cluster_type)
|
||||
|
@ -422,7 +422,8 @@ class SiteGroupContactsView(ObjectContactsView):
|
||||
@register_model_view(Site, 'list', path='', detail=False)
|
||||
class SiteListView(generic.ObjectListView):
|
||||
queryset = Site.objects.annotate(
|
||||
device_count=count_related(Device, 'site')
|
||||
device_count=count_related(Device, 'site'),
|
||||
asn_count=count_related(ASN, 'sites')
|
||||
)
|
||||
filterset = filtersets.SiteFilterSet
|
||||
filterset_form = forms.SiteFilterForm
|
||||
|
@ -162,6 +162,7 @@ class CustomFieldForm(forms.ModelForm):
|
||||
|
||||
|
||||
class CustomFieldChoiceSetForm(forms.ModelForm):
|
||||
# TODO: The extra_choices field definition diverge from the CustomFieldChoiceSet model
|
||||
extra_choices = forms.CharField(
|
||||
widget=ChoicesWidget(),
|
||||
required=False,
|
||||
@ -178,12 +179,25 @@ class CustomFieldChoiceSetForm(forms.ModelForm):
|
||||
def __init__(self, *args, initial=None, **kwargs):
|
||||
super().__init__(*args, initial=initial, **kwargs)
|
||||
|
||||
# Escape colons in extra_choices
|
||||
# TODO: The check for str / list below is to handle difference in extra_choices field definition
|
||||
# In CustomFieldChoiceSetForm, extra_choices is a CharField but in CustomFieldChoiceSet, it is an ArrayField
|
||||
# if standardize these, we can simplify this code
|
||||
|
||||
# Convert extra_choices Array Field from model to CharField for form
|
||||
if 'extra_choices' in self.initial and self.initial['extra_choices']:
|
||||
choices = []
|
||||
for choice in self.initial['extra_choices']:
|
||||
choice = (choice[0].replace(':', '\\:'), choice[1].replace(':', '\\:'))
|
||||
choices.append(choice)
|
||||
extra_choices = self.initial['extra_choices']
|
||||
if isinstance(extra_choices, str):
|
||||
extra_choices = [extra_choices]
|
||||
choices = ""
|
||||
for choice in extra_choices:
|
||||
# Setup choices in Add Another use case
|
||||
if isinstance(choice, str):
|
||||
choice_str = ":".join(choice.replace("'", "").replace(" ", "")[1:-1].split(","))
|
||||
choices += choice_str + "\n"
|
||||
# Setup choices in Edit use case
|
||||
elif isinstance(choice, list):
|
||||
choice_str = ":".join(choice)
|
||||
choices += choice_str + "\n"
|
||||
|
||||
self.initial['extra_choices'] = choices
|
||||
|
||||
|
@ -211,10 +211,12 @@ class ObjectVar(ScriptVariable):
|
||||
:param context: A custom dictionary mapping template context variables to fields, used when rendering <option>
|
||||
elements within the dropdown menu (optional)
|
||||
:param null_option: The label to use as a "null" selection option (optional)
|
||||
:param selector: Include an advanced object selection widget to assist the user in identifying the desired
|
||||
object (optional)
|
||||
"""
|
||||
form_field = DynamicModelChoiceField
|
||||
|
||||
def __init__(self, model, query_params=None, context=None, null_option=None, *args, **kwargs):
|
||||
def __init__(self, model, query_params=None, context=None, null_option=None, selector=False, *args, **kwargs):
|
||||
super().__init__(*args, **kwargs)
|
||||
|
||||
self.field_attrs.update({
|
||||
@ -222,6 +224,7 @@ class ObjectVar(ScriptVariable):
|
||||
'query_params': query_params,
|
||||
'context': context,
|
||||
'null_option': null_option,
|
||||
'selector': selector,
|
||||
})
|
||||
|
||||
|
||||
|
@ -75,8 +75,11 @@ urlpatterns = [
|
||||
path('scripts/add/', views.ScriptModuleCreateView.as_view(), name='scriptmodule_add'),
|
||||
path('scripts/results/<int:job_pk>/', views.ScriptResultView.as_view(), name='script_result'),
|
||||
path('scripts/<int:pk>/', views.ScriptView.as_view(), name='script'),
|
||||
path('scripts/<str:module>.<str:name>/', views.ScriptView.as_view(), name='script'),
|
||||
path('scripts/<int:pk>/source/', views.ScriptSourceView.as_view(), name='script_source'),
|
||||
path('scripts/<str:module>.<str:name>/source/', views.ScriptSourceView.as_view(), name='script_source'),
|
||||
path('scripts/<int:pk>/jobs/', views.ScriptJobsView.as_view(), name='script_jobs'),
|
||||
path('scripts/<str:module>.<str:name>/jobs/', views.ScriptJobsView.as_view(), name='script_jobs'),
|
||||
path('script-modules/<int:pk>/', include(get_model_urls('extras', 'scriptmodule'))),
|
||||
|
||||
# Markdown
|
||||
|
@ -1251,6 +1251,14 @@ class ScriptListView(ContentTypePermissionRequiredMixin, View):
|
||||
class BaseScriptView(generic.ObjectView):
|
||||
queryset = Script.objects.all()
|
||||
|
||||
def get_object(self, **kwargs):
|
||||
if pk := kwargs.get('pk', False):
|
||||
return get_object_or_404(self.queryset, pk=pk)
|
||||
elif (module := kwargs.get('module')) and (name := kwargs.get('name', False)):
|
||||
return get_object_or_404(self.queryset, module__file_path=f'{module}.py', name=name)
|
||||
else:
|
||||
raise Http404
|
||||
|
||||
def _get_script_class(self, script):
|
||||
"""
|
||||
Return an instance of the Script's Python class
|
||||
|
@ -212,7 +212,7 @@ class PrefixForm(TenancyForm, ScopedForm, NetBoxModelForm):
|
||||
required=False,
|
||||
selector=True,
|
||||
query_params={
|
||||
'available_at_site': '$site',
|
||||
'available_at_site': '$scope',
|
||||
},
|
||||
label=_('VLAN'),
|
||||
)
|
||||
@ -240,6 +240,14 @@ class PrefixForm(TenancyForm, ScopedForm, NetBoxModelForm):
|
||||
'tenant', 'description', 'comments', 'tags',
|
||||
]
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
super().__init__(*args, **kwargs)
|
||||
|
||||
# #18605: only filter VLAN select list if scope field is a Site
|
||||
if scope_field := self.fields.get('scope', None):
|
||||
if scope_field.queryset.model is not Site:
|
||||
self.fields['vlan'].widget.attrs.pop('data-dynamic-params', None)
|
||||
|
||||
|
||||
class IPRangeForm(TenancyForm, NetBoxModelForm):
|
||||
vrf = DynamicModelChoiceField(
|
||||
|
43
netbox/ipam/tests/test_forms.py
Normal file
43
netbox/ipam/tests/test_forms.py
Normal file
@ -0,0 +1,43 @@
|
||||
from django.contrib.contenttypes.models import ContentType
|
||||
from django.test import TestCase
|
||||
|
||||
from dcim.models import Location, Region, Site, SiteGroup
|
||||
from ipam.forms import PrefixForm
|
||||
|
||||
|
||||
class PrefixFormTestCase(TestCase):
|
||||
default_dynamic_params = '[{"fieldName":"scope","queryParam":"available_at_site"}]'
|
||||
|
||||
@classmethod
|
||||
def setUpTestData(cls):
|
||||
cls.site = Site.objects.create(name='Site 1', slug='site-1')
|
||||
|
||||
def test_vlan_field_sets_dynamic_params_by_default(self):
|
||||
"""data-dynamic-params present when no scope_type selected"""
|
||||
form = PrefixForm(data={})
|
||||
|
||||
assert form.fields['vlan'].widget.attrs['data-dynamic-params'] == self.default_dynamic_params
|
||||
|
||||
def test_vlan_field_sets_dynamic_params_for_scope_site(self):
|
||||
"""data-dynamic-params present when scope type is Site and when scope is specifc site"""
|
||||
form = PrefixForm(data={
|
||||
'scope_type': ContentType.objects.get_for_model(Site).id,
|
||||
'scope': self.site,
|
||||
})
|
||||
|
||||
assert form.fields['vlan'].widget.attrs['data-dynamic-params'] == self.default_dynamic_params
|
||||
|
||||
def test_vlan_field_does_not_set_dynamic_params_for_other_scopes(self):
|
||||
"""data-dynamic-params not present when scope type is populated by is not Site"""
|
||||
cases = [
|
||||
Region(name='Region 1', slug='region-1'),
|
||||
Location(site=self.site, name='Location 1', slug='location-1'),
|
||||
SiteGroup(name='Site Group 1', slug='site-group-1'),
|
||||
]
|
||||
for case in cases:
|
||||
form = PrefixForm(data={
|
||||
'scope_type': ContentType.objects.get_for_model(case._meta.model).id,
|
||||
'scope': case,
|
||||
})
|
||||
|
||||
assert 'data-dynamic-params' not in form.fields['vlan'].widget.attrs
|
@ -166,7 +166,7 @@ class ObjectJobsView(ConditionalLoginRequiredMixin, View):
|
||||
|
||||
def get_jobs(self, instance):
|
||||
object_type = ContentType.objects.get_for_model(instance)
|
||||
return Job.objects.filter(
|
||||
return Job.objects.defer('data').filter(
|
||||
object_type=object_type,
|
||||
object_id=instance.id
|
||||
)
|
||||
|
BIN
netbox/project-static/dist/netbox.js
vendored
BIN
netbox/project-static/dist/netbox.js
vendored
Binary file not shown.
BIN
netbox/project-static/dist/netbox.js.map
vendored
BIN
netbox/project-static/dist/netbox.js.map
vendored
Binary file not shown.
@ -30,8 +30,8 @@
|
||||
"gridstack": "11.3.0",
|
||||
"htmx.org": "1.9.12",
|
||||
"query-string": "9.1.1",
|
||||
"sass": "1.83.4",
|
||||
"tom-select": "2.4.2",
|
||||
"sass": "1.85.0",
|
||||
"tom-select": "2.4.3",
|
||||
"typeface-inter": "3.18.1",
|
||||
"typeface-roboto-mono": "1.1.13"
|
||||
},
|
||||
@ -53,5 +53,6 @@
|
||||
},
|
||||
"resolutions": {
|
||||
"@types/bootstrap/**/@popperjs/core": "^2.11.6"
|
||||
}
|
||||
},
|
||||
"packageManager": "yarn@1.22.22+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e"
|
||||
}
|
||||
|
@ -43,7 +43,9 @@ function toggleCheckboxRange(
|
||||
const typedElement = element as HTMLInputElement;
|
||||
//Change loop's current checkbox state to eventTargetElement checkbox state
|
||||
if (changePkCheckboxState === true) {
|
||||
typedElement.checked = eventTargetElement.checked;
|
||||
if (!typedElement.closest('tr')?.classList.contains('d-none')) {
|
||||
typedElement.checked = eventTargetElement.checked;
|
||||
}
|
||||
}
|
||||
//The previously clicked checkbox was above the shift clicked checkbox
|
||||
if (element === previousStateElement) {
|
||||
@ -52,7 +54,9 @@ function toggleCheckboxRange(
|
||||
return;
|
||||
}
|
||||
changePkCheckboxState = true;
|
||||
typedElement.checked = eventTargetElement.checked;
|
||||
if (!typedElement.closest('tr')?.classList.contains('d-none')) {
|
||||
typedElement.checked = eventTargetElement.checked;
|
||||
}
|
||||
}
|
||||
//The previously clicked checkbox was below the shift clicked checkbox
|
||||
if (element === eventTargetElement) {
|
||||
|
@ -1,5 +1,6 @@
|
||||
import { initForms } from './forms';
|
||||
import { initButtons } from './buttons';
|
||||
import { initClipboard } from './clipboard'
|
||||
import { initClipboard } from './clipboard';
|
||||
import { initSelects } from './select';
|
||||
import { initObjectSelector } from './objectSelector';
|
||||
import { initBootstrap } from './bs';
|
||||
@ -9,6 +10,7 @@ import { initQuickAdd } from './quickAdd';
|
||||
function initDepedencies(): void {
|
||||
initButtons();
|
||||
initClipboard();
|
||||
initForms();
|
||||
initSelects();
|
||||
initObjectSelector();
|
||||
initQuickAdd();
|
||||
|
@ -1,3 +1,3 @@
|
||||
version: "4.2.3"
|
||||
version: "4.2.4"
|
||||
edition: "Community"
|
||||
published: "2025-02-04"
|
||||
published: "2025-02-21"
|
||||
|
@ -54,3 +54,7 @@
|
||||
</div>
|
||||
</div>
|
||||
{% endblock content %}
|
||||
|
||||
{% block modals %}
|
||||
{% include 'inc/htmx_modal.html' with size='lg' %}
|
||||
{% endblock %}
|
||||
|
Binary file not shown.
@ -4,10 +4,10 @@
|
||||
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
|
||||
#
|
||||
# Translators:
|
||||
# czarnian, 2024
|
||||
# Jeremy Stretch, 2024
|
||||
# Pavel Valach, 2024
|
||||
# Matěj Gordon, 2025
|
||||
# czarnian, 2025
|
||||
# Jeremy Stretch, 2025
|
||||
#
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
@ -16,7 +16,7 @@ msgstr ""
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2025-01-04 05:02+0000\n"
|
||||
"PO-Revision-Date: 2023-10-30 17:48+0000\n"
|
||||
"Last-Translator: Matěj Gordon, 2025\n"
|
||||
"Last-Translator: Jeremy Stretch, 2025\n"
|
||||
"Language-Team: Czech (https://app.transifex.com/netbox-community/teams/178115/cs/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
@ -64,7 +64,7 @@ msgstr "Naposledy použitý"
|
||||
#: netbox/templates/users/token.html:47 netbox/users/forms/bulk_edit.py:122
|
||||
#: netbox/users/forms/model_forms.py:124
|
||||
msgid "Allowed IPs"
|
||||
msgstr "Povolené IP adresy"
|
||||
msgstr "Povolené adresy IP"
|
||||
|
||||
#: netbox/account/views.py:114
|
||||
#, python-brace-format
|
||||
@ -179,7 +179,7 @@ msgstr "Region (zkratka)"
|
||||
#: netbox/ipam/filtersets.py:974 netbox/virtualization/filtersets.py:58
|
||||
#: netbox/virtualization/filtersets.py:186
|
||||
msgid "Site group (ID)"
|
||||
msgstr "Skupina stránek (ID)"
|
||||
msgstr "Skupina míst (ID)"
|
||||
|
||||
#: netbox/circuits/filtersets.py:51 netbox/circuits/filtersets.py:218
|
||||
#: netbox/dcim/filtersets.py:135 netbox/dcim/filtersets.py:232
|
||||
@ -191,7 +191,7 @@ msgstr "Skupina stránek (ID)"
|
||||
#: netbox/virtualization/filtersets.py:65
|
||||
#: netbox/virtualization/filtersets.py:193
|
||||
msgid "Site group (slug)"
|
||||
msgstr "Skupina stránek (slug)"
|
||||
msgstr "Skupina míst (zkratka)"
|
||||
|
||||
#: netbox/circuits/filtersets.py:56 netbox/circuits/forms/bulk_edit.py:188
|
||||
#: netbox/circuits/forms/bulk_edit.py:216
|
||||
@ -252,7 +252,7 @@ msgstr "Skupina stránek (slug)"
|
||||
#: netbox/vpn/forms/filtersets.py:266 netbox/wireless/forms/model_forms.py:76
|
||||
#: netbox/wireless/forms/model_forms.py:118
|
||||
msgid "Site"
|
||||
msgstr "Stránky"
|
||||
msgstr "Místo"
|
||||
|
||||
#: netbox/circuits/filtersets.py:62 netbox/circuits/filtersets.py:229
|
||||
#: netbox/circuits/filtersets.py:274 netbox/dcim/filtersets.py:242
|
||||
@ -262,7 +262,7 @@ msgstr "Stránky"
|
||||
#: netbox/virtualization/filtersets.py:75
|
||||
#: netbox/virtualization/filtersets.py:203 netbox/vpn/filtersets.py:363
|
||||
msgid "Site (slug)"
|
||||
msgstr "Místo (slug)"
|
||||
msgstr "Místo (zkratka)"
|
||||
|
||||
#: netbox/circuits/filtersets.py:67
|
||||
msgid "ASN (ID)"
|
||||
@ -316,7 +316,7 @@ msgstr "Typ okruhu (URL zkratka)"
|
||||
#: netbox/ipam/filtersets.py:985 netbox/virtualization/filtersets.py:69
|
||||
#: netbox/virtualization/filtersets.py:197 netbox/vpn/filtersets.py:368
|
||||
msgid "Site (ID)"
|
||||
msgstr "Stránky (ID)"
|
||||
msgstr "Místo (ID)"
|
||||
|
||||
#: netbox/circuits/filtersets.py:233 netbox/circuits/filtersets.py:237
|
||||
msgid "Termination A (ID)"
|
||||
@ -371,15 +371,15 @@ msgstr "Síť poskytovatele (ID)"
|
||||
|
||||
#: netbox/circuits/filtersets.py:335
|
||||
msgid "Circuit (ID)"
|
||||
msgstr "Obvod (ID)"
|
||||
msgstr "Okruh (ID)"
|
||||
|
||||
#: netbox/circuits/filtersets.py:341
|
||||
msgid "Circuit (CID)"
|
||||
msgstr "Obvod (CID)"
|
||||
msgstr "Okruh (CID)"
|
||||
|
||||
#: netbox/circuits/filtersets.py:345
|
||||
msgid "Circuit group (ID)"
|
||||
msgstr "Skupina obvodů (ID)"
|
||||
msgstr "Skupina okruhů (ID)"
|
||||
|
||||
#: netbox/circuits/filtersets.py:351
|
||||
msgid "Circuit group (slug)"
|
||||
@ -804,7 +804,7 @@ msgstr "Datum ukončení"
|
||||
#: netbox/circuits/forms/bulk_edit.py:158
|
||||
#: netbox/circuits/forms/filtersets.py:186
|
||||
msgid "Commit rate (Kbps)"
|
||||
msgstr "Rychlost odevzdání (Kbps)"
|
||||
msgstr "Smluvní rychlost (Kbps)"
|
||||
|
||||
#: netbox/circuits/forms/bulk_edit.py:173
|
||||
#: netbox/circuits/forms/model_forms.py:112
|
||||
@ -1042,7 +1042,7 @@ msgstr "Region"
|
||||
#: netbox/virtualization/forms/filtersets.py:138
|
||||
#: netbox/virtualization/forms/model_forms.py:98
|
||||
msgid "Site group"
|
||||
msgstr "Skupina stránek"
|
||||
msgstr "Skupina míst"
|
||||
|
||||
#: netbox/circuits/forms/filtersets.py:65
|
||||
#: netbox/circuits/forms/filtersets.py:83
|
||||
@ -1160,19 +1160,19 @@ msgstr "barva"
|
||||
|
||||
#: netbox/circuits/models/circuits.py:36
|
||||
msgid "circuit type"
|
||||
msgstr "typ obvodu"
|
||||
msgstr "typ okruhu"
|
||||
|
||||
#: netbox/circuits/models/circuits.py:37
|
||||
msgid "circuit types"
|
||||
msgstr "typy obvodů"
|
||||
msgstr "typy okruhů"
|
||||
|
||||
#: netbox/circuits/models/circuits.py:48
|
||||
msgid "circuit ID"
|
||||
msgstr "ID obvodu"
|
||||
msgstr "ID okruhu"
|
||||
|
||||
#: netbox/circuits/models/circuits.py:49
|
||||
msgid "Unique circuit ID"
|
||||
msgstr "Jedinečné ID obvodu"
|
||||
msgstr "Jedinečné ID okruhu"
|
||||
|
||||
#: netbox/circuits/models/circuits.py:69 netbox/core/models/data.py:52
|
||||
#: netbox/core/models/jobs.py:85 netbox/dcim/models/cables.py:49
|
||||
@ -1194,11 +1194,11 @@ msgstr "nainstalován"
|
||||
|
||||
#: netbox/circuits/models/circuits.py:89
|
||||
msgid "terminates"
|
||||
msgstr "ukončí"
|
||||
msgstr "končí"
|
||||
|
||||
#: netbox/circuits/models/circuits.py:94
|
||||
msgid "commit rate (Kbps)"
|
||||
msgstr "rychlost odevzdání (Kbps)"
|
||||
msgstr "smluvní rychlost (Kbps)"
|
||||
|
||||
#: netbox/circuits/models/circuits.py:95
|
||||
msgid "Committed rate"
|
||||
@ -1214,11 +1214,11 @@ msgstr "okruhy"
|
||||
|
||||
#: netbox/circuits/models/circuits.py:170
|
||||
msgid "circuit group"
|
||||
msgstr "skupina obvodů"
|
||||
msgstr "skupina okruhů"
|
||||
|
||||
#: netbox/circuits/models/circuits.py:171
|
||||
msgid "circuit groups"
|
||||
msgstr "skupiny obvodů"
|
||||
msgstr "skupiny okruhů"
|
||||
|
||||
#: netbox/circuits/models/circuits.py:195 netbox/ipam/models/fhrp.py:93
|
||||
#: netbox/tenancy/models/contacts.py:134
|
||||
@ -1227,7 +1227,7 @@ msgstr "přednost"
|
||||
|
||||
#: netbox/circuits/models/circuits.py:213
|
||||
msgid "Circuit group assignment"
|
||||
msgstr "Přiřazení skupiny obvodů"
|
||||
msgstr "Přiřazení skupiny okruhů"
|
||||
|
||||
#: netbox/circuits/models/circuits.py:214
|
||||
msgid "Circuit group assignments"
|
||||
@ -1235,7 +1235,7 @@ msgstr "Přiřazení skupin obvodů"
|
||||
|
||||
#: netbox/circuits/models/circuits.py:240
|
||||
msgid "termination"
|
||||
msgstr "zakončení"
|
||||
msgstr ""
|
||||
|
||||
#: netbox/circuits/models/circuits.py:257
|
||||
msgid "port speed (Kbps)"
|
||||
@ -1297,14 +1297,11 @@ msgstr "zakončení okruhů"
|
||||
msgid ""
|
||||
"A circuit termination must attach to either a site or a provider network."
|
||||
msgstr ""
|
||||
"Zakončení okruhu se musí připojit buď k místu, nebo k síti poskytovatele."
|
||||
|
||||
#: netbox/circuits/models/circuits.py:310
|
||||
msgid ""
|
||||
"A circuit termination cannot attach to both a site and a provider network."
|
||||
msgstr ""
|
||||
"Zakončení okruhu se nemůže připojit jak k síti webu, tak k síti "
|
||||
"poskytovatele."
|
||||
|
||||
#: netbox/circuits/models/providers.py:22
|
||||
#: netbox/circuits/models/providers.py:66
|
||||
@ -1534,7 +1531,7 @@ msgstr "Strana Z"
|
||||
#: netbox/circuits/tables/circuits.py:77
|
||||
#: netbox/templates/circuits/circuit.html:55
|
||||
msgid "Commit Rate"
|
||||
msgstr "Míra odevzdání"
|
||||
msgstr "Smluvní rychlost"
|
||||
|
||||
#: netbox/circuits/tables/circuits.py:80
|
||||
#: netbox/circuits/tables/providers.py:48
|
||||
@ -1563,7 +1560,7 @@ msgstr "Míra odevzdání"
|
||||
#: netbox/vpn/tables/tunnels.py:61 netbox/wireless/tables/wirelesslan.py:27
|
||||
#: netbox/wireless/tables/wirelesslan.py:58
|
||||
msgid "Comments"
|
||||
msgstr "Komentář"
|
||||
msgstr "Komentáře"
|
||||
|
||||
#: netbox/circuits/tables/circuits.py:86
|
||||
#: netbox/templates/tenancy/contact.html:84
|
||||
@ -1586,12 +1583,12 @@ msgstr "Počet ASN"
|
||||
#: netbox/circuits/views.py:331
|
||||
#, python-brace-format
|
||||
msgid "No terminations have been defined for circuit {circuit}."
|
||||
msgstr "Pro obvod nebyla definována žádná zakončení {circuit}."
|
||||
msgstr "Pro okruh {circuit} nebyla definována žádná zakončení ."
|
||||
|
||||
#: netbox/circuits/views.py:380
|
||||
#, python-brace-format
|
||||
msgid "Swapped terminations for circuit {circuit}."
|
||||
msgstr "Vyměněné zakončení pro obvod {circuit}."
|
||||
msgstr "Vyměněná zakončení pro okruh {circuit}."
|
||||
|
||||
#: netbox/core/api/views.py:39
|
||||
msgid "This user does not have permission to synchronize this data source."
|
||||
@ -1620,7 +1617,7 @@ msgstr "Dokončeno"
|
||||
#: netbox/dcim/choices.py:187 netbox/dcim/choices.py:239
|
||||
#: netbox/dcim/choices.py:1609 netbox/virtualization/choices.py:47
|
||||
msgid "Failed"
|
||||
msgstr "Neuspěl"
|
||||
msgstr "Selhalo"
|
||||
|
||||
#: netbox/core/choices.py:35 netbox/netbox/navigation/menu.py:335
|
||||
#: netbox/netbox/navigation/menu.py:339
|
||||
@ -1647,7 +1644,7 @@ msgstr "Naplánováno"
|
||||
|
||||
#: netbox/core/choices.py:56
|
||||
msgid "Running"
|
||||
msgstr "Běh"
|
||||
msgstr "Běží"
|
||||
|
||||
#: netbox/core/choices.py:58
|
||||
msgid "Errored"
|
||||
@ -1656,7 +1653,7 @@ msgstr "Chyba"
|
||||
#: netbox/core/choices.py:87 netbox/core/tables/plugins.py:63
|
||||
#: netbox/templates/generic/object.html:61
|
||||
msgid "Updated"
|
||||
msgstr "aktualizováno"
|
||||
msgstr "Aktualizováno"
|
||||
|
||||
#: netbox/core/choices.py:88
|
||||
msgid "Deleted"
|
||||
@ -1725,7 +1722,7 @@ msgstr "Tajný přístupový klíč AWS"
|
||||
|
||||
#: netbox/core/events.py:27
|
||||
msgid "Object created"
|
||||
msgstr "Vytvořený objekt"
|
||||
msgstr "Objekt vytvořen"
|
||||
|
||||
#: netbox/core/events.py:28
|
||||
msgid "Object updated"
|
||||
@ -1737,7 +1734,7 @@ msgstr "Objekt odstraněn"
|
||||
|
||||
#: netbox/core/events.py:30
|
||||
msgid "Job started"
|
||||
msgstr "Práce byla zahájena"
|
||||
msgstr "Úloha zahájena"
|
||||
|
||||
#: netbox/core/events.py:31
|
||||
msgid "Job completed"
|
||||
@ -1850,7 +1847,7 @@ msgstr "Vytvořeno po"
|
||||
|
||||
#: netbox/core/forms/filtersets.py:89
|
||||
msgid "Created before"
|
||||
msgstr "Vytvořeno dříve"
|
||||
msgstr "Vytvořeno před"
|
||||
|
||||
#: netbox/core/forms/filtersets.py:94
|
||||
msgid "Scheduled after"
|
||||
@ -1858,7 +1855,7 @@ msgstr "Naplánováno po"
|
||||
|
||||
#: netbox/core/forms/filtersets.py:99
|
||||
msgid "Scheduled before"
|
||||
msgstr "Naplánováno dříve"
|
||||
msgstr "Naplánováno před"
|
||||
|
||||
#: netbox/core/forms/filtersets.py:104
|
||||
msgid "Started after"
|
||||
@ -1866,7 +1863,7 @@ msgstr "Začalo po"
|
||||
|
||||
#: netbox/core/forms/filtersets.py:109
|
||||
msgid "Started before"
|
||||
msgstr "Začalo dříve"
|
||||
msgstr "Začalo před"
|
||||
|
||||
#: netbox/core/forms/filtersets.py:114
|
||||
msgid "Completed after"
|
||||
@ -1905,7 +1902,7 @@ msgstr "Po"
|
||||
|
||||
#: netbox/core/forms/filtersets.py:144 netbox/extras/forms/filtersets.py:450
|
||||
msgid "Before"
|
||||
msgstr "Dříve"
|
||||
msgstr "Před"
|
||||
|
||||
#: netbox/core/forms/filtersets.py:148 netbox/core/tables/change_logging.py:29
|
||||
#: netbox/extras/forms/model_forms.py:396
|
||||
@ -1941,7 +1938,7 @@ msgstr ""
|
||||
#: netbox/core/forms/model_forms.py:153
|
||||
#: netbox/templates/dcim/rack_elevation_list.html:6
|
||||
msgid "Rack Elevations"
|
||||
msgstr "Výšky stojanů"
|
||||
msgstr "Přehled stojanů"
|
||||
|
||||
#: netbox/core/forms/model_forms.py:157 netbox/dcim/choices.py:1520
|
||||
#: netbox/dcim/forms/bulk_edit.py:984 netbox/dcim/forms/bulk_edit.py:1372
|
||||
@ -2259,16 +2256,16 @@ msgstr "ID úlohy"
|
||||
|
||||
#: netbox/core/models/jobs.py:112
|
||||
msgid "job"
|
||||
msgstr "práce"
|
||||
msgstr "úloha"
|
||||
|
||||
#: netbox/core/models/jobs.py:113
|
||||
msgid "jobs"
|
||||
msgstr "pracovní místa"
|
||||
msgstr "úlohy"
|
||||
|
||||
#: netbox/core/models/jobs.py:136
|
||||
#, python-brace-format
|
||||
msgid "Jobs cannot be assigned to this object type ({type})."
|
||||
msgstr "K tomuto typu objektu nelze přiřadit úlohy ({type})."
|
||||
msgstr "K tomuto typu objektu ({type}) nelze přiřadit úlohy."
|
||||
|
||||
#: netbox/core/models/jobs.py:190
|
||||
#, python-brace-format
|
||||
@ -2278,7 +2275,7 @@ msgstr "Neplatný stav pro ukončení úlohy. Možnosti jsou: {choices}"
|
||||
#: netbox/core/models/jobs.py:221
|
||||
msgid ""
|
||||
"enqueue() cannot be called with values for both schedule_at and immediate."
|
||||
msgstr "enqueue () nelze volat s hodnotami pro schedule_at a instant."
|
||||
msgstr "enqueue() nelze volat s hodnotami pro schedule_at a ihned zároveň."
|
||||
|
||||
#: netbox/core/signals.py:126
|
||||
#, python-brace-format
|
||||
@ -2396,7 +2393,7 @@ msgstr "Hostitel"
|
||||
|
||||
#: netbox/core/tables/tasks.py:50 netbox/ipam/forms/filtersets.py:535
|
||||
msgid "Port"
|
||||
msgstr "Přístav"
|
||||
msgstr "Port"
|
||||
|
||||
#: netbox/core/tables/tasks.py:54
|
||||
msgid "DB"
|
||||
@ -2445,7 +2442,7 @@ msgstr "Nebyli nalezeni žádní pracovníci"
|
||||
#: netbox/core/views.py:90
|
||||
#, python-brace-format
|
||||
msgid "Queued job #{id} to sync {datasource}"
|
||||
msgstr "Úloha ve frontě #{id} synchronizovat {datasource}"
|
||||
msgstr "Úloha #{id} k synchronizaci {datasource} zařazena do fronty."
|
||||
|
||||
#: netbox/core/views.py:319
|
||||
#, python-brace-format
|
||||
@ -2455,12 +2452,12 @@ msgstr "Obnovená revize konfigurace #{id}"
|
||||
#: netbox/core/views.py:412 netbox/core/views.py:455 netbox/core/views.py:531
|
||||
#, python-brace-format
|
||||
msgid "Job {job_id} not found"
|
||||
msgstr "Práce {job_id} nenalezeno"
|
||||
msgstr "Úloha {job_id} nenalezena"
|
||||
|
||||
#: netbox/core/views.py:463
|
||||
#, python-brace-format
|
||||
msgid "Job {id} has been deleted."
|
||||
msgstr "Práce {id} byl vymazán."
|
||||
msgstr "Úloha {id} byla vymazána."
|
||||
|
||||
#: netbox/core/views.py:465
|
||||
#, python-brace-format
|
||||
@ -2470,22 +2467,22 @@ msgstr "Chyba při mazání úlohy {id}: {error}"
|
||||
#: netbox/core/views.py:478 netbox/core/views.py:496
|
||||
#, python-brace-format
|
||||
msgid "Job {id} not found."
|
||||
msgstr "Práce {id} nenalezeno."
|
||||
msgstr "Úloha {id} nenalezena."
|
||||
|
||||
#: netbox/core/views.py:484
|
||||
#, python-brace-format
|
||||
msgid "Job {id} has been re-enqueued."
|
||||
msgstr "Práce {id} byla znovu zařazena do fronty."
|
||||
msgstr "Úloha {id} byla znovu zařazena do fronty."
|
||||
|
||||
#: netbox/core/views.py:519
|
||||
#, python-brace-format
|
||||
msgid "Job {id} has been enqueued."
|
||||
msgstr "Práce {id} byl zařazen do fronty."
|
||||
msgstr "Úloha {id} byla zařazena do fronty."
|
||||
|
||||
#: netbox/core/views.py:538
|
||||
#, python-brace-format
|
||||
msgid "Job {id} has been stopped."
|
||||
msgstr "Práce {id} byl zastaven."
|
||||
msgstr "Úloha {id} byla zastavena."
|
||||
|
||||
#: netbox/core/views.py:540
|
||||
#, python-brace-format
|
||||
@ -2535,7 +2532,7 @@ msgstr "4-sloupový rám"
|
||||
|
||||
#: netbox/dcim/choices.py:67
|
||||
msgid "4-post cabinet"
|
||||
msgstr "4-sloupová skříňka"
|
||||
msgstr "4-sloupová skříň"
|
||||
|
||||
#: netbox/dcim/choices.py:68
|
||||
msgid "Wall-mounted frame"
|
||||
@ -2547,7 +2544,7 @@ msgstr "Nástěnný rám (vertikální)"
|
||||
|
||||
#: netbox/dcim/choices.py:70
|
||||
msgid "Wall-mounted cabinet"
|
||||
msgstr "Nástěnná skříňka"
|
||||
msgstr "Nástěnná skříň"
|
||||
|
||||
#: netbox/dcim/choices.py:71
|
||||
msgid "Wall-mounted cabinet (vertical)"
|
||||
@ -2582,7 +2579,7 @@ msgstr "Milimetry"
|
||||
|
||||
#: netbox/dcim/choices.py:115 netbox/dcim/choices.py:1555
|
||||
msgid "Inches"
|
||||
msgstr "palce"
|
||||
msgstr "Palce"
|
||||
|
||||
#: netbox/dcim/choices.py:136 netbox/dcim/choices.py:207
|
||||
#: netbox/dcim/choices.py:254
|
||||
@ -2679,12 +2676,12 @@ msgstr "Zdola nahoru"
|
||||
|
||||
#: netbox/dcim/choices.py:214
|
||||
msgid "Top to bottom"
|
||||
msgstr "Nahoru dolů"
|
||||
msgstr "Shora dolů"
|
||||
|
||||
#: netbox/dcim/choices.py:215 netbox/dcim/choices.py:259
|
||||
#: netbox/dcim/choices.py:1305
|
||||
msgid "Passive"
|
||||
msgstr "pasivní"
|
||||
msgstr "Pasivní"
|
||||
|
||||
#: netbox/dcim/choices.py:216
|
||||
msgid "Mixed"
|
||||
@ -2802,17 +2799,17 @@ msgstr "Auto"
|
||||
|
||||
#: netbox/dcim/choices.py:1265
|
||||
msgid "Access"
|
||||
msgstr "Přístup"
|
||||
msgstr "Přístupový"
|
||||
|
||||
#: netbox/dcim/choices.py:1266 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"
|
||||
msgstr "Značkovaný"
|
||||
|
||||
#: netbox/dcim/choices.py:1267
|
||||
msgid "Tagged (All)"
|
||||
msgstr "Označeno (Vše)"
|
||||
msgstr "Značkovaný (Vše)"
|
||||
|
||||
#: netbox/dcim/choices.py:1296
|
||||
msgid "IEEE Standard"
|
||||
@ -2888,7 +2885,7 @@ msgstr "Gramy"
|
||||
#: netbox/dcim/choices.py:1572 netbox/templates/dcim/device.html:328
|
||||
#: netbox/templates/dcim/rack.html:108
|
||||
msgid "Pounds"
|
||||
msgstr "libry"
|
||||
msgstr "Libry"
|
||||
|
||||
#: netbox/dcim/choices.py:1573
|
||||
msgid "Ounces"
|
||||
@ -2896,7 +2893,7 @@ msgstr "Unce"
|
||||
|
||||
#: netbox/dcim/choices.py:1620
|
||||
msgid "Redundant"
|
||||
msgstr "Redundantní"
|
||||
msgstr "Zdvojený"
|
||||
|
||||
#: netbox/dcim/choices.py:1641
|
||||
msgid "Single phase"
|
||||
@ -2922,15 +2919,15 @@ msgstr "Nadřazená oblast (ID)"
|
||||
|
||||
#: netbox/dcim/filtersets.py:92
|
||||
msgid "Parent region (slug)"
|
||||
msgstr "Nadřazená oblast (URL zkratka)"
|
||||
msgstr "Nadřazená oblast (zkratka)"
|
||||
|
||||
#: netbox/dcim/filtersets.py:116
|
||||
msgid "Parent site group (ID)"
|
||||
msgstr "Nadřazená skupina webů (ID)"
|
||||
msgstr "Nadřazená skupina míst (ID)"
|
||||
|
||||
#: netbox/dcim/filtersets.py:122
|
||||
msgid "Parent site group (slug)"
|
||||
msgstr "Nadřazená skupina stránek (slimák)"
|
||||
msgstr "Nadřazená skupina míst (zkratka)"
|
||||
|
||||
#: netbox/dcim/filtersets.py:164 netbox/extras/filtersets.py:364
|
||||
#: netbox/ipam/filtersets.py:843 netbox/ipam/filtersets.py:995
|
||||
@ -4231,7 +4228,7 @@ msgstr "Šířka musí být nastavena, pokud není zadán typ stojanu."
|
||||
|
||||
#: netbox/dcim/forms/bulk_import.py:326
|
||||
msgid "U height must be set if not specifying a rack type."
|
||||
msgstr ""
|
||||
msgstr "Pokud není zadán typ stojanu, musí být nastavena výška U."
|
||||
|
||||
#: netbox/dcim/forms/bulk_import.py:334
|
||||
msgid "Parent site"
|
||||
@ -4890,6 +4887,11 @@ msgid ""
|
||||
"present, will be automatically replaced with the position value when "
|
||||
"creating a new module."
|
||||
msgstr ""
|
||||
"Pro hromadné vytváření jsou podporovány alfanumerické rozsahy. Smíšené "
|
||||
"případy a typy v rámci jednoho rozsahu nejsou podporovány (příklad: "
|
||||
"<code>[ge, xe] -0/0/ [0-9]</code>). Žeton <code>{module}</code>, pokud je "
|
||||
"přítomen, bude automaticky nahrazen hodnotou pozice při vytváření nového "
|
||||
"modulu."
|
||||
|
||||
#: netbox/dcim/forms/model_forms.py:1094
|
||||
msgid "Console port template"
|
||||
@ -9595,11 +9597,11 @@ msgstr "Nastavte to jako primární IP pro přiřazené zařízení"
|
||||
|
||||
#: netbox/ipam/forms/bulk_import.py:330
|
||||
msgid "Is out-of-band"
|
||||
msgstr ""
|
||||
msgstr "Je mimo pásmo"
|
||||
|
||||
#: netbox/ipam/forms/bulk_import.py:331
|
||||
msgid "Designate this as the out-of-band IP address for the assigned device"
|
||||
msgstr ""
|
||||
msgstr "Určete tuto adresu jako mimopásmovou IP adresu přiřazeného zařízení"
|
||||
|
||||
#: netbox/ipam/forms/bulk_import.py:371
|
||||
msgid "No device or virtual machine specified; cannot set as primary IP"
|
||||
@ -9609,11 +9611,11 @@ msgstr ""
|
||||
|
||||
#: netbox/ipam/forms/bulk_import.py:375
|
||||
msgid "No device specified; cannot set as out-of-band IP"
|
||||
msgstr ""
|
||||
msgstr "Není určeno žádné zařízení; nelze nastavit jako IP mimo pásmo"
|
||||
|
||||
#: netbox/ipam/forms/bulk_import.py:379
|
||||
msgid "Cannot set out-of-band IP for virtual machines"
|
||||
msgstr ""
|
||||
msgstr "Nelze nastavit IP mimo pásmo pro virtuální počítače"
|
||||
|
||||
#: netbox/ipam/forms/bulk_import.py:383
|
||||
msgid "No interface specified; cannot set as primary IP"
|
||||
@ -9621,7 +9623,7 @@ msgstr "Není určeno žádné rozhraní; nelze nastavit jako primární IP"
|
||||
|
||||
#: netbox/ipam/forms/bulk_import.py:387
|
||||
msgid "No interface specified; cannot set as out-of-band IP"
|
||||
msgstr ""
|
||||
msgstr "Není určeno žádné rozhraní; nelze nastavit jako IP mimo pásmo"
|
||||
|
||||
#: netbox/ipam/forms/bulk_import.py:422
|
||||
msgid "Auth type"
|
||||
@ -9780,7 +9782,7 @@ msgstr "Řada ASN"
|
||||
|
||||
#: netbox/ipam/forms/model_forms.py:231
|
||||
msgid "Site/VLAN Assignment"
|
||||
msgstr "Přiřazení webu/VLAN"
|
||||
msgstr ""
|
||||
|
||||
#: netbox/ipam/forms/model_forms.py:259 netbox/templates/ipam/iprange.html:10
|
||||
msgid "IP Range"
|
||||
@ -9798,7 +9800,7 @@ msgstr "Nastavte z něj primární IP pro zařízení/virtuální počítač"
|
||||
|
||||
#: netbox/ipam/forms/model_forms.py:314
|
||||
msgid "Make this the out-of-band IP for the device"
|
||||
msgstr ""
|
||||
msgstr "Nastavte z tohoto pole IP mimo pásmo zařízení"
|
||||
|
||||
#: netbox/ipam/forms/model_forms.py:329
|
||||
msgid "NAT IP (Inside)"
|
||||
@ -9811,10 +9813,12 @@ msgstr "IP adresu lze přiřadit pouze jednomu objektu."
|
||||
#: netbox/ipam/forms/model_forms.py:398
|
||||
msgid "Cannot reassign primary IP address for the parent device/VM"
|
||||
msgstr ""
|
||||
"Nelze znovu přiřadit primární adresu IP pro nadřazené zařízení/virtuální "
|
||||
"počítač"
|
||||
|
||||
#: netbox/ipam/forms/model_forms.py:402
|
||||
msgid "Cannot reassign out-of-Band IP address for the parent device"
|
||||
msgstr ""
|
||||
msgstr "Nelze znovu přiřadit IP adresu mimo pásmo pro nadřazené zařízení"
|
||||
|
||||
#: netbox/ipam/forms/model_forms.py:412
|
||||
msgid ""
|
||||
@ -9827,6 +9831,8 @@ msgid ""
|
||||
"Only IP addresses assigned to a device interface can be designated as the "
|
||||
"out-of-band IP for a device."
|
||||
msgstr ""
|
||||
"Pouze IP adresy přiřazené k rozhraní zařízení mohou být označeny jako IP "
|
||||
"adresy mimo pásmo zařízení."
|
||||
|
||||
#: netbox/ipam/forms/model_forms.py:508
|
||||
msgid "Virtual IP Address"
|
||||
@ -10220,12 +10226,12 @@ msgstr "Nelze nastavit scope_id bez scope_type."
|
||||
#: netbox/ipam/models/vlans.py:105
|
||||
#, python-brace-format
|
||||
msgid "Starting VLAN ID in range ({value}) cannot be less than {minimum}"
|
||||
msgstr ""
|
||||
msgstr "Spuštění VLAN ID v dosahu ({value}) nemůže být menší než {minimum}"
|
||||
|
||||
#: netbox/ipam/models/vlans.py:111
|
||||
#, python-brace-format
|
||||
msgid "Ending VLAN ID in range ({value}) cannot exceed {maximum}"
|
||||
msgstr ""
|
||||
msgstr "Ukončení VLAN ID v rozsahu ({value}) nesmí překročit {maximum}"
|
||||
|
||||
#: netbox/ipam/models/vlans.py:118
|
||||
#, python-brace-format
|
||||
@ -10233,6 +10239,8 @@ msgid ""
|
||||
"Ending VLAN ID in range must be greater than or equal to the starting VLAN "
|
||||
"ID ({range})"
|
||||
msgstr ""
|
||||
"Koncové ID VLAN v rozsahu musí být větší nebo roven počátečnímu ID VLAN "
|
||||
"({range})"
|
||||
|
||||
#: netbox/ipam/models/vlans.py:124
|
||||
msgid "Ranges cannot overlap."
|
||||
@ -12587,7 +12595,7 @@ msgstr "Chyba při vykreslování šablony"
|
||||
|
||||
#: netbox/templates/dcim/device/render_config.html:70
|
||||
msgid "No configuration template has been assigned for this device."
|
||||
msgstr "Pro toto zařízení nebyla přiřazena žádná konfigurační šablona."
|
||||
msgstr ""
|
||||
|
||||
#: netbox/templates/dcim/device_edit.html:44
|
||||
msgid "Parent Bay"
|
||||
@ -13852,7 +13860,7 @@ msgstr "Centrum nápovědy"
|
||||
|
||||
#: netbox/templates/inc/user_menu.html:41
|
||||
msgid "Django Admin"
|
||||
msgstr "Správce Django"
|
||||
msgstr ""
|
||||
|
||||
#: netbox/templates/inc/user_menu.html:61
|
||||
msgid "Log Out"
|
||||
@ -14266,7 +14274,6 @@ msgstr "Přidat virtuální disk"
|
||||
#: netbox/templates/virtualization/virtualmachine/render_config.html:70
|
||||
msgid "No configuration template has been assigned for this virtual machine."
|
||||
msgstr ""
|
||||
"Pro tento virtuální počítač nebyla přiřazena žádná konfigurační šablona."
|
||||
|
||||
#: netbox/templates/vpn/ikepolicy.html:10
|
||||
#: netbox/templates/vpn/ipsecprofile.html:33 netbox/vpn/tables/crypto.py:166
|
||||
@ -15365,7 +15372,6 @@ msgid ""
|
||||
"{device} belongs to a different site ({device_site}) than the cluster "
|
||||
"({cluster_site})"
|
||||
msgstr ""
|
||||
"{device} patří k jinému webu ({device_site}) než cluster ({cluster_site})"
|
||||
|
||||
#: netbox/virtualization/forms/model_forms.py:192
|
||||
msgid "Optionally pin this VM to a specific host device within the cluster"
|
||||
@ -16098,7 +16104,7 @@ msgstr "bezdrátové spoje"
|
||||
|
||||
#: netbox/wireless/models.py:236
|
||||
msgid "Must specify a unit when setting a wireless distance"
|
||||
msgstr "Při nastavování bezdrátové vzdálenosti je nutné zadat jednotku"
|
||||
msgstr ""
|
||||
|
||||
#: netbox/wireless/models.py:242 netbox/wireless/models.py:248
|
||||
#, python-brace-format
|
||||
|
Binary file not shown.
@ -6,7 +6,7 @@
|
||||
# Translators:
|
||||
# Jeff Gehlbach, 2024
|
||||
# ch, 2024
|
||||
# Frederik Spang Thomsen <frederik@progras.dk>, 2024
|
||||
# Frederik Spang <fst@progras.dk>, 2024
|
||||
# Jeremy Stretch, 2025
|
||||
#
|
||||
#, fuzzy
|
||||
@ -1235,7 +1235,7 @@ msgstr "Kredsløbsgruppeopgaver"
|
||||
|
||||
#: netbox/circuits/models/circuits.py:240
|
||||
msgid "termination"
|
||||
msgstr "opsigelse"
|
||||
msgstr ""
|
||||
|
||||
#: netbox/circuits/models/circuits.py:257
|
||||
msgid "port speed (Kbps)"
|
||||
@ -1297,15 +1297,11 @@ msgstr "kredsløbsafslutninger"
|
||||
msgid ""
|
||||
"A circuit termination must attach to either a site or a provider network."
|
||||
msgstr ""
|
||||
"En kredsløbsafslutning skal tilsluttes enten et websted eller et "
|
||||
"udbydernetværk."
|
||||
|
||||
#: netbox/circuits/models/circuits.py:310
|
||||
msgid ""
|
||||
"A circuit termination cannot attach to both a site and a provider network."
|
||||
msgstr ""
|
||||
"En kredsløbsafslutning kan ikke knyttes til både et websted og et "
|
||||
"udbydernetværk."
|
||||
|
||||
#: netbox/circuits/models/providers.py:22
|
||||
#: netbox/circuits/models/providers.py:66
|
||||
@ -9803,7 +9799,7 @@ msgstr "ASN-rækkevidde"
|
||||
|
||||
#: netbox/ipam/forms/model_forms.py:231
|
||||
msgid "Site/VLAN Assignment"
|
||||
msgstr "Websted/VLAN-tildeling"
|
||||
msgstr ""
|
||||
|
||||
#: netbox/ipam/forms/model_forms.py:259 netbox/templates/ipam/iprange.html:10
|
||||
msgid "IP Range"
|
||||
@ -12635,7 +12631,7 @@ msgstr "Fejl ved gengivelse af skabelon"
|
||||
|
||||
#: netbox/templates/dcim/device/render_config.html:70
|
||||
msgid "No configuration template has been assigned for this device."
|
||||
msgstr "Der er ikke tildelt nogen konfigurationsskabelon til denne enhed."
|
||||
msgstr ""
|
||||
|
||||
#: netbox/templates/dcim/device_edit.html:44
|
||||
msgid "Parent Bay"
|
||||
@ -13903,7 +13899,7 @@ msgstr "Hjælpecenter"
|
||||
|
||||
#: netbox/templates/inc/user_menu.html:41
|
||||
msgid "Django Admin"
|
||||
msgstr "Django Admin"
|
||||
msgstr ""
|
||||
|
||||
#: netbox/templates/inc/user_menu.html:61
|
||||
msgid "Log Out"
|
||||
@ -14317,8 +14313,6 @@ msgstr "Tilføj virtuel disk"
|
||||
#: netbox/templates/virtualization/virtualmachine/render_config.html:70
|
||||
msgid "No configuration template has been assigned for this virtual machine."
|
||||
msgstr ""
|
||||
"Der er ikke tildelt nogen konfigurationsskabelon til denne virtuelle "
|
||||
"maskine."
|
||||
|
||||
#: netbox/templates/vpn/ikepolicy.html:10
|
||||
#: netbox/templates/vpn/ipsecprofile.html:33 netbox/vpn/tables/crypto.py:166
|
||||
@ -15421,7 +15415,6 @@ msgid ""
|
||||
"{device} belongs to a different site ({device_site}) than the cluster "
|
||||
"({cluster_site})"
|
||||
msgstr ""
|
||||
"{device} tilhører et andet sted ({device_site}) end klyngen ({cluster_site})"
|
||||
|
||||
#: netbox/virtualization/forms/model_forms.py:192
|
||||
msgid "Optionally pin this VM to a specific host device within the cluster"
|
||||
@ -16151,7 +16144,7 @@ msgstr "trådløse links"
|
||||
|
||||
#: netbox/wireless/models.py:236
|
||||
msgid "Must specify a unit when setting a wireless distance"
|
||||
msgstr "Skal angive en enhed, når du indstiller en trådløs afstand"
|
||||
msgstr ""
|
||||
|
||||
#: netbox/wireless/models.py:242 netbox/wireless/models.py:248
|
||||
#, python-brace-format
|
||||
|
Binary file not shown.
@ -5,13 +5,13 @@
|
||||
#
|
||||
# Translators:
|
||||
# Martin R, 2024
|
||||
# Niklas, 2024
|
||||
# fepilins, 2024
|
||||
# Steffen, 2024
|
||||
# haagehan, 2024
|
||||
# Jeremy Stretch, 2024
|
||||
# Robin Reinhardt, 2024
|
||||
# Jeremy Stretch, 2025
|
||||
# chbally, 2025
|
||||
# Niklas, 2025
|
||||
#
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
@ -20,7 +20,7 @@ msgstr ""
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2025-01-04 05:02+0000\n"
|
||||
"PO-Revision-Date: 2023-10-30 17:48+0000\n"
|
||||
"Last-Translator: chbally, 2025\n"
|
||||
"Last-Translator: Niklas, 2025\n"
|
||||
"Language-Team: German (https://app.transifex.com/netbox-community/teams/178115/de/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
@ -1240,7 +1240,7 @@ msgstr "Transportnetzzuweisungen"
|
||||
|
||||
#: netbox/circuits/models/circuits.py:240
|
||||
msgid "termination"
|
||||
msgstr "Abschlusspunkt"
|
||||
msgstr ""
|
||||
|
||||
#: netbox/circuits/models/circuits.py:257
|
||||
msgid "port speed (Kbps)"
|
||||
@ -1303,15 +1303,11 @@ msgstr "Transportnetzabschlusspunkte"
|
||||
msgid ""
|
||||
"A circuit termination must attach to either a site or a provider network."
|
||||
msgstr ""
|
||||
"Ein Leitungsabschluss muss entweder an einen Standort oder an ein "
|
||||
"Providernetzwerk angeschlossen werden."
|
||||
|
||||
#: netbox/circuits/models/circuits.py:310
|
||||
msgid ""
|
||||
"A circuit termination cannot attach to both a site and a provider network."
|
||||
msgstr ""
|
||||
"Ein Leitungsabschluss kann nicht sowohl an einen Standort als auch an ein "
|
||||
"Providernetzwerk angeschlossen werden."
|
||||
|
||||
#: netbox/circuits/models/providers.py:22
|
||||
#: netbox/circuits/models/providers.py:66
|
||||
@ -8438,8 +8434,7 @@ msgstr "Gewicht anzeigen"
|
||||
|
||||
#: netbox/extras/models/customfields.py:173
|
||||
msgid "Fields with higher weights appear lower in a form."
|
||||
msgstr ""
|
||||
"Felder mit höheren Gewichten werden in einem Formular niedriger angezeigt."
|
||||
msgstr "Höher gewichtete Felder werden im Formular weiter unten angezeigt."
|
||||
|
||||
#: netbox/extras/models/customfields.py:178
|
||||
msgid "minimum value"
|
||||
@ -9531,7 +9526,7 @@ msgstr "Dienst (ID)"
|
||||
|
||||
#: netbox/ipam/filtersets.py:675
|
||||
msgid "NAT inside IP address (ID)"
|
||||
msgstr "NAT innerhalb der IP-Adresse (ID)"
|
||||
msgstr "NAT inside IP-Adresse (ID)"
|
||||
|
||||
#: netbox/ipam/filtersets.py:1043 netbox/ipam/forms/bulk_import.py:322
|
||||
msgid "Assigned interface"
|
||||
@ -9959,7 +9954,7 @@ msgstr "Ziel der Route"
|
||||
#: netbox/templates/ipam/aggregate.html:11
|
||||
#: netbox/templates/ipam/prefix.html:38
|
||||
msgid "Aggregate"
|
||||
msgstr "Aggregat"
|
||||
msgstr "Aggregieren"
|
||||
|
||||
#: netbox/ipam/forms/model_forms.py:135 netbox/templates/ipam/asnrange.html:12
|
||||
msgid "ASN Range"
|
||||
@ -9967,7 +9962,7 @@ msgstr "ASN-Bereich"
|
||||
|
||||
#: netbox/ipam/forms/model_forms.py:231
|
||||
msgid "Site/VLAN Assignment"
|
||||
msgstr "Standort-/VLAN-Zuweisung"
|
||||
msgstr ""
|
||||
|
||||
#: netbox/ipam/forms/model_forms.py:259 netbox/templates/ipam/iprange.html:10
|
||||
msgid "IP Range"
|
||||
@ -10095,9 +10090,7 @@ msgstr "ASN-Bereiche"
|
||||
#: netbox/ipam/models/asns.py:72
|
||||
#, python-brace-format
|
||||
msgid "Starting ASN ({start}) must be lower than ending ASN ({end})."
|
||||
msgstr ""
|
||||
"ASN wird gestartet ({start}) muss niedriger sein als das Ende der ASN "
|
||||
"({end})."
|
||||
msgstr "Der ASN ({start}) muss niedriger sein als das letzte ASN ({end})."
|
||||
|
||||
#: netbox/ipam/models/asns.py:104
|
||||
msgid "Regional Internet Registry responsible for this AS number space"
|
||||
@ -10171,7 +10164,7 @@ msgstr "Aggregat"
|
||||
|
||||
#: netbox/ipam/models/ip.py:116
|
||||
msgid "aggregates"
|
||||
msgstr "Aggregate"
|
||||
msgstr "aggregiert"
|
||||
|
||||
#: netbox/ipam/models/ip.py:132
|
||||
msgid "Cannot create aggregate with /0 mask."
|
||||
@ -10227,7 +10220,8 @@ msgstr "ist ein Pool"
|
||||
#: netbox/ipam/models/ip.py:267
|
||||
msgid "All IP addresses within this prefix are considered usable"
|
||||
msgstr ""
|
||||
"Alle IP-Adressen innerhalb dieses Prefixes werden als nutzbar betrachtet"
|
||||
"Alle IP-Adressen (inklusive Netzwerk- und Broadcast-Adresse) innerhalb "
|
||||
"dieses Prefixes werden als nutzbar betrachtet"
|
||||
|
||||
#: netbox/ipam/models/ip.py:270 netbox/ipam/models/ip.py:537
|
||||
msgid "mark utilized"
|
||||
@ -10503,7 +10497,7 @@ msgstr "einzigartigen Raum erzwingen"
|
||||
|
||||
#: netbox/ipam/models/vrfs.py:43
|
||||
msgid "Prevent duplicate prefixes/IP addresses within this VRF"
|
||||
msgstr "Vermeiden Sie doppelte Präfixe/IP-Adressen in diesem VRF"
|
||||
msgstr "Vermeiden Sie doppelte Präfixe/IP-Adressen in dieser VRF"
|
||||
|
||||
#: netbox/ipam/models/vrfs.py:63 netbox/netbox/navigation/menu.py:186
|
||||
#: netbox/netbox/navigation/menu.py:188
|
||||
@ -10524,7 +10518,7 @@ msgstr "Routenziele"
|
||||
|
||||
#: netbox/ipam/tables/asn.py:52
|
||||
msgid "ASDOT"
|
||||
msgstr "ALS PUNKT"
|
||||
msgstr "ASDOT"
|
||||
|
||||
#: netbox/ipam/tables/asn.py:57
|
||||
msgid "Site Count"
|
||||
@ -11552,7 +11546,7 @@ msgstr ""
|
||||
#: netbox/netbox/registry.py:14
|
||||
#, python-brace-format
|
||||
msgid "Invalid store: {key}"
|
||||
msgstr "Ungültiger Shop: {key}"
|
||||
msgstr "Ungültiger Store: {key}"
|
||||
|
||||
#: netbox/netbox/registry.py:17
|
||||
msgid "Cannot add stores to registry after initialization"
|
||||
@ -12431,7 +12425,7 @@ msgstr "Warteschlange"
|
||||
|
||||
#: netbox/templates/core/rq_task.html:65
|
||||
msgid "Timeout"
|
||||
msgstr "Auszeit"
|
||||
msgstr "Timeout"
|
||||
|
||||
#: netbox/templates/core/rq_task.html:69
|
||||
msgid "Result TTL"
|
||||
@ -12501,7 +12495,7 @@ msgstr "Anzahl fehlgeschlagener Jobs"
|
||||
|
||||
#: netbox/templates/core/rq_worker.html:75
|
||||
msgid "Total working time"
|
||||
msgstr "Gesamtarbeitszeit"
|
||||
msgstr "Gesamtlaufzeit"
|
||||
|
||||
#: netbox/templates/core/rq_worker.html:76
|
||||
msgid "seconds"
|
||||
@ -12827,7 +12821,7 @@ msgstr "Fehler beim Rendern der Vorlage"
|
||||
|
||||
#: netbox/templates/dcim/device/render_config.html:70
|
||||
msgid "No configuration template has been assigned for this device."
|
||||
msgstr "Diesem Gerät wurde keine Konfigurationsvorlage zugewiesen."
|
||||
msgstr ""
|
||||
|
||||
#: netbox/templates/dcim/device_edit.html:44
|
||||
msgid "Parent Bay"
|
||||
@ -14098,7 +14092,7 @@ msgstr "Hilfecenter"
|
||||
|
||||
#: netbox/templates/inc/user_menu.html:41
|
||||
msgid "Django Admin"
|
||||
msgstr "Django-Administrator"
|
||||
msgstr ""
|
||||
|
||||
#: netbox/templates/inc/user_menu.html:61
|
||||
msgid "Log Out"
|
||||
@ -14513,7 +14507,6 @@ msgstr "Virtuelles Laufwerk hinzufügen"
|
||||
#: netbox/templates/virtualization/virtualmachine/render_config.html:70
|
||||
msgid "No configuration template has been assigned for this virtual machine."
|
||||
msgstr ""
|
||||
"Für diese virtuelle Maschine wurde keine Konfigurationsvorlage zugewiesen."
|
||||
|
||||
#: netbox/templates/vpn/ikepolicy.html:10
|
||||
#: netbox/templates/vpn/ipsecprofile.html:33 netbox/vpn/tables/crypto.py:166
|
||||
@ -14540,11 +14533,11 @@ msgstr "Secret anzeigen"
|
||||
#: netbox/vpn/forms/model_forms.py:316 netbox/vpn/forms/model_forms.py:352
|
||||
#: netbox/vpn/tables/crypto.py:68 netbox/vpn/tables/crypto.py:134
|
||||
msgid "Proposals"
|
||||
msgstr "Vorschläge"
|
||||
msgstr "Proposals"
|
||||
|
||||
#: netbox/templates/vpn/ikeproposal.html:10
|
||||
msgid "IKE Proposal"
|
||||
msgstr "IKE-Vorschlag"
|
||||
msgstr "IKE- Proposal"
|
||||
|
||||
#: netbox/templates/vpn/ikeproposal.html:21 netbox/vpn/forms/bulk_edit.py:97
|
||||
#: netbox/vpn/forms/bulk_import.py:145 netbox/vpn/forms/filtersets.py:101
|
||||
@ -14575,7 +14568,7 @@ msgstr "DH-Gruppe"
|
||||
#: netbox/templates/vpn/ipsecproposal.html:29
|
||||
#: netbox/vpn/forms/bulk_edit.py:182 netbox/vpn/models/crypto.py:146
|
||||
msgid "SA lifetime (seconds)"
|
||||
msgstr "SA-Lebensdauer (Sekunden)"
|
||||
msgstr "SA-Gültigkeitsdauer (Sekunden)"
|
||||
|
||||
#: netbox/templates/vpn/ipsecpolicy.html:10
|
||||
#: netbox/templates/vpn/ipsecprofile.html:66 netbox/vpn/tables/crypto.py:170
|
||||
@ -14660,7 +14653,7 @@ msgstr "Peer-Abschlusspunkt"
|
||||
|
||||
#: netbox/templates/wireless/inc/authentication_attrs.html:12
|
||||
msgid "Cipher"
|
||||
msgstr "Chiffre"
|
||||
msgstr "Verschlüsselungsalgorithmus"
|
||||
|
||||
#: netbox/templates/wireless/inc/authentication_attrs.html:16
|
||||
msgid "PSK"
|
||||
@ -15638,8 +15631,6 @@ msgid ""
|
||||
"{device} belongs to a different site ({device_site}) than the cluster "
|
||||
"({cluster_site})"
|
||||
msgstr ""
|
||||
"{device} gehört zu einer anderen Seite ({device_site}) als der Cluster "
|
||||
"({cluster_site})"
|
||||
|
||||
#: netbox/virtualization/forms/model_forms.py:192
|
||||
msgid "Optionally pin this VM to a specific host device within the cluster"
|
||||
@ -15977,7 +15968,7 @@ msgstr "SA-Lebendauer"
|
||||
#: netbox/wireless/forms/filtersets.py:64
|
||||
#: netbox/wireless/forms/filtersets.py:98
|
||||
msgid "Pre-shared key"
|
||||
msgstr "Vorab geteilter Schlüssel (Pre-shared key)"
|
||||
msgstr "Vorab geteilter Schlüssel (PSK)"
|
||||
|
||||
#: netbox/vpn/forms/bulk_edit.py:237 netbox/vpn/forms/bulk_import.py:239
|
||||
#: netbox/vpn/forms/filtersets.py:199 netbox/vpn/forms/model_forms.py:370
|
||||
@ -15993,7 +15984,7 @@ msgstr "IPSec-Richtlinie"
|
||||
|
||||
#: netbox/vpn/forms/bulk_import.py:50
|
||||
msgid "Tunnel encapsulation"
|
||||
msgstr "Tunnelkapselung"
|
||||
msgstr "Tunnel Encapsulation"
|
||||
|
||||
#: netbox/vpn/forms/bulk_import.py:83
|
||||
msgid "Operational role"
|
||||
@ -16140,7 +16131,7 @@ msgstr "Vorschläge"
|
||||
|
||||
#: netbox/vpn/models/crypto.py:91 netbox/wireless/models.py:39
|
||||
msgid "pre-shared key"
|
||||
msgstr "vorab geteilter Schlüssel"
|
||||
msgstr "vorab geteilter Schlüssel (PSK)"
|
||||
|
||||
#: netbox/vpn/models/crypto.py:105
|
||||
msgid "IKE policies"
|
||||
@ -16273,7 +16264,7 @@ msgstr "SA-Lebensdauer"
|
||||
|
||||
#: netbox/vpn/tables/crypto.py:71
|
||||
msgid "Pre-shared Key"
|
||||
msgstr "Vorab geteilter Schlüssel"
|
||||
msgstr "Vorab geteilter Schlüssel (PSK)"
|
||||
|
||||
#: netbox/vpn/tables/crypto.py:103
|
||||
msgid "SA Lifetime (Seconds)"
|
||||
@ -16390,7 +16381,6 @@ msgstr "Funkverbindungen"
|
||||
#: netbox/wireless/models.py:236
|
||||
msgid "Must specify a unit when setting a wireless distance"
|
||||
msgstr ""
|
||||
"Beim Einstellen einer Funkreichweite muss eine Einheit angegeben werden"
|
||||
|
||||
#: netbox/wireless/models.py:242 netbox/wireless/models.py:248
|
||||
#, python-brace-format
|
||||
|
File diff suppressed because it is too large
Load Diff
Binary file not shown.
@ -25,7 +25,7 @@ msgstr ""
|
||||
#: netbox/templates/users/token.html:17 netbox/users/forms/bulk_import.py:39
|
||||
#: netbox/users/forms/model_forms.py:112
|
||||
msgid "Key"
|
||||
msgstr "Llave"
|
||||
msgstr "Clave"
|
||||
|
||||
#: netbox/account/tables.py:31 netbox/users/forms/filtersets.py:132
|
||||
msgid "Write Enabled"
|
||||
@ -61,7 +61,7 @@ msgstr "Utilizado por última vez"
|
||||
#: netbox/templates/users/token.html:47 netbox/users/forms/bulk_edit.py:122
|
||||
#: netbox/users/forms/model_forms.py:124
|
||||
msgid "Allowed IPs"
|
||||
msgstr "IPs permitidas"
|
||||
msgstr "IP permitidas"
|
||||
|
||||
#: netbox/account/views.py:114
|
||||
#, python-brace-format
|
||||
@ -117,7 +117,7 @@ msgstr "Activo"
|
||||
#: netbox/dcim/choices.py:1659 netbox/virtualization/choices.py:24
|
||||
#: netbox/virtualization/choices.py:43
|
||||
msgid "Offline"
|
||||
msgstr "Desconectado"
|
||||
msgstr "Fuera de línea"
|
||||
|
||||
#: netbox/circuits/choices.py:25
|
||||
msgid "Deprovisioning"
|
||||
@ -125,7 +125,7 @@ msgstr "Desaprovisionamiento"
|
||||
|
||||
#: netbox/circuits/choices.py:26
|
||||
msgid "Decommissioned"
|
||||
msgstr "Desmantelado"
|
||||
msgstr "Retirado"
|
||||
|
||||
#: netbox/circuits/choices.py:90 netbox/dcim/choices.py:1619
|
||||
#: netbox/tenancy/choices.py:17
|
||||
@ -167,7 +167,7 @@ msgstr "Región (ID)"
|
||||
#: netbox/ipam/filtersets.py:968 netbox/virtualization/filtersets.py:52
|
||||
#: netbox/virtualization/filtersets.py:180 netbox/vpn/filtersets.py:353
|
||||
msgid "Region (slug)"
|
||||
msgstr "Región (slug)"
|
||||
msgstr "Región (babosa)"
|
||||
|
||||
#: netbox/circuits/filtersets.py:44 netbox/circuits/filtersets.py:211
|
||||
#: netbox/dcim/filtersets.py:128 netbox/dcim/filtersets.py:225
|
||||
@ -261,7 +261,7 @@ msgstr "Sitio"
|
||||
#: netbox/virtualization/filtersets.py:75
|
||||
#: netbox/virtualization/filtersets.py:203 netbox/vpn/filtersets.py:363
|
||||
msgid "Site (slug)"
|
||||
msgstr "Sitio (babosa)"
|
||||
msgstr "Sitio (slug)"
|
||||
|
||||
#: netbox/circuits/filtersets.py:67
|
||||
msgid "ASN (ID)"
|
||||
@ -284,7 +284,7 @@ msgstr "Proveedor (ID)"
|
||||
#: netbox/circuits/filtersets.py:162 netbox/circuits/filtersets.py:289
|
||||
#: netbox/circuits/filtersets.py:331 netbox/ipam/filtersets.py:251
|
||||
msgid "Provider (slug)"
|
||||
msgstr "Proveedor (babosa)"
|
||||
msgstr "Proveedor (slug)"
|
||||
|
||||
#: netbox/circuits/filtersets.py:167
|
||||
msgid "Provider account (ID)"
|
||||
@ -394,7 +394,7 @@ msgstr "Grupo de circuitos (slug)"
|
||||
#: netbox/netbox/navigation/menu.py:172 netbox/netbox/navigation/menu.py:175
|
||||
#: netbox/templates/circuits/provider.html:23
|
||||
msgid "ASNs"
|
||||
msgstr "ASNs"
|
||||
msgstr "ASN"
|
||||
|
||||
#: netbox/circuits/forms/bulk_edit.py:34 netbox/circuits/forms/bulk_edit.py:56
|
||||
#: netbox/circuits/forms/bulk_edit.py:83
|
||||
@ -1234,7 +1234,7 @@ msgstr "Asignaciones de grupos de circuitos"
|
||||
|
||||
#: netbox/circuits/models/circuits.py:240
|
||||
msgid "termination"
|
||||
msgstr "terminación"
|
||||
msgstr ""
|
||||
|
||||
#: netbox/circuits/models/circuits.py:257
|
||||
msgid "port speed (Kbps)"
|
||||
@ -1296,15 +1296,11 @@ msgstr "terminaciones de circuitos"
|
||||
msgid ""
|
||||
"A circuit termination must attach to either a site or a provider network."
|
||||
msgstr ""
|
||||
"Una terminación de circuito debe conectarse a un sitio o a una red de "
|
||||
"proveedores."
|
||||
|
||||
#: netbox/circuits/models/circuits.py:310
|
||||
msgid ""
|
||||
"A circuit termination cannot attach to both a site and a provider network."
|
||||
msgstr ""
|
||||
"Una terminación de circuito no puede conectarse tanto a un sitio como a una "
|
||||
"red de proveedores."
|
||||
|
||||
#: netbox/circuits/models/providers.py:22
|
||||
#: netbox/circuits/models/providers.py:66
|
||||
@ -9913,7 +9909,7 @@ msgstr "Gama ASN"
|
||||
|
||||
#: netbox/ipam/forms/model_forms.py:231
|
||||
msgid "Site/VLAN Assignment"
|
||||
msgstr "Asignación de sitio/VLAN"
|
||||
msgstr ""
|
||||
|
||||
#: netbox/ipam/forms/model_forms.py:259 netbox/templates/ipam/iprange.html:10
|
||||
msgid "IP Range"
|
||||
@ -12769,7 +12765,6 @@ msgstr "Error al renderizar la plantilla"
|
||||
#: netbox/templates/dcim/device/render_config.html:70
|
||||
msgid "No configuration template has been assigned for this device."
|
||||
msgstr ""
|
||||
"No se ha asignado ninguna plantilla de configuración para este dispositivo."
|
||||
|
||||
#: netbox/templates/dcim/device_edit.html:44
|
||||
msgid "Parent Bay"
|
||||
@ -14039,7 +14034,7 @@ msgstr "Centro de ayuda"
|
||||
|
||||
#: netbox/templates/inc/user_menu.html:41
|
||||
msgid "Django Admin"
|
||||
msgstr "Administrador de Django"
|
||||
msgstr ""
|
||||
|
||||
#: netbox/templates/inc/user_menu.html:61
|
||||
msgid "Log Out"
|
||||
@ -14454,8 +14449,6 @@ msgstr "Agregar disco virtual"
|
||||
#: netbox/templates/virtualization/virtualmachine/render_config.html:70
|
||||
msgid "No configuration template has been assigned for this virtual machine."
|
||||
msgstr ""
|
||||
"No se ha asignado ninguna plantilla de configuración para esta máquina "
|
||||
"virtual."
|
||||
|
||||
#: netbox/templates/vpn/ikepolicy.html:10
|
||||
#: netbox/templates/vpn/ipsecprofile.html:33 netbox/vpn/tables/crypto.py:166
|
||||
@ -15576,8 +15569,6 @@ msgid ""
|
||||
"{device} belongs to a different site ({device_site}) than the cluster "
|
||||
"({cluster_site})"
|
||||
msgstr ""
|
||||
"{device} pertenece a un sitio diferente ({device_site}) que el clúster "
|
||||
"({cluster_site})"
|
||||
|
||||
#: netbox/virtualization/forms/model_forms.py:192
|
||||
msgid "Optionally pin this VM to a specific host device within the cluster"
|
||||
@ -16317,7 +16308,7 @@ msgstr "enlaces inalámbricos"
|
||||
|
||||
#: netbox/wireless/models.py:236
|
||||
msgid "Must specify a unit when setting a wireless distance"
|
||||
msgstr "Debe especificar una unidad al configurar una distancia inalámbrica"
|
||||
msgstr ""
|
||||
|
||||
#: netbox/wireless/models.py:242 netbox/wireless/models.py:248
|
||||
#, python-brace-format
|
||||
|
Binary file not shown.
@ -11,8 +11,10 @@
|
||||
# Jean Benoit <jean@unistra.fr>, 2024
|
||||
# thomas rivemale, 2024
|
||||
# Jeff Gehlbach, 2024
|
||||
# Jeremy Stretch, 2024
|
||||
# marcpaulchand <paul@u129.fr>, 2025
|
||||
# Jeremy Stretch, 2025
|
||||
# Mathieu, 2025
|
||||
# Étienne Brunel, 2025
|
||||
#
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
@ -21,7 +23,7 @@ msgstr ""
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2025-01-04 05:02+0000\n"
|
||||
"PO-Revision-Date: 2023-10-30 17:48+0000\n"
|
||||
"Last-Translator: marcpaulchand <paul@u129.fr>, 2025\n"
|
||||
"Last-Translator: Étienne Brunel, 2025\n"
|
||||
"Language-Team: French (https://app.transifex.com/netbox-community/teams/178115/fr/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
@ -935,7 +937,7 @@ msgstr "État opérationnel"
|
||||
#: netbox/vpn/forms/bulk_import.py:63 netbox/wireless/forms/bulk_import.py:59
|
||||
#: netbox/wireless/forms/bulk_import.py:101
|
||||
msgid "Assigned tenant"
|
||||
msgstr "Locataire associé"
|
||||
msgstr "Entité associée"
|
||||
|
||||
#: netbox/circuits/forms/bulk_import.py:120
|
||||
#: netbox/templates/circuits/inc/circuit_termination.html:6
|
||||
@ -1242,7 +1244,7 @@ msgstr "Assignations de groupes de circuits"
|
||||
|
||||
#: netbox/circuits/models/circuits.py:240
|
||||
msgid "termination"
|
||||
msgstr "résiliation"
|
||||
msgstr ""
|
||||
|
||||
#: netbox/circuits/models/circuits.py:257
|
||||
msgid "port speed (Kbps)"
|
||||
@ -1304,15 +1306,11 @@ msgstr "terminaisons de circuits"
|
||||
msgid ""
|
||||
"A circuit termination must attach to either a site or a provider network."
|
||||
msgstr ""
|
||||
"Une terminaison de circuit doit être connectée à un site ou à un réseau "
|
||||
"fournisseur."
|
||||
|
||||
#: netbox/circuits/models/circuits.py:310
|
||||
msgid ""
|
||||
"A circuit termination cannot attach to both a site and a provider network."
|
||||
msgstr ""
|
||||
"Une terminaison de circuit ne peut pas être connectée à la fois à un site et"
|
||||
" à un réseau fournisseur."
|
||||
|
||||
#: netbox/circuits/models/providers.py:22
|
||||
#: netbox/circuits/models/providers.py:66
|
||||
@ -3205,7 +3203,7 @@ msgstr "Est un membre virtuel du châssis"
|
||||
|
||||
#: netbox/dcim/filtersets.py:1164
|
||||
msgid "OOB IP (ID)"
|
||||
msgstr "ASTUCE SUR L'EMPLOI (ID)"
|
||||
msgstr "GESTION HORS BANDE (ID)"
|
||||
|
||||
#: netbox/dcim/filtersets.py:1168
|
||||
msgid "Has virtual device context"
|
||||
@ -3334,7 +3332,7 @@ msgstr "VRF (RD)"
|
||||
#: netbox/dcim/filtersets.py:1624 netbox/ipam/filtersets.py:1032
|
||||
#: netbox/vpn/filtersets.py:342
|
||||
msgid "L2VPN (ID)"
|
||||
msgstr "L2VPN (IDENTIFIANT)"
|
||||
msgstr "L2VPN (ID)"
|
||||
|
||||
#: netbox/dcim/filtersets.py:1630 netbox/dcim/forms/filtersets.py:1433
|
||||
#: netbox/dcim/tables/devices.py:570 netbox/ipam/filtersets.py:1038
|
||||
@ -3380,7 +3378,7 @@ msgstr "Contexte du périphérique virtuel"
|
||||
|
||||
#: netbox/dcim/filtersets.py:1719
|
||||
msgid "Virtual Device Context (Identifier)"
|
||||
msgstr "Contexte du périphérique virtuel (identifiant)"
|
||||
msgstr "Contexte du périphérique virtuel (Identifiant)"
|
||||
|
||||
#: netbox/dcim/filtersets.py:1730
|
||||
#: netbox/templates/wireless/wirelesslan.html:11
|
||||
@ -3418,12 +3416,12 @@ msgstr "Master (nom)"
|
||||
|
||||
#: netbox/dcim/filtersets.py:1939 netbox/tenancy/filtersets.py:245
|
||||
msgid "Tenant (ID)"
|
||||
msgstr "Locataire (ID)"
|
||||
msgstr "Entité (ID)"
|
||||
|
||||
#: netbox/dcim/filtersets.py:1945 netbox/extras/filtersets.py:618
|
||||
#: netbox/tenancy/filtersets.py:251
|
||||
msgid "Tenant (slug)"
|
||||
msgstr "Locataire (slug)"
|
||||
msgstr "Entité (slug)"
|
||||
|
||||
#: netbox/dcim/filtersets.py:1981 netbox/dcim/forms/filtersets.py:1077
|
||||
msgid "Unterminated"
|
||||
@ -3474,7 +3472,7 @@ msgstr "Téléphone de contact"
|
||||
|
||||
#: netbox/dcim/forms/bulk_edit.py:144
|
||||
msgid "Contact E-mail"
|
||||
msgstr "Adresse électronique de contact"
|
||||
msgstr "Adresse mail de contact"
|
||||
|
||||
#: netbox/dcim/forms/bulk_edit.py:147 netbox/dcim/forms/bulk_import.py:123
|
||||
#: netbox/dcim/forms/model_forms.py:128
|
||||
@ -3691,7 +3689,7 @@ msgstr "Étiquette d'actif"
|
||||
#: netbox/templates/dcim/moduletype.html:41 netbox/templates/dcim/rack.html:65
|
||||
#: netbox/templates/dcim/racktype.html:28
|
||||
msgid "Airflow"
|
||||
msgstr "Débit d'air"
|
||||
msgstr "Flux d'air"
|
||||
|
||||
#: netbox/dcim/forms/bulk_edit.py:446 netbox/dcim/forms/bulk_edit.py:925
|
||||
#: netbox/dcim/forms/bulk_import.py:344 netbox/dcim/forms/bulk_import.py:347
|
||||
@ -3732,7 +3730,7 @@ msgstr "Plateforme par défaut"
|
||||
#: netbox/dcim/forms/bulk_edit.py:511 netbox/dcim/forms/bulk_edit.py:570
|
||||
#: netbox/dcim/forms/filtersets.py:502 netbox/dcim/forms/filtersets.py:622
|
||||
msgid "Part number"
|
||||
msgstr "Numéro de pièce"
|
||||
msgstr "Référence de pièce"
|
||||
|
||||
#: netbox/dcim/forms/bulk_edit.py:515
|
||||
msgid "U height"
|
||||
@ -4233,7 +4231,7 @@ msgstr "Unité de poids de la baie"
|
||||
|
||||
#: netbox/dcim/forms/bulk_import.py:245
|
||||
msgid "Name of assigned tenant"
|
||||
msgstr "Nom du locataire associé"
|
||||
msgstr "Nom de l'entité associée"
|
||||
|
||||
#: netbox/dcim/forms/bulk_import.py:257
|
||||
msgid "Name of assigned role"
|
||||
@ -4250,11 +4248,11 @@ msgstr "Direction du flux d'air"
|
||||
|
||||
#: netbox/dcim/forms/bulk_import.py:324
|
||||
msgid "Width must be set if not specifying a rack type."
|
||||
msgstr ""
|
||||
msgstr "La largeur doit être définie si aucun type de rack n'est spécifié."
|
||||
|
||||
#: netbox/dcim/forms/bulk_import.py:326
|
||||
msgid "U height must be set if not specifying a rack type."
|
||||
msgstr ""
|
||||
msgstr "La hauteur U doit être définie si aucun type de rack n'est spécifié."
|
||||
|
||||
#: netbox/dcim/forms/bulk_import.py:334
|
||||
msgid "Parent site"
|
||||
@ -4340,7 +4338,7 @@ msgstr "Baie attribuée (le cas échéant)"
|
||||
|
||||
#: netbox/dcim/forms/bulk_import.py:582
|
||||
msgid "Face"
|
||||
msgstr "Visage"
|
||||
msgstr "Orientation"
|
||||
|
||||
#: netbox/dcim/forms/bulk_import.py:585
|
||||
msgid "Mounted rack face"
|
||||
@ -4427,11 +4425,11 @@ msgstr "Interface pour les parents"
|
||||
#: netbox/virtualization/forms/bulk_import.py:162
|
||||
#: netbox/virtualization/forms/model_forms.py:313
|
||||
msgid "Bridged interface"
|
||||
msgstr "Interface pontée"
|
||||
msgstr "Interface switchée"
|
||||
|
||||
#: netbox/dcim/forms/bulk_import.py:869
|
||||
msgid "Lag"
|
||||
msgstr "Retard"
|
||||
msgstr "Lag"
|
||||
|
||||
#: netbox/dcim/forms/bulk_import.py:873
|
||||
msgid "Parent LAG interface"
|
||||
@ -4460,7 +4458,7 @@ msgstr "Mode PoE"
|
||||
|
||||
#: netbox/dcim/forms/bulk_import.py:901
|
||||
msgid "Poe type"
|
||||
msgstr "Type de poteau"
|
||||
msgstr "Type de POE"
|
||||
|
||||
#: netbox/dcim/forms/bulk_import.py:910
|
||||
#: netbox/virtualization/forms/bulk_import.py:168
|
||||
@ -4919,6 +4917,11 @@ msgid ""
|
||||
"present, will be automatically replaced with the position value when "
|
||||
"creating a new module."
|
||||
msgstr ""
|
||||
"Les plages alphanumériques sont prises en charge pour la création en masse. "
|
||||
"Les mélanges de casses ou de types au sein d'une même plage ne sont pas pris"
|
||||
" en charge (exemple : <code>[ge,xe]-0/0/[0-9]</code>). Le jeton "
|
||||
"<code>{module}</code>, s'il est présent, sera automatiquement remplacé par "
|
||||
"la valeur de position lors de la création d'un nouveau module."
|
||||
|
||||
#: netbox/dcim/forms/model_forms.py:1094
|
||||
msgid "Console port template"
|
||||
@ -7624,7 +7627,7 @@ msgstr "Type de cluster (slug)"
|
||||
#: netbox/extras/filtersets.py:601 netbox/tenancy/forms/forms.py:16
|
||||
#: netbox/tenancy/forms/forms.py:39
|
||||
msgid "Tenant group"
|
||||
msgstr "Groupe de locataires"
|
||||
msgstr "Groupe d'entitées"
|
||||
|
||||
#: netbox/extras/filtersets.py:607 netbox/tenancy/filtersets.py:188
|
||||
#: netbox/tenancy/filtersets.py:208
|
||||
@ -7988,7 +7991,7 @@ msgstr "Clusters"
|
||||
#: netbox/extras/forms/filtersets.py:391
|
||||
#: netbox/extras/forms/model_forms.py:557
|
||||
msgid "Tenant groups"
|
||||
msgstr "Groupes de locataires"
|
||||
msgstr "Groupes d'entitées"
|
||||
|
||||
#: netbox/extras/forms/model_forms.py:49
|
||||
msgid "The type(s) of object that have this custom field"
|
||||
@ -8149,7 +8152,7 @@ msgstr "Groupe de notifications"
|
||||
#: netbox/extras/forms/model_forms.py:562 netbox/netbox/navigation/menu.py:26
|
||||
#: netbox/tenancy/tables/tenants.py:22
|
||||
msgid "Tenants"
|
||||
msgstr "Locataires"
|
||||
msgstr "Entité"
|
||||
|
||||
#: netbox/extras/forms/model_forms.py:606
|
||||
msgid "Data is populated from the remote source selected below."
|
||||
@ -8434,8 +8437,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Expression régulière à appliquer aux valeurs des champs de texte. Utilisez ^"
|
||||
" et $ pour forcer la mise en correspondance de la chaîne entière. Par "
|
||||
"exemple, <code>^ [DE A À Z]{3}$</code> limitera les valeurs à exactement "
|
||||
"trois lettres majuscules."
|
||||
"exemple, <code>^[A-Z]{3}$</code> limitera les valeurs à exactement trois "
|
||||
"lettres majuscules."
|
||||
|
||||
#: netbox/extras/models/customfields.py:201
|
||||
msgid "choice set"
|
||||
@ -8740,10 +8743,9 @@ msgid ""
|
||||
msgstr ""
|
||||
"Modèle Jinja2 pour un corps de requête personnalisé. Si ce champ est vide, "
|
||||
"un objet JSON représentant la modification sera inclus. Les données "
|
||||
"contextuelles disponibles incluent : <code>événement</code>, "
|
||||
"<code>modèle</code>, <code>horodatage</code>, <code>nom "
|
||||
"d'utilisateur</code>, <code>identifiant_demande</code>, et "
|
||||
"<code>données</code>."
|
||||
"contextuelles disponibles incluent : <code>event</code>, <code>model</code>,"
|
||||
" <code>timestamp</code>, <code>username</code>, <code>request_id</code>, et "
|
||||
"<code>data</code>."
|
||||
|
||||
#: netbox/extras/models/models.py:204
|
||||
msgid "secret"
|
||||
@ -8755,10 +8757,10 @@ msgid ""
|
||||
"header containing a HMAC hex digest of the payload body using the secret as "
|
||||
"the key. The secret is not transmitted in the request."
|
||||
msgstr ""
|
||||
"Lorsqu'elle sera fournie, la demande comprendra un <code>Signature "
|
||||
"X-Hook</code> en-tête contenant un condensé hexadécimal HMAC du corps de la "
|
||||
"charge utile en utilisant le secret comme clé. Le secret n'est pas transmis "
|
||||
"dans la demande."
|
||||
"Lorsqu'elle sera fournie, la demande comprendra un <code>X-Hook-"
|
||||
"Signature</code> en-tête contenant un condensé hexadécimal HMAC du corps de "
|
||||
"la charge utile en utilisant le secret comme clé. Le secret n'est pas "
|
||||
"transmis dans la demande."
|
||||
|
||||
#: netbox/extras/models/models.py:215
|
||||
msgid "Enable SSL certificate verification. Disable with caution!"
|
||||
@ -8841,13 +8843,11 @@ msgid ""
|
||||
"context variable named <code>queryset</code>."
|
||||
msgstr ""
|
||||
"Code du modèle Jinja2. La liste des objets exportés est transmise sous forme"
|
||||
" de variable de contexte nommée <code>ensemble de requêtes</code>."
|
||||
" de variable de contexte nommée <code>queryset</code>."
|
||||
|
||||
#: netbox/extras/models/models.py:410
|
||||
msgid "Defaults to <code>text/plain; charset=utf-8</code>"
|
||||
msgstr ""
|
||||
"La valeur par défaut est <code>texte/plain ; jeu de caractères = "
|
||||
"utf-8</code>"
|
||||
msgstr "La valeur par défaut est <code>text/plain; charset=utf-8</code>"
|
||||
|
||||
#: netbox/extras/models/models.py:413
|
||||
msgid "file extension"
|
||||
@ -9743,11 +9743,11 @@ msgstr "Faites-en l'adresse IP principale de l'appareil attribué"
|
||||
|
||||
#: netbox/ipam/forms/bulk_import.py:330
|
||||
msgid "Is out-of-band"
|
||||
msgstr ""
|
||||
msgstr "Est hors bande"
|
||||
|
||||
#: netbox/ipam/forms/bulk_import.py:331
|
||||
msgid "Designate this as the out-of-band IP address for the assigned device"
|
||||
msgstr ""
|
||||
msgstr "Désignez-le comme adresse IP hors bande pour l'appareil attribué"
|
||||
|
||||
#: netbox/ipam/forms/bulk_import.py:371
|
||||
msgid "No device or virtual machine specified; cannot set as primary IP"
|
||||
@ -9758,10 +9758,13 @@ msgstr ""
|
||||
#: netbox/ipam/forms/bulk_import.py:375
|
||||
msgid "No device specified; cannot set as out-of-band IP"
|
||||
msgstr ""
|
||||
"Aucun appareil n'a été spécifié ; impossible de le définir comme IP hors "
|
||||
"bande"
|
||||
|
||||
#: netbox/ipam/forms/bulk_import.py:379
|
||||
msgid "Cannot set out-of-band IP for virtual machines"
|
||||
msgstr ""
|
||||
"Impossible de définir une adresse IP hors bande pour les machines virtuelles"
|
||||
|
||||
#: netbox/ipam/forms/bulk_import.py:383
|
||||
msgid "No interface specified; cannot set as primary IP"
|
||||
@ -9772,6 +9775,7 @@ msgstr ""
|
||||
#: netbox/ipam/forms/bulk_import.py:387
|
||||
msgid "No interface specified; cannot set as out-of-band IP"
|
||||
msgstr ""
|
||||
"Aucune interface spécifiée ; impossible de définir comme IP hors bande"
|
||||
|
||||
#: netbox/ipam/forms/bulk_import.py:422
|
||||
msgid "Auth type"
|
||||
@ -9930,7 +9934,7 @@ msgstr "Plage ASN"
|
||||
|
||||
#: netbox/ipam/forms/model_forms.py:231
|
||||
msgid "Site/VLAN Assignment"
|
||||
msgstr "Affectation de site/VLAN"
|
||||
msgstr ""
|
||||
|
||||
#: netbox/ipam/forms/model_forms.py:259 netbox/templates/ipam/iprange.html:10
|
||||
msgid "IP Range"
|
||||
@ -9949,7 +9953,7 @@ msgstr ""
|
||||
|
||||
#: netbox/ipam/forms/model_forms.py:314
|
||||
msgid "Make this the out-of-band IP for the device"
|
||||
msgstr ""
|
||||
msgstr "Choisissez cette adresse IP hors bande pour l'appareil"
|
||||
|
||||
#: netbox/ipam/forms/model_forms.py:329
|
||||
msgid "NAT IP (Inside)"
|
||||
@ -9962,10 +9966,12 @@ msgstr "Une adresse IP ne peut être attribuée qu'à un seul objet."
|
||||
#: netbox/ipam/forms/model_forms.py:398
|
||||
msgid "Cannot reassign primary IP address for the parent device/VM"
|
||||
msgstr ""
|
||||
"Impossible de réattribuer l'adresse IP principale à l'appareil parent/à la "
|
||||
"machine virtuelle"
|
||||
|
||||
#: netbox/ipam/forms/model_forms.py:402
|
||||
msgid "Cannot reassign out-of-Band IP address for the parent device"
|
||||
msgstr ""
|
||||
msgstr "Impossible de réattribuer l'adresse IP hors bande à l'appareil parent"
|
||||
|
||||
#: netbox/ipam/forms/model_forms.py:412
|
||||
msgid ""
|
||||
@ -9979,6 +9985,8 @@ msgid ""
|
||||
"Only IP addresses assigned to a device interface can be designated as the "
|
||||
"out-of-band IP for a device."
|
||||
msgstr ""
|
||||
"Seules les adresses IP attribuées à l'interface d'un appareil peuvent être "
|
||||
"désignées comme IP hors bande pour un appareil."
|
||||
|
||||
#: netbox/ipam/forms/model_forms.py:508
|
||||
msgid "Virtual IP Address"
|
||||
@ -10389,11 +10397,14 @@ msgstr "Impossible de définir scope_id sans scope_type."
|
||||
#, python-brace-format
|
||||
msgid "Starting VLAN ID in range ({value}) cannot be less than {minimum}"
|
||||
msgstr ""
|
||||
"ID de VLAN de démarrage dans la plage ({value}) ne peut pas être inférieur à"
|
||||
" {minimum}"
|
||||
|
||||
#: netbox/ipam/models/vlans.py:111
|
||||
#, python-brace-format
|
||||
msgid "Ending VLAN ID in range ({value}) cannot exceed {maximum}"
|
||||
msgstr ""
|
||||
"Fin de l'ID VLAN dans la plage ({value}) ne peut pas dépasser {maximum}"
|
||||
|
||||
#: netbox/ipam/models/vlans.py:118
|
||||
#, python-brace-format
|
||||
@ -10401,6 +10412,8 @@ msgid ""
|
||||
"Ending VLAN ID in range must be greater than or equal to the starting VLAN "
|
||||
"ID ({range})"
|
||||
msgstr ""
|
||||
"L'ID VLAN final dans la plage doit être supérieur ou égal à l'ID VLAN de "
|
||||
"départ ({range})"
|
||||
|
||||
#: netbox/ipam/models/vlans.py:124
|
||||
msgid "Ranges cannot overlap."
|
||||
@ -12787,7 +12800,7 @@ msgstr "Télécharger"
|
||||
#: netbox/templates/dcim/device/render_config.html:64
|
||||
#: netbox/templates/virtualization/virtualmachine/render_config.html:64
|
||||
msgid "Error rendering template"
|
||||
msgstr ""
|
||||
msgstr "Erreur lors du rendu du modèle"
|
||||
|
||||
#: netbox/templates/dcim/device/render_config.html:70
|
||||
msgid "No configuration template has been assigned for this device."
|
||||
@ -13322,8 +13335,8 @@ msgstr ""
|
||||
"installation de NetBox. Ces paquets sont répertoriés dans "
|
||||
"<code>requirements.txt</code> et <code>local_requirements.txt</code>, et "
|
||||
"sont normalement installés dans le cadre du processus d'installation ou de "
|
||||
"mise à jour. Pour vérifier les paquets installés, exécutez <code>Pip "
|
||||
"Freeze</code> depuis la console et comparez la sortie à la liste des paquets"
|
||||
"mise à jour. Pour vérifier les paquets installés, exécutez <code>pip "
|
||||
"freeze</code> depuis la console et comparez la sortie à la liste des paquets"
|
||||
" requis."
|
||||
|
||||
#: netbox/templates/exceptions/import_error.html:20
|
||||
@ -13661,7 +13674,7 @@ msgstr "Exécutez à nouveau"
|
||||
#: netbox/templates/extras/script_list.html:133
|
||||
#, python-format
|
||||
msgid "Could not load scripts from module %(module)s"
|
||||
msgstr ""
|
||||
msgstr "Impossible de charger les scripts depuis le module %(module)s"
|
||||
|
||||
#: netbox/templates/extras/script_list.html:141
|
||||
msgid "No Scripts Found"
|
||||
@ -14063,7 +14076,7 @@ msgstr "Centre d'aide"
|
||||
|
||||
#: netbox/templates/inc/user_menu.html:41
|
||||
msgid "Django Admin"
|
||||
msgstr "Administrateur Django"
|
||||
msgstr ""
|
||||
|
||||
#: netbox/templates/inc/user_menu.html:61
|
||||
msgid "Log Out"
|
||||
@ -14900,7 +14913,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Réseaux IPv4/IPv6 autorisés à partir desquels le jeton peut être utilisé. "
|
||||
"Laissez ce champ vide pour éviter toute restriction. Exemple : "
|
||||
"<code>10.1.1.0/24 192.168.10,16/32 2001 : db 8:1 : /64</code>"
|
||||
"<code>10.1.1.0/24,192.168.10.16/32,2001:db8:1::/64</code>"
|
||||
|
||||
#: netbox/users/forms/model_forms.py:175
|
||||
msgid "Confirm password"
|
||||
@ -15192,7 +15205,7 @@ msgid ""
|
||||
"<code>1-5,20-30</code>"
|
||||
msgstr ""
|
||||
"Spécifiez une ou plusieurs plages numériques séparées par des virgules. "
|
||||
"Exemple : <code>1 à 5, 20 à 30</code>"
|
||||
"Exemple : <code>1-5,20-30</code>"
|
||||
|
||||
#: netbox/utilities/forms/fields/array.py:47
|
||||
#, python-brace-format
|
||||
@ -15594,8 +15607,6 @@ msgid ""
|
||||
"{device} belongs to a different site ({device_site}) than the cluster "
|
||||
"({cluster_site})"
|
||||
msgstr ""
|
||||
"{device} appartient à un autre site ({device_site}) puis le cluster "
|
||||
"({cluster_site})"
|
||||
|
||||
#: netbox/virtualization/forms/model_forms.py:192
|
||||
msgid "Optionally pin this VM to a specific host device within the cluster"
|
||||
@ -16338,7 +16349,6 @@ msgstr "liaisons sans fil"
|
||||
#: netbox/wireless/models.py:236
|
||||
msgid "Must specify a unit when setting a wireless distance"
|
||||
msgstr ""
|
||||
"Vous devez spécifier une unité lors du réglage d'une distance sans fil"
|
||||
|
||||
#: netbox/wireless/models.py:242 netbox/wireless/models.py:248
|
||||
#, python-brace-format
|
||||
|
Binary file not shown.
@ -1237,7 +1237,7 @@ msgstr "Assegnazioni di gruppi di circuiti"
|
||||
|
||||
#: netbox/circuits/models/circuits.py:240
|
||||
msgid "termination"
|
||||
msgstr "fine"
|
||||
msgstr ""
|
||||
|
||||
#: netbox/circuits/models/circuits.py:257
|
||||
msgid "port speed (Kbps)"
|
||||
@ -1299,15 +1299,11 @@ msgstr "terminazioni del circuito"
|
||||
msgid ""
|
||||
"A circuit termination must attach to either a site or a provider network."
|
||||
msgstr ""
|
||||
"Una terminazione di circuito deve essere collegata a un sito o alla rete di "
|
||||
"un provider."
|
||||
|
||||
#: netbox/circuits/models/circuits.py:310
|
||||
msgid ""
|
||||
"A circuit termination cannot attach to both a site and a provider network."
|
||||
msgstr ""
|
||||
"Una terminazione di circuito non può essere collegata sia a un sito che alla"
|
||||
" rete di un provider."
|
||||
|
||||
#: netbox/circuits/models/providers.py:22
|
||||
#: netbox/circuits/models/providers.py:66
|
||||
@ -9936,7 +9932,7 @@ msgstr "Gamma ASN"
|
||||
|
||||
#: netbox/ipam/forms/model_forms.py:231
|
||||
msgid "Site/VLAN Assignment"
|
||||
msgstr "Assegnazione sito/VLAN"
|
||||
msgstr ""
|
||||
|
||||
#: netbox/ipam/forms/model_forms.py:259 netbox/templates/ipam/iprange.html:10
|
||||
msgid "IP Range"
|
||||
@ -12797,8 +12793,6 @@ msgstr "Errore nel rendering del modello"
|
||||
#: netbox/templates/dcim/device/render_config.html:70
|
||||
msgid "No configuration template has been assigned for this device."
|
||||
msgstr ""
|
||||
"Non è stato assegnato alcun modello di configurazione per questo "
|
||||
"dispositivo."
|
||||
|
||||
#: netbox/templates/dcim/device_edit.html:44
|
||||
msgid "Parent Bay"
|
||||
@ -14070,7 +14064,7 @@ msgstr "Centro assistenza"
|
||||
|
||||
#: netbox/templates/inc/user_menu.html:41
|
||||
msgid "Django Admin"
|
||||
msgstr "Amministratore Django"
|
||||
msgstr ""
|
||||
|
||||
#: netbox/templates/inc/user_menu.html:61
|
||||
msgid "Log Out"
|
||||
@ -14485,8 +14479,6 @@ msgstr "Aggiungi disco virtuale"
|
||||
#: netbox/templates/virtualization/virtualmachine/render_config.html:70
|
||||
msgid "No configuration template has been assigned for this virtual machine."
|
||||
msgstr ""
|
||||
"Non è stato assegnato alcun modello di configurazione per questa macchina "
|
||||
"virtuale."
|
||||
|
||||
#: netbox/templates/vpn/ikepolicy.html:10
|
||||
#: netbox/templates/vpn/ipsecprofile.html:33 netbox/vpn/tables/crypto.py:166
|
||||
@ -15600,8 +15592,6 @@ msgid ""
|
||||
"{device} belongs to a different site ({device_site}) than the cluster "
|
||||
"({cluster_site})"
|
||||
msgstr ""
|
||||
"{device} appartiene a un sito diverso ({device_site}) rispetto al cluster "
|
||||
"({cluster_site})"
|
||||
|
||||
#: netbox/virtualization/forms/model_forms.py:192
|
||||
msgid "Optionally pin this VM to a specific host device within the cluster"
|
||||
@ -16344,7 +16334,6 @@ msgstr "collegamenti wireless"
|
||||
#: netbox/wireless/models.py:236
|
||||
msgid "Must specify a unit when setting a wireless distance"
|
||||
msgstr ""
|
||||
"È necessario specificare un'unità quando si imposta una distanza wireless"
|
||||
|
||||
#: netbox/wireless/models.py:242 netbox/wireless/models.py:248
|
||||
#, python-brace-format
|
||||
|
Binary file not shown.
@ -5,8 +5,8 @@
|
||||
#
|
||||
# Translators:
|
||||
# Tatsuya Ueda <ml@tatsuya.info>, 2024
|
||||
# teapot, 2024
|
||||
# Jeremy Stretch, 2025
|
||||
# Jeremy Stretch, 2024
|
||||
# teapot, 2025
|
||||
#
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
@ -15,7 +15,7 @@ msgstr ""
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2025-01-04 05:02+0000\n"
|
||||
"PO-Revision-Date: 2023-10-30 17:48+0000\n"
|
||||
"Last-Translator: Jeremy Stretch, 2025\n"
|
||||
"Last-Translator: teapot, 2025\n"
|
||||
"Language-Team: Japanese (https://app.transifex.com/netbox-community/teams/178115/ja/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
@ -1234,7 +1234,7 @@ msgstr "割当回線グループ"
|
||||
|
||||
#: netbox/circuits/models/circuits.py:240
|
||||
msgid "termination"
|
||||
msgstr "終了"
|
||||
msgstr ""
|
||||
|
||||
#: netbox/circuits/models/circuits.py:257
|
||||
msgid "port speed (Kbps)"
|
||||
@ -1295,12 +1295,12 @@ msgstr "回線終端"
|
||||
#: netbox/circuits/models/circuits.py:308
|
||||
msgid ""
|
||||
"A circuit termination must attach to either a site or a provider network."
|
||||
msgstr "回線終端は、サイトまたはプロバイダーネットワークに接続する必要があります。"
|
||||
msgstr ""
|
||||
|
||||
#: netbox/circuits/models/circuits.py:310
|
||||
msgid ""
|
||||
"A circuit termination cannot attach to both a site and a provider network."
|
||||
msgstr "回線終端をサイトとプロバイダーネットワークの両方に接続することはできません。"
|
||||
msgstr ""
|
||||
|
||||
#: netbox/circuits/models/providers.py:22
|
||||
#: netbox/circuits/models/providers.py:66
|
||||
@ -1565,7 +1565,7 @@ msgstr "コメント"
|
||||
#: netbox/templates/tenancy/contact.html:84
|
||||
#: netbox/tenancy/tables/contacts.py:73
|
||||
msgid "Assignments"
|
||||
msgstr "アサイメント"
|
||||
msgstr "割当"
|
||||
|
||||
#: netbox/circuits/tables/providers.py:23
|
||||
msgid "Accounts"
|
||||
@ -1660,7 +1660,7 @@ msgstr "削除"
|
||||
|
||||
#: netbox/core/constants.py:19 netbox/core/tables/tasks.py:30
|
||||
msgid "Finished"
|
||||
msgstr "終了しました"
|
||||
msgstr "終了済"
|
||||
|
||||
#: netbox/core/constants.py:21 netbox/core/tables/jobs.py:38
|
||||
#: netbox/templates/core/job.html:82
|
||||
@ -1670,15 +1670,15 @@ msgstr "開始日時"
|
||||
|
||||
#: netbox/core/constants.py:22 netbox/core/tables/tasks.py:26
|
||||
msgid "Deferred"
|
||||
msgstr "延期"
|
||||
msgstr "延期済"
|
||||
|
||||
#: netbox/core/constants.py:24
|
||||
msgid "Stopped"
|
||||
msgstr "停止しました"
|
||||
msgstr "停止済"
|
||||
|
||||
#: netbox/core/constants.py:25
|
||||
msgid "Cancelled"
|
||||
msgstr "キャンセルされました"
|
||||
msgstr "キャンセル済"
|
||||
|
||||
#: netbox/core/data_backends.py:32 netbox/core/tables/plugins.py:51
|
||||
#: netbox/templates/core/plugin.html:88
|
||||
@ -1923,7 +1923,7 @@ msgstr "バックエンド設定"
|
||||
|
||||
#: netbox/core/forms/model_forms.py:96
|
||||
msgid "File Upload"
|
||||
msgstr "ファイルのアップロード"
|
||||
msgstr "アップロード"
|
||||
|
||||
#: netbox/core/forms/model_forms.py:108
|
||||
msgid "Cannot upload a file and sync from an existing file"
|
||||
@ -1972,7 +1972,7 @@ msgstr "ページネーション"
|
||||
#: netbox/extras/forms/model_forms.py:129
|
||||
#: netbox/templates/core/inc/config_data.html:93
|
||||
msgid "Validation"
|
||||
msgstr "バリデーション"
|
||||
msgstr "検証"
|
||||
|
||||
#: netbox/core/forms/model_forms.py:164
|
||||
#: netbox/templates/account/preferences.html:6
|
||||
@ -2045,7 +2045,7 @@ msgstr "このオブジェクトタイプ ({type}) では変更ログはサポ
|
||||
#: netbox/extras/models/notifications.py:186
|
||||
#: netbox/netbox/models/features.py:53 netbox/users/models/tokens.py:32
|
||||
msgid "created"
|
||||
msgstr "作成日時"
|
||||
msgstr "作成"
|
||||
|
||||
#: netbox/core/models/config.py:22
|
||||
msgid "comment"
|
||||
@ -2380,7 +2380,7 @@ msgstr "最も古いタスク"
|
||||
|
||||
#: netbox/core/tables/tasks.py:42 netbox/templates/core/rq_worker_list.html:39
|
||||
msgid "Workers"
|
||||
msgstr "労働者"
|
||||
msgstr "ワーカー"
|
||||
|
||||
#: netbox/core/tables/tasks.py:46 netbox/vpn/tables/tunnels.py:88
|
||||
msgid "Host"
|
||||
@ -2939,7 +2939,7 @@ msgstr "AS (ID)"
|
||||
|
||||
#: netbox/dcim/filtersets.py:246
|
||||
msgid "Parent location (ID)"
|
||||
msgstr "親の場所 (ID)"
|
||||
msgstr "親のロケーション (ID)"
|
||||
|
||||
#: netbox/dcim/filtersets.py:252
|
||||
msgid "Parent location (slug)"
|
||||
@ -3052,7 +3052,7 @@ msgstr "電源コンセントがある"
|
||||
#: netbox/dcim/filtersets.py:1147 netbox/dcim/forms/filtersets.py:559
|
||||
#: netbox/dcim/forms/filtersets.py:655 netbox/dcim/forms/filtersets.py:876
|
||||
msgid "Has interfaces"
|
||||
msgstr "インタフェースがある"
|
||||
msgstr "インタフェースを持つ"
|
||||
|
||||
#: netbox/dcim/filtersets.py:587 netbox/dcim/filtersets.py:708
|
||||
#: netbox/dcim/filtersets.py:1151 netbox/dcim/forms/filtersets.py:566
|
||||
@ -3121,7 +3121,7 @@ msgstr "サイト名 (slug)"
|
||||
|
||||
#: netbox/dcim/filtersets.py:1067
|
||||
msgid "Parent bay (ID)"
|
||||
msgstr "ペアレントベイ (ID)"
|
||||
msgstr "親ベイ (ID)"
|
||||
|
||||
#: netbox/dcim/filtersets.py:1071
|
||||
msgid "VM cluster (ID)"
|
||||
@ -3368,11 +3368,11 @@ msgstr "親モジュールベイ (ID)"
|
||||
|
||||
#: netbox/dcim/filtersets.py:1808
|
||||
msgid "Installed module (ID)"
|
||||
msgstr "インストール済みモジュール (ID)"
|
||||
msgstr "インストール済モジュール (ID)"
|
||||
|
||||
#: netbox/dcim/filtersets.py:1819
|
||||
msgid "Installed device (ID)"
|
||||
msgstr "インストール済みデバイス (ID)"
|
||||
msgstr "インストール済デバイス (ID)"
|
||||
|
||||
#: netbox/dcim/filtersets.py:1825
|
||||
msgid "Installed device (name)"
|
||||
@ -4728,7 +4728,7 @@ msgstr "クラスタグループ"
|
||||
|
||||
#: netbox/dcim/forms/filtersets.py:1210
|
||||
msgid "Cabled"
|
||||
msgstr "ケーブル接続済"
|
||||
msgstr "配線済"
|
||||
|
||||
#: netbox/dcim/forms/filtersets.py:1217
|
||||
msgid "Occupied"
|
||||
@ -6820,7 +6820,7 @@ msgstr "奥行きをすべて利用する"
|
||||
|
||||
#: netbox/dcim/tables/devicetypes.py:98
|
||||
msgid "U Height"
|
||||
msgstr "U 高さ"
|
||||
msgstr "ユニット数"
|
||||
|
||||
#: netbox/dcim/tables/devicetypes.py:113 netbox/dcim/tables/modules.py:26
|
||||
#: netbox/dcim/tables/racks.py:89
|
||||
@ -7895,7 +7895,7 @@ msgstr "テンプレートコード"
|
||||
#: netbox/extras/forms/model_forms.py:247
|
||||
#: netbox/templates/extras/exporttemplate.html:12
|
||||
msgid "Export Template"
|
||||
msgstr "テンプレートをエクスポート"
|
||||
msgstr "エクスポートテンプレート"
|
||||
|
||||
#: netbox/extras/forms/model_forms.py:249
|
||||
msgid "Rendering"
|
||||
@ -8204,7 +8204,7 @@ msgstr "最大許容値 (数値フィールド用)"
|
||||
|
||||
#: netbox/extras/models/customfields.py:191
|
||||
msgid "validation regex"
|
||||
msgstr "バリデーション正規表現"
|
||||
msgstr "検証正規表現"
|
||||
|
||||
#: netbox/extras/models/customfields.py:193
|
||||
#, python-brace-format
|
||||
@ -9071,11 +9071,11 @@ msgstr "スタンダード"
|
||||
|
||||
#: netbox/ipam/choices.py:120
|
||||
msgid "CheckPoint"
|
||||
msgstr "チェックポイント"
|
||||
msgstr "CheckPoint"
|
||||
|
||||
#: netbox/ipam/choices.py:123
|
||||
msgid "Cisco"
|
||||
msgstr "シスコ"
|
||||
msgstr "Cisco"
|
||||
|
||||
#: netbox/ipam/choices.py:137
|
||||
msgid "Plaintext"
|
||||
@ -9295,7 +9295,7 @@ msgstr "重複を禁止する"
|
||||
|
||||
#: netbox/ipam/forms/bulk_edit.py:88
|
||||
msgid "Is private"
|
||||
msgstr "非公開です"
|
||||
msgstr "非公開"
|
||||
|
||||
#: netbox/ipam/forms/bulk_edit.py:109 netbox/ipam/forms/bulk_edit.py:138
|
||||
#: netbox/ipam/forms/bulk_edit.py:163 netbox/ipam/forms/bulk_import.py:89
|
||||
@ -9472,7 +9472,7 @@ msgstr "割当インタフェースの親VM (存在する場合)"
|
||||
|
||||
#: netbox/ipam/forms/bulk_import.py:325
|
||||
msgid "Is primary"
|
||||
msgstr "プライマリか"
|
||||
msgstr "プライマリ"
|
||||
|
||||
#: netbox/ipam/forms/bulk_import.py:326
|
||||
msgid "Make this the primary IP for the assigned device"
|
||||
@ -9663,7 +9663,7 @@ msgstr "ASN レンジ"
|
||||
|
||||
#: netbox/ipam/forms/model_forms.py:231
|
||||
msgid "Site/VLAN Assignment"
|
||||
msgstr "サイト/VLAN 割り当て"
|
||||
msgstr ""
|
||||
|
||||
#: netbox/ipam/forms/model_forms.py:259 netbox/templates/ipam/iprange.html:10
|
||||
msgid "IP Range"
|
||||
@ -10243,7 +10243,7 @@ msgstr "NAT (アウトサイド)"
|
||||
|
||||
#: netbox/ipam/tables/ip.py:393
|
||||
msgid "Assigned"
|
||||
msgstr "割当済み"
|
||||
msgstr "割当済"
|
||||
|
||||
#: netbox/ipam/tables/ip.py:429 netbox/templates/vpn/l2vpntermination.html:16
|
||||
#: netbox/vpn/forms/filtersets.py:240
|
||||
@ -10498,7 +10498,7 @@ msgstr "グローバルテーブル内で一意の IP アドレスを強制す
|
||||
#: netbox/netbox/config/parameters.py:75
|
||||
#: netbox/templates/core/inc/config_data.html:44
|
||||
msgid "Prefer IPv4"
|
||||
msgstr "IPv4 を優先する"
|
||||
msgstr "IPv4 を優先"
|
||||
|
||||
#: netbox/netbox/config/parameters.py:77
|
||||
msgid "Prefer IPv4 addresses over IPv6"
|
||||
@ -10982,7 +10982,7 @@ msgstr "エクスポートテンプレート"
|
||||
|
||||
#: netbox/netbox/navigation/menu.py:329
|
||||
msgid "Saved Filters"
|
||||
msgstr "保存済みフィルタ"
|
||||
msgstr "保存済フィルタ"
|
||||
|
||||
#: netbox/netbox/navigation/menu.py:331
|
||||
msgid "Image Attachments"
|
||||
@ -11006,7 +11006,7 @@ msgstr "イベントルール"
|
||||
|
||||
#: netbox/netbox/navigation/menu.py:357
|
||||
msgid "Webhooks"
|
||||
msgstr "ウェブフック"
|
||||
msgstr "Webhooks"
|
||||
|
||||
#: netbox/netbox/navigation/menu.py:361 netbox/netbox/navigation/menu.py:365
|
||||
#: netbox/netbox/views/generic/feature_views.py:153
|
||||
@ -11201,7 +11201,7 @@ msgstr "デンマーク語"
|
||||
|
||||
#: netbox/netbox/settings.py:762
|
||||
msgid "German"
|
||||
msgstr "ドイツ人"
|
||||
msgstr "ドイツ語"
|
||||
|
||||
#: netbox/netbox/settings.py:763
|
||||
msgid "English"
|
||||
@ -11899,7 +11899,7 @@ msgstr "ユーザープリファレンス"
|
||||
|
||||
#: netbox/templates/core/inc/config_data.html:141
|
||||
msgid "Job retention"
|
||||
msgstr "仕事の維持"
|
||||
msgstr "ジョブの維持"
|
||||
|
||||
#: netbox/templates/core/job.html:35 netbox/templates/core/rq_task.html:12
|
||||
#: netbox/templates/core/rq_task.html:49 netbox/templates/core/rq_task.html:58
|
||||
@ -11959,7 +11959,7 @@ msgstr "警告:非アトミックな変更と以前の変更レコードの比
|
||||
|
||||
#: netbox/templates/core/objectchange.html:131
|
||||
msgid "Post-Change Data"
|
||||
msgstr "変更後のデータ"
|
||||
msgstr "変更後データ"
|
||||
|
||||
#: netbox/templates/core/objectchange.html:162
|
||||
#, python-format
|
||||
@ -12144,11 +12144,11 @@ msgstr "システムステータス"
|
||||
|
||||
#: netbox/templates/core/system.html:31
|
||||
msgid "NetBox release"
|
||||
msgstr "ネットボックスリリース"
|
||||
msgstr "NetBoxリリース"
|
||||
|
||||
#: netbox/templates/core/system.html:44
|
||||
msgid "Django version"
|
||||
msgstr "ジャンゴバージョン"
|
||||
msgstr "Djangoバージョン"
|
||||
|
||||
#: netbox/templates/core/system.html:48
|
||||
msgid "PostgreSQL version"
|
||||
@ -12313,7 +12313,7 @@ msgstr "用の NAT"
|
||||
#: netbox/templates/virtualization/virtualmachine.html:59
|
||||
#: netbox/templates/virtualization/virtualmachine.html:75
|
||||
msgid "NAT"
|
||||
msgstr "ナット"
|
||||
msgstr "NAT"
|
||||
|
||||
#: netbox/templates/dcim/device.html:252 netbox/templates/dcim/rack.html:73
|
||||
msgid "Power Utilization"
|
||||
@ -12441,11 +12441,11 @@ msgstr "エラーレンダリングテンプレート"
|
||||
|
||||
#: netbox/templates/dcim/device/render_config.html:70
|
||||
msgid "No configuration template has been assigned for this device."
|
||||
msgstr "このデバイスには設定テンプレートが割り当てられていません。"
|
||||
msgstr ""
|
||||
|
||||
#: netbox/templates/dcim/device_edit.html:44
|
||||
msgid "Parent Bay"
|
||||
msgstr "ペアレントベイ"
|
||||
msgstr "親ベイ"
|
||||
|
||||
#: netbox/templates/dcim/device_edit.html:48
|
||||
#: netbox/utilities/templates/form_helpers/render_field.html:22
|
||||
@ -12475,7 +12475,7 @@ msgstr "デバイスベイ"
|
||||
|
||||
#: netbox/templates/dcim/devicebay.html:43
|
||||
msgid "Installed Device"
|
||||
msgstr "取付済みデバイス"
|
||||
msgstr "取付済デバイス"
|
||||
|
||||
#: netbox/templates/dcim/devicebay_depopulate.html:6
|
||||
#, python-format
|
||||
@ -12561,15 +12561,15 @@ msgstr "B サイド"
|
||||
|
||||
#: netbox/templates/dcim/inc/cable_termination.html:65
|
||||
msgid "No termination"
|
||||
msgstr "終了なし"
|
||||
msgstr "未終端"
|
||||
|
||||
#: netbox/templates/dcim/inc/cable_toggle_buttons.html:3
|
||||
msgid "Mark Planned"
|
||||
msgstr "マーク・プランド"
|
||||
msgstr "計画中とマークする"
|
||||
|
||||
#: netbox/templates/dcim/inc/cable_toggle_buttons.html:6
|
||||
msgid "Mark Installed"
|
||||
msgstr "取付済みとマークする"
|
||||
msgstr "取付済とマークする"
|
||||
|
||||
#: netbox/templates/dcim/inc/connection_endpoints.html:13
|
||||
msgid "Path Status"
|
||||
@ -12688,7 +12688,7 @@ msgstr "チャンネル幅"
|
||||
#: netbox/wireless/forms/filtersets.py:80 netbox/wireless/models.py:82
|
||||
#: netbox/wireless/models.py:156 netbox/wireless/tables/wirelesslan.py:44
|
||||
msgid "SSID"
|
||||
msgstr "言った"
|
||||
msgstr "SSID"
|
||||
|
||||
#: netbox/templates/dcim/interface.html:305
|
||||
msgid "LAG Members"
|
||||
@ -13273,7 +13273,7 @@ msgstr "スクリプトはソースファイルに存在しなくなりました
|
||||
|
||||
#: netbox/templates/extras/script_list.html:47
|
||||
msgid "Last Run"
|
||||
msgstr "ラストラン"
|
||||
msgstr "最終実行"
|
||||
|
||||
#: netbox/templates/extras/script_list.html:62
|
||||
msgid "Script is no longer present in the source file"
|
||||
@ -13285,7 +13285,7 @@ msgstr "決して"
|
||||
|
||||
#: netbox/templates/extras/script_list.html:85
|
||||
msgid "Run Again"
|
||||
msgstr "もう一度実行"
|
||||
msgstr "再実行"
|
||||
|
||||
#: netbox/templates/extras/script_list.html:133
|
||||
#, python-format
|
||||
@ -13317,7 +13317,7 @@ msgstr "ログ閾値"
|
||||
|
||||
#: netbox/templates/extras/script_result.html:56
|
||||
msgid "All"
|
||||
msgstr "[すべて]"
|
||||
msgstr "すべて"
|
||||
|
||||
#: netbox/templates/extras/tag.html:32
|
||||
msgid "Tagged Items"
|
||||
@ -13557,7 +13557,7 @@ msgstr "新しいリリースが入手可能"
|
||||
|
||||
#: netbox/templates/home.html:16
|
||||
msgid "is available"
|
||||
msgstr "利用可能です"
|
||||
msgstr "利用可能"
|
||||
|
||||
#: netbox/templates/home.html:18
|
||||
msgctxt "Document title"
|
||||
@ -13570,7 +13570,7 @@ msgstr "ダッシュボードのロック解除"
|
||||
|
||||
#: netbox/templates/home.html:49
|
||||
msgid "Lock Dashboard"
|
||||
msgstr "ロックダッシュボード"
|
||||
msgstr "ダッシュボードのロック"
|
||||
|
||||
#: netbox/templates/home.html:60
|
||||
msgid "Add Widget"
|
||||
@ -13685,7 +13685,7 @@ msgstr "ヘルプセンター"
|
||||
|
||||
#: netbox/templates/inc/user_menu.html:41
|
||||
msgid "Django Admin"
|
||||
msgstr "ジャンゴ管理者"
|
||||
msgstr ""
|
||||
|
||||
#: netbox/templates/inc/user_menu.html:61
|
||||
msgid "Log Out"
|
||||
@ -14094,7 +14094,7 @@ msgstr "仮想ディスクを追加"
|
||||
|
||||
#: netbox/templates/virtualization/virtualmachine/render_config.html:70
|
||||
msgid "No configuration template has been assigned for this virtual machine."
|
||||
msgstr "このVMには構成テンプレートが割り当てられていません。"
|
||||
msgstr ""
|
||||
|
||||
#: netbox/templates/vpn/ikepolicy.html:10
|
||||
#: netbox/templates/vpn/ipsecprofile.html:33 netbox/vpn/tables/crypto.py:166
|
||||
@ -14251,7 +14251,7 @@ msgstr "PSK"
|
||||
#: netbox/templates/wireless/inc/wirelesslink_interface.html:45
|
||||
msgctxt "Abbreviation for megahertz"
|
||||
msgid "MHz"
|
||||
msgstr "メガヘルツ"
|
||||
msgstr "MHz"
|
||||
|
||||
#: netbox/templates/wireless/wirelesslan.html:57
|
||||
msgid "Attached Interfaces"
|
||||
@ -14454,7 +14454,7 @@ msgstr "通知グループ (ID)"
|
||||
|
||||
#: netbox/users/forms/bulk_edit.py:26
|
||||
msgid "First name"
|
||||
msgstr "ファーストネーム"
|
||||
msgstr "名前"
|
||||
|
||||
#: netbox/users/forms/bulk_edit.py:31
|
||||
msgid "Last name"
|
||||
@ -14474,11 +14474,11 @@ msgstr "キーが指定されていない場合は、キーが自動的に生成
|
||||
|
||||
#: netbox/users/forms/filtersets.py:51 netbox/users/tables.py:42
|
||||
msgid "Is Staff"
|
||||
msgstr "スタッフですか"
|
||||
msgstr "スタッフ"
|
||||
|
||||
#: netbox/users/forms/filtersets.py:58 netbox/users/tables.py:45
|
||||
msgid "Is Superuser"
|
||||
msgstr "スーパーユーザですか"
|
||||
msgstr "スーパーユーザ"
|
||||
|
||||
#: netbox/users/forms/filtersets.py:91 netbox/users/tables.py:86
|
||||
msgid "Can View"
|
||||
@ -15156,7 +15156,7 @@ msgstr "シリアル番号"
|
||||
msgid ""
|
||||
"{device} belongs to a different site ({device_site}) than the cluster "
|
||||
"({cluster_site})"
|
||||
msgstr "{device} 別のサイトに属している ({device_site}) よりもクラスタ ({cluster_site})"
|
||||
msgstr ""
|
||||
|
||||
#: netbox/virtualization/forms/model_forms.py:192
|
||||
msgid "Optionally pin this VM to a specific host device within the cluster"
|
||||
@ -15572,11 +15572,11 @@ msgstr "トンネルインターフェイス"
|
||||
|
||||
#: netbox/vpn/forms/model_forms.py:150
|
||||
msgid "First Termination"
|
||||
msgstr "1 回目の解約"
|
||||
msgstr "1 回目の終端"
|
||||
|
||||
#: netbox/vpn/forms/model_forms.py:153
|
||||
msgid "Second Termination"
|
||||
msgstr "2 回目の終了"
|
||||
msgstr "2 回目の終端"
|
||||
|
||||
#: netbox/vpn/forms/model_forms.py:197
|
||||
msgid "This parameter is required when defining a termination."
|
||||
@ -15605,7 +15605,7 @@ msgstr "認証アルゴリズム"
|
||||
|
||||
#: netbox/vpn/models/crypto.py:44
|
||||
msgid "Diffie-Hellman group ID"
|
||||
msgstr "ディフィー・ヘルマングループ ID"
|
||||
msgstr "Diffie-Hellmanグループ ID"
|
||||
|
||||
#: netbox/vpn/models/crypto.py:50
|
||||
msgid "Security association lifetime (in seconds)"
|
||||
@ -15613,11 +15613,11 @@ msgstr "セキュリティアソシエーションの有効期間 (秒単位)"
|
||||
|
||||
#: netbox/vpn/models/crypto.py:59
|
||||
msgid "IKE proposal"
|
||||
msgstr "イケアの提案"
|
||||
msgstr "IKEプロポザール"
|
||||
|
||||
#: netbox/vpn/models/crypto.py:60
|
||||
msgid "IKE proposals"
|
||||
msgstr "IKEの提案"
|
||||
msgstr "IKEプロポザール"
|
||||
|
||||
#: netbox/vpn/models/crypto.py:76
|
||||
msgid "version"
|
||||
@ -15875,7 +15875,7 @@ msgstr "無線リンク"
|
||||
|
||||
#: netbox/wireless/models.py:236
|
||||
msgid "Must specify a unit when setting a wireless distance"
|
||||
msgstr "ワイヤレス距離を設定するときは単位を指定する必要があります"
|
||||
msgstr ""
|
||||
|
||||
#: netbox/wireless/models.py:242 netbox/wireless/models.py:248
|
||||
#, python-brace-format
|
||||
|
Binary file not shown.
@ -8,8 +8,8 @@
|
||||
# deku_m, 2024
|
||||
# Peter Mulder <mistermulder+transifex@protonmail.com>, 2024
|
||||
# Sebastian Berm, 2024
|
||||
# Jorg de Jong, 2025
|
||||
# Jeremy Stretch, 2025
|
||||
# Jorg de Jong, 2025
|
||||
#
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
@ -18,7 +18,7 @@ msgstr ""
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2025-01-04 05:02+0000\n"
|
||||
"PO-Revision-Date: 2023-10-30 17:48+0000\n"
|
||||
"Last-Translator: Jeremy Stretch, 2025\n"
|
||||
"Last-Translator: Jorg de Jong, 2025\n"
|
||||
"Language-Team: Dutch (https://app.transifex.com/netbox-community/teams/178115/nl/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
@ -1239,7 +1239,7 @@ msgstr "Circuitgroeptoewijzingen"
|
||||
|
||||
#: netbox/circuits/models/circuits.py:240
|
||||
msgid "termination"
|
||||
msgstr "beëindiging"
|
||||
msgstr ""
|
||||
|
||||
#: netbox/circuits/models/circuits.py:257
|
||||
msgid "port speed (Kbps)"
|
||||
@ -1301,15 +1301,11 @@ msgstr "circuitafsluitingen"
|
||||
msgid ""
|
||||
"A circuit termination must attach to either a site or a provider network."
|
||||
msgstr ""
|
||||
"Een circuitafsluiting moet verbonden zijn met een site of een netwerk van "
|
||||
"een provider."
|
||||
|
||||
#: netbox/circuits/models/circuits.py:310
|
||||
msgid ""
|
||||
"A circuit termination cannot attach to both a site and a provider network."
|
||||
msgstr ""
|
||||
"Een circuitafsluiting kan niet worden aangesloten op zowel een site als een "
|
||||
"netwerk van een provider."
|
||||
|
||||
#: netbox/circuits/models/providers.py:22
|
||||
#: netbox/circuits/models/providers.py:66
|
||||
@ -7744,7 +7740,7 @@ msgstr "CA-bestandspad"
|
||||
#: netbox/extras/forms/bulk_edit.py:253 netbox/extras/forms/bulk_import.py:192
|
||||
#: netbox/extras/forms/model_forms.py:377
|
||||
msgid "Event types"
|
||||
msgstr "Soorten evenementen"
|
||||
msgstr "Soorten gebeurtenis"
|
||||
|
||||
#: netbox/extras/forms/bulk_edit.py:293
|
||||
msgid "Is active"
|
||||
@ -7835,7 +7831,7 @@ msgstr ""
|
||||
|
||||
#: netbox/extras/forms/bulk_import.py:193
|
||||
msgid "The event type(s) which will trigger this rule"
|
||||
msgstr "Het (de) evenementtype (s) dat deze regel activeert"
|
||||
msgstr "Het (de) gebeurtenistype (s) dat deze regel activeert"
|
||||
|
||||
#: netbox/extras/forms/bulk_import.py:196
|
||||
msgid "Action object"
|
||||
@ -7927,7 +7923,7 @@ msgstr "HTTP-inhoudstype"
|
||||
|
||||
#: netbox/extras/forms/filtersets.py:286
|
||||
msgid "Event type"
|
||||
msgstr "Soort evenement"
|
||||
msgstr "Soort gebeurtenis"
|
||||
|
||||
#: netbox/extras/forms/filtersets.py:291
|
||||
msgid "Action type"
|
||||
@ -8680,7 +8676,7 @@ msgstr "regel van het evenement"
|
||||
|
||||
#: netbox/extras/models/models.py:117
|
||||
msgid "event rules"
|
||||
msgstr "regels voor evenementen"
|
||||
msgstr "regels voor gebeurtenissen"
|
||||
|
||||
#: netbox/extras/models/models.py:166
|
||||
msgid ""
|
||||
@ -8731,11 +8727,8 @@ msgid ""
|
||||
"<code>event</code>, <code>model</code>, <code>timestamp</code>, "
|
||||
"<code>username</code>, <code>request_id</code>, and <code>data</code>."
|
||||
msgstr ""
|
||||
"Jinja2-sjabloon voor een aangepaste hoofdtekst van de aanvraag. Indien leeg,"
|
||||
" wordt een JSON-object toegevoegd dat de wijziging voorstelt. De beschikbare"
|
||||
" contextgegevens omvatten: <code>evenement</code>, <code>model-</code>, "
|
||||
"<code>tijdstempel</code>, <code>gebruikersnaam</code>, "
|
||||
"<code>aanvraag_id</code>, en <code>gegevens</code>."
|
||||
"Jinja2-sjabloon voor een aangepaste hoofdtekst van de aanvraag. Indien leeg, wordt een JSON-object toegevoegd dat de wijziging voorstelt. De beschikbare contextgegevens omvatten: <code>gebeurtenis\n"
|
||||
"</code>, <code>model-</code>, <code>tijdstempel</code>, <code>gebruikersnaam</code>, <code>aanvraag_id</code>, en <code>gegevens</code>."
|
||||
|
||||
#: netbox/extras/models/models.py:204
|
||||
msgid "secret"
|
||||
@ -8949,7 +8942,7 @@ msgstr "lezen"
|
||||
|
||||
#: netbox/extras/models/notifications.py:66
|
||||
msgid "event"
|
||||
msgstr "evenement"
|
||||
msgstr "gebeurtenis"
|
||||
|
||||
#: netbox/extras/models/notifications.py:84
|
||||
msgid "notification"
|
||||
@ -9180,7 +9173,7 @@ msgstr "SSL-validatie"
|
||||
#: netbox/extras/tables/tables.py:418
|
||||
#: netbox/templates/extras/eventrule.html:37
|
||||
msgid "Event Types"
|
||||
msgstr "Soorten evenementen"
|
||||
msgstr "Soorten gebeurtenissen"
|
||||
|
||||
#: netbox/extras/tables/tables.py:535 netbox/netbox/navigation/menu.py:77
|
||||
#: netbox/templates/dcim/devicerole.html:8
|
||||
@ -9919,7 +9912,7 @@ msgstr "ASN-assortiment"
|
||||
|
||||
#: netbox/ipam/forms/model_forms.py:231
|
||||
msgid "Site/VLAN Assignment"
|
||||
msgstr "Site/VLAN-toewijzing"
|
||||
msgstr ""
|
||||
|
||||
#: netbox/ipam/forms/model_forms.py:259 netbox/templates/ipam/iprange.html:10
|
||||
msgid "IP Range"
|
||||
@ -12772,7 +12765,7 @@ msgstr "Sjabloon voor weergave van fouten"
|
||||
|
||||
#: netbox/templates/dcim/device/render_config.html:70
|
||||
msgid "No configuration template has been assigned for this device."
|
||||
msgstr "Er is geen configuratiesjabloon toegewezen voor dit apparaat."
|
||||
msgstr ""
|
||||
|
||||
#: netbox/templates/dcim/device_edit.html:44
|
||||
msgid "Parent Bay"
|
||||
@ -14044,7 +14037,7 @@ msgstr "Helpcentrum"
|
||||
|
||||
#: netbox/templates/inc/user_menu.html:41
|
||||
msgid "Django Admin"
|
||||
msgstr "Django-beheerder"
|
||||
msgstr ""
|
||||
|
||||
#: netbox/templates/inc/user_menu.html:61
|
||||
msgid "Log Out"
|
||||
@ -14459,7 +14452,6 @@ msgstr "Virtuele schijf toevoegen"
|
||||
#: netbox/templates/virtualization/virtualmachine/render_config.html:70
|
||||
msgid "No configuration template has been assigned for this virtual machine."
|
||||
msgstr ""
|
||||
"Er is geen configuratiesjabloon toegewezen voor deze virtuele machine."
|
||||
|
||||
#: netbox/templates/vpn/ikepolicy.html:10
|
||||
#: netbox/templates/vpn/ipsecprofile.html:33 netbox/vpn/tables/crypto.py:166
|
||||
@ -15574,8 +15566,6 @@ msgid ""
|
||||
"{device} belongs to a different site ({device_site}) than the cluster "
|
||||
"({cluster_site})"
|
||||
msgstr ""
|
||||
"{device} behoort tot een andere site ({device_site}) dan het cluster "
|
||||
"({cluster_site})"
|
||||
|
||||
#: netbox/virtualization/forms/model_forms.py:192
|
||||
msgid "Optionally pin this VM to a specific host device within the cluster"
|
||||
@ -16317,7 +16307,6 @@ msgstr "draadloze verbindingen"
|
||||
#: netbox/wireless/models.py:236
|
||||
msgid "Must specify a unit when setting a wireless distance"
|
||||
msgstr ""
|
||||
"Moet een eenheid specificeren bij het instellen van een draadloze afstand"
|
||||
|
||||
#: netbox/wireless/models.py:242 netbox/wireless/models.py:248
|
||||
#, python-brace-format
|
||||
|
Binary file not shown.
@ -1237,7 +1237,7 @@ msgstr "Przydziały grup obwodowych"
|
||||
|
||||
#: netbox/circuits/models/circuits.py:240
|
||||
msgid "termination"
|
||||
msgstr "wypowiedzenie"
|
||||
msgstr ""
|
||||
|
||||
#: netbox/circuits/models/circuits.py:257
|
||||
msgid "port speed (Kbps)"
|
||||
@ -1298,14 +1298,12 @@ msgstr "zakończenia obwodu"
|
||||
#: netbox/circuits/models/circuits.py:308
|
||||
msgid ""
|
||||
"A circuit termination must attach to either a site or a provider network."
|
||||
msgstr "Zakończenie obwodu musi być podłączone do witryny lub sieci dostawcy."
|
||||
msgstr ""
|
||||
|
||||
#: netbox/circuits/models/circuits.py:310
|
||||
msgid ""
|
||||
"A circuit termination cannot attach to both a site and a provider network."
|
||||
msgstr ""
|
||||
"Zakończenie obwodu nie może połączyć się zarówno z witryną, jak i siecią "
|
||||
"dostawcy."
|
||||
|
||||
#: netbox/circuits/models/providers.py:22
|
||||
#: netbox/circuits/models/providers.py:66
|
||||
@ -9846,7 +9844,7 @@ msgstr "Zakres ASN"
|
||||
|
||||
#: netbox/ipam/forms/model_forms.py:231
|
||||
msgid "Site/VLAN Assignment"
|
||||
msgstr "Przypisanie witryny/sieci VLAN"
|
||||
msgstr ""
|
||||
|
||||
#: netbox/ipam/forms/model_forms.py:259 netbox/templates/ipam/iprange.html:10
|
||||
msgid "IP Range"
|
||||
@ -12686,7 +12684,7 @@ msgstr "Szablon renderowania błędu"
|
||||
|
||||
#: netbox/templates/dcim/device/render_config.html:70
|
||||
msgid "No configuration template has been assigned for this device."
|
||||
msgstr "Dla tego urządzenia nie przypisano szablonu konfiguracji."
|
||||
msgstr ""
|
||||
|
||||
#: netbox/templates/dcim/device_edit.html:44
|
||||
msgid "Parent Bay"
|
||||
@ -13954,7 +13952,7 @@ msgstr "Centrum pomocy"
|
||||
|
||||
#: netbox/templates/inc/user_menu.html:41
|
||||
msgid "Django Admin"
|
||||
msgstr "Administrator Django"
|
||||
msgstr ""
|
||||
|
||||
#: netbox/templates/inc/user_menu.html:61
|
||||
msgid "Log Out"
|
||||
@ -14368,7 +14366,7 @@ msgstr "Dodaj dysk wirtualny"
|
||||
|
||||
#: netbox/templates/virtualization/virtualmachine/render_config.html:70
|
||||
msgid "No configuration template has been assigned for this virtual machine."
|
||||
msgstr "Dla tej maszyny wirtualnej nie przypisano szablonu konfiguracji."
|
||||
msgstr ""
|
||||
|
||||
#: netbox/templates/vpn/ikepolicy.html:10
|
||||
#: netbox/templates/vpn/ipsecprofile.html:33 netbox/vpn/tables/crypto.py:166
|
||||
@ -15480,7 +15478,6 @@ msgid ""
|
||||
"{device} belongs to a different site ({device_site}) than the cluster "
|
||||
"({cluster_site})"
|
||||
msgstr ""
|
||||
"{device} należy do innej strony ({device_site}) niż klaster ({cluster_site})"
|
||||
|
||||
#: netbox/virtualization/forms/model_forms.py:192
|
||||
msgid "Optionally pin this VM to a specific host device within the cluster"
|
||||
@ -16217,7 +16214,6 @@ msgstr "łącza bezprzewodowe"
|
||||
#: netbox/wireless/models.py:236
|
||||
msgid "Must specify a unit when setting a wireless distance"
|
||||
msgstr ""
|
||||
"Należy określić jednostkę podczas ustawiania odległości bezprzewodowej"
|
||||
|
||||
#: netbox/wireless/models.py:242 netbox/wireless/models.py:248
|
||||
#, python-brace-format
|
||||
|
Binary file not shown.
@ -6,8 +6,8 @@
|
||||
# Translators:
|
||||
# Renato Almeida de Oliveira, 2023
|
||||
# Fer22f <Fer22f@gmail.com>, 2024
|
||||
# Jeremy Stretch, 2025
|
||||
# Fabricio Maciel, 2025
|
||||
# Jeremy Stretch, 2024
|
||||
# Fabricio Maciel, 2024
|
||||
#
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
@ -16,7 +16,7 @@ msgstr ""
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2025-01-04 05:02+0000\n"
|
||||
"PO-Revision-Date: 2023-10-30 17:48+0000\n"
|
||||
"Last-Translator: Fabricio Maciel, 2025\n"
|
||||
"Last-Translator: Fabricio Maciel, 2024\n"
|
||||
"Language-Team: Portuguese (https://app.transifex.com/netbox-community/teams/178115/pt/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
@ -1237,7 +1237,7 @@ msgstr "Atribuições do grupo de circuitos"
|
||||
|
||||
#: netbox/circuits/models/circuits.py:240
|
||||
msgid "termination"
|
||||
msgstr "terminação"
|
||||
msgstr ""
|
||||
|
||||
#: netbox/circuits/models/circuits.py:257
|
||||
msgid "port speed (Kbps)"
|
||||
@ -1299,15 +1299,11 @@ msgstr "terminações dos circuitos"
|
||||
msgid ""
|
||||
"A circuit termination must attach to either a site or a provider network."
|
||||
msgstr ""
|
||||
"Uma terminação de circuito deve ser conectada a um site ou a uma rede de "
|
||||
"provedor."
|
||||
|
||||
#: netbox/circuits/models/circuits.py:310
|
||||
msgid ""
|
||||
"A circuit termination cannot attach to both a site and a provider network."
|
||||
msgstr ""
|
||||
"Uma terminação de circuito não pode ser conectada a um site e a uma rede de "
|
||||
"provedor ao mesmo tempo."
|
||||
|
||||
#: netbox/circuits/models/providers.py:22
|
||||
#: netbox/circuits/models/providers.py:66
|
||||
@ -9886,7 +9882,7 @@ msgstr "Intervalo de ASN"
|
||||
|
||||
#: netbox/ipam/forms/model_forms.py:231
|
||||
msgid "Site/VLAN Assignment"
|
||||
msgstr "Atribuição de site/VLAN"
|
||||
msgstr ""
|
||||
|
||||
#: netbox/ipam/forms/model_forms.py:259 netbox/templates/ipam/iprange.html:10
|
||||
msgid "IP Range"
|
||||
@ -12719,7 +12715,7 @@ msgstr "Erro ao renderizar o modelo"
|
||||
|
||||
#: netbox/templates/dcim/device/render_config.html:70
|
||||
msgid "No configuration template has been assigned for this device."
|
||||
msgstr "Nenhum modelo de configuração foi atribuído para este dispositivo."
|
||||
msgstr ""
|
||||
|
||||
#: netbox/templates/dcim/device_edit.html:44
|
||||
msgid "Parent Bay"
|
||||
@ -13988,7 +13984,7 @@ msgstr "Centro de ajuda"
|
||||
|
||||
#: netbox/templates/inc/user_menu.html:41
|
||||
msgid "Django Admin"
|
||||
msgstr "Administrador do Django"
|
||||
msgstr ""
|
||||
|
||||
#: netbox/templates/inc/user_menu.html:61
|
||||
msgid "Log Out"
|
||||
@ -14402,7 +14398,6 @@ msgstr "Adicionar Disco Virtual"
|
||||
#: netbox/templates/virtualization/virtualmachine/render_config.html:70
|
||||
msgid "No configuration template has been assigned for this virtual machine."
|
||||
msgstr ""
|
||||
"Nenhum modelo de configuração foi atribuído para esta máquina virtual."
|
||||
|
||||
#: netbox/templates/vpn/ikepolicy.html:10
|
||||
#: netbox/templates/vpn/ipsecprofile.html:33 netbox/vpn/tables/crypto.py:166
|
||||
@ -15512,8 +15507,6 @@ msgid ""
|
||||
"{device} belongs to a different site ({device_site}) than the cluster "
|
||||
"({cluster_site})"
|
||||
msgstr ""
|
||||
"{device} pertence a um site diferente ({device_site}) do que o cluster "
|
||||
"({cluster_site})"
|
||||
|
||||
#: netbox/virtualization/forms/model_forms.py:192
|
||||
msgid "Optionally pin this VM to a specific host device within the cluster"
|
||||
@ -16248,7 +16241,7 @@ msgstr "links wireless"
|
||||
|
||||
#: netbox/wireless/models.py:236
|
||||
msgid "Must specify a unit when setting a wireless distance"
|
||||
msgstr "É necessário especificar uma unidade ao definir uma distância sem fio"
|
||||
msgstr ""
|
||||
|
||||
#: netbox/wireless/models.py:242 netbox/wireless/models.py:248
|
||||
#, python-brace-format
|
||||
|
Binary file not shown.
@ -11,9 +11,9 @@
|
||||
# stavr666, 2024
|
||||
# Alexander Ryazanov (alryaz) <alryaz@xavux.com>, 2024
|
||||
# Vladyslav V. Prodan, 2024
|
||||
# Jeremy Stretch, 2024
|
||||
# Artem Kotik, 2025
|
||||
# Michail Tatarinov, 2025
|
||||
# Jeremy Stretch, 2025
|
||||
#
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
@ -22,7 +22,7 @@ msgstr ""
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2025-01-04 05:02+0000\n"
|
||||
"PO-Revision-Date: 2023-10-30 17:48+0000\n"
|
||||
"Last-Translator: Michail Tatarinov, 2025\n"
|
||||
"Last-Translator: Jeremy Stretch, 2025\n"
|
||||
"Language-Team: Russian (https://app.transifex.com/netbox-community/teams/178115/ru/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
@ -64,7 +64,7 @@ msgstr "Истекает"
|
||||
|
||||
#: netbox/account/tables.py:42 netbox/users/forms/filtersets.py:141
|
||||
msgid "Last Used"
|
||||
msgstr "Последнее использование"
|
||||
msgstr "Последний раз использованный"
|
||||
|
||||
#: netbox/account/tables.py:45 netbox/templates/account/token.html:55
|
||||
#: netbox/templates/users/token.html:47 netbox/users/forms/bulk_edit.py:122
|
||||
@ -75,7 +75,7 @@ msgstr "Разрешенные IP-адреса"
|
||||
#: netbox/account/views.py:114
|
||||
#, python-brace-format
|
||||
msgid "Logged in as {user}."
|
||||
msgstr "Вошел(-ла) в систему как {user}."
|
||||
msgstr "Вошел в систему как {user}."
|
||||
|
||||
#: netbox/account/views.py:164
|
||||
msgid "You have logged out."
|
||||
@ -83,11 +83,13 @@ msgstr "Вы вышли из системы."
|
||||
|
||||
#: netbox/account/views.py:216
|
||||
msgid "Your preferences have been updated."
|
||||
msgstr "Ваши настройки были обновлены."
|
||||
msgstr "Ваши предпочтения обновлены."
|
||||
|
||||
#: netbox/account/views.py:239
|
||||
msgid "LDAP-authenticated user credentials cannot be changed within NetBox."
|
||||
msgstr "Учетные данные доменных пользователей нельзя изменить в NetBox."
|
||||
msgstr ""
|
||||
"Учетные данные пользователя, аутентифицированные по протоколу LDAP, нельзя "
|
||||
"изменить в NetBox."
|
||||
|
||||
#: netbox/account/views.py:254
|
||||
msgid "Your password has been changed successfully."
|
||||
@ -104,7 +106,7 @@ msgstr "Запланировано"
|
||||
|
||||
#: netbox/circuits/choices.py:22 netbox/netbox/navigation/menu.py:305
|
||||
msgid "Provisioning"
|
||||
msgstr "Эксплутация"
|
||||
msgstr "Выделение ресурсов"
|
||||
|
||||
#: netbox/circuits/choices.py:23 netbox/core/tables/tasks.py:22
|
||||
#: netbox/dcim/choices.py:22 netbox/dcim/choices.py:103
|
||||
@ -124,11 +126,11 @@ msgstr "Активный"
|
||||
#: netbox/dcim/choices.py:1659 netbox/virtualization/choices.py:24
|
||||
#: netbox/virtualization/choices.py:43
|
||||
msgid "Offline"
|
||||
msgstr "Оффлайн"
|
||||
msgstr "Не в сети"
|
||||
|
||||
#: netbox/circuits/choices.py:25
|
||||
msgid "Deprovisioning"
|
||||
msgstr "Вывод из эксплуатации"
|
||||
msgstr "Выделение резервов"
|
||||
|
||||
#: netbox/circuits/choices.py:26
|
||||
msgid "Decommissioned"
|
||||
@ -137,7 +139,7 @@ msgstr "Списан"
|
||||
#: netbox/circuits/choices.py:90 netbox/dcim/choices.py:1619
|
||||
#: netbox/tenancy/choices.py:17
|
||||
msgid "Primary"
|
||||
msgstr "Основной"
|
||||
msgstr "Начальное"
|
||||
|
||||
#: netbox/circuits/choices.py:91 netbox/ipam/choices.py:90
|
||||
#: netbox/tenancy/choices.py:18
|
||||
@ -146,7 +148,7 @@ msgstr "Вторичный"
|
||||
|
||||
#: netbox/circuits/choices.py:92 netbox/tenancy/choices.py:19
|
||||
msgid "Tertiary"
|
||||
msgstr "Третичный"
|
||||
msgstr "Высшее образование"
|
||||
|
||||
#: netbox/circuits/choices.py:93 netbox/tenancy/choices.py:20
|
||||
msgid "Inactive"
|
||||
@ -174,7 +176,7 @@ msgstr "Регион (ID)"
|
||||
#: netbox/ipam/filtersets.py:968 netbox/virtualization/filtersets.py:52
|
||||
#: netbox/virtualization/filtersets.py:180 netbox/vpn/filtersets.py:353
|
||||
msgid "Region (slug)"
|
||||
msgstr "Регион (подстрока)"
|
||||
msgstr "Регион (пуля)"
|
||||
|
||||
#: netbox/circuits/filtersets.py:44 netbox/circuits/filtersets.py:211
|
||||
#: netbox/dcim/filtersets.py:128 netbox/dcim/filtersets.py:225
|
||||
@ -197,7 +199,7 @@ msgstr "Группа сайтов (ID)"
|
||||
#: netbox/virtualization/filtersets.py:65
|
||||
#: netbox/virtualization/filtersets.py:193
|
||||
msgid "Site group (slug)"
|
||||
msgstr "Группа сайтов (подстрока)"
|
||||
msgstr "Группа сайтов (слизень)"
|
||||
|
||||
#: netbox/circuits/filtersets.py:56 netbox/circuits/forms/bulk_edit.py:188
|
||||
#: netbox/circuits/forms/bulk_edit.py:216
|
||||
@ -1241,7 +1243,7 @@ msgstr "Назначения групп каналов связи"
|
||||
|
||||
#: netbox/circuits/models/circuits.py:240
|
||||
msgid "termination"
|
||||
msgstr "завершение"
|
||||
msgstr ""
|
||||
|
||||
#: netbox/circuits/models/circuits.py:257
|
||||
msgid "port speed (Kbps)"
|
||||
@ -1303,15 +1305,11 @@ msgstr "точки подключения канала связи"
|
||||
msgid ""
|
||||
"A circuit termination must attach to either a site or a provider network."
|
||||
msgstr ""
|
||||
"Оконечное устройство канала должно быть подключено либо к узлу, либо к сети "
|
||||
"провайдера."
|
||||
|
||||
#: netbox/circuits/models/circuits.py:310
|
||||
msgid ""
|
||||
"A circuit termination cannot attach to both a site and a provider network."
|
||||
msgstr ""
|
||||
"Терминатор канала не может быть подключен как к сайту, так и к сети "
|
||||
"поставщика."
|
||||
|
||||
#: netbox/circuits/models/providers.py:22
|
||||
#: netbox/circuits/models/providers.py:66
|
||||
@ -9863,7 +9861,7 @@ msgstr "Диапазон ASN"
|
||||
|
||||
#: netbox/ipam/forms/model_forms.py:231
|
||||
msgid "Site/VLAN Assignment"
|
||||
msgstr "Назначение сайта/VLAN"
|
||||
msgstr ""
|
||||
|
||||
#: netbox/ipam/forms/model_forms.py:259 netbox/templates/ipam/iprange.html:10
|
||||
msgid "IP Range"
|
||||
@ -12704,7 +12702,7 @@ msgstr "Ошибка при отображении шаблона"
|
||||
|
||||
#: netbox/templates/dcim/device/render_config.html:70
|
||||
msgid "No configuration template has been assigned for this device."
|
||||
msgstr "Для этого устройства не назначен шаблон конфигурации."
|
||||
msgstr ""
|
||||
|
||||
#: netbox/templates/dcim/device_edit.html:44
|
||||
msgid "Parent Bay"
|
||||
@ -13973,7 +13971,7 @@ msgstr "Справочный центр"
|
||||
|
||||
#: netbox/templates/inc/user_menu.html:41
|
||||
msgid "Django Admin"
|
||||
msgstr "Администратор Джанго"
|
||||
msgstr ""
|
||||
|
||||
#: netbox/templates/inc/user_menu.html:61
|
||||
msgid "Log Out"
|
||||
@ -14385,7 +14383,7 @@ msgstr "Добавить виртуальный диск"
|
||||
|
||||
#: netbox/templates/virtualization/virtualmachine/render_config.html:70
|
||||
msgid "No configuration template has been assigned for this virtual machine."
|
||||
msgstr "Для этой виртуальной машины не назначен шаблон конфигурации."
|
||||
msgstr ""
|
||||
|
||||
#: netbox/templates/vpn/ikepolicy.html:10
|
||||
#: netbox/templates/vpn/ipsecprofile.html:33 netbox/vpn/tables/crypto.py:166
|
||||
@ -15497,8 +15495,6 @@ msgid ""
|
||||
"{device} belongs to a different site ({device_site}) than the cluster "
|
||||
"({cluster_site})"
|
||||
msgstr ""
|
||||
"{device} принадлежит другому сайту ({device_site}), чем кластер "
|
||||
"({cluster_site})"
|
||||
|
||||
#: netbox/virtualization/forms/model_forms.py:192
|
||||
msgid "Optionally pin this VM to a specific host device within the cluster"
|
||||
@ -16234,7 +16230,6 @@ msgstr "беспроводные соединения"
|
||||
#: netbox/wireless/models.py:236
|
||||
msgid "Must specify a unit when setting a wireless distance"
|
||||
msgstr ""
|
||||
"При настройке беспроводного расстояния необходимо указать единицу измерения"
|
||||
|
||||
#: netbox/wireless/models.py:242 netbox/wireless/models.py:248
|
||||
#, python-brace-format
|
||||
|
Binary file not shown.
@ -1236,7 +1236,7 @@ msgstr "Devre grubu atamaları"
|
||||
|
||||
#: netbox/circuits/models/circuits.py:240
|
||||
msgid "termination"
|
||||
msgstr "sonlandırma"
|
||||
msgstr ""
|
||||
|
||||
#: netbox/circuits/models/circuits.py:257
|
||||
msgid "port speed (Kbps)"
|
||||
@ -1298,12 +1298,11 @@ msgstr "devre sonlandırmaları"
|
||||
msgid ""
|
||||
"A circuit termination must attach to either a site or a provider network."
|
||||
msgstr ""
|
||||
"Bir devre sonlandırma, bir siteye veya bir sağlayıcı ağına bağlanmalıdır."
|
||||
|
||||
#: netbox/circuits/models/circuits.py:310
|
||||
msgid ""
|
||||
"A circuit termination cannot attach to both a site and a provider network."
|
||||
msgstr "Devre sonlandırma hem siteye hem de sağlayıcı ağına bağlanamaz."
|
||||
msgstr ""
|
||||
|
||||
#: netbox/circuits/models/providers.py:22
|
||||
#: netbox/circuits/models/providers.py:66
|
||||
@ -9794,7 +9793,7 @@ msgstr "ASN Aralığı"
|
||||
|
||||
#: netbox/ipam/forms/model_forms.py:231
|
||||
msgid "Site/VLAN Assignment"
|
||||
msgstr "Site/VLAN Ataması"
|
||||
msgstr ""
|
||||
|
||||
#: netbox/ipam/forms/model_forms.py:259 netbox/templates/ipam/iprange.html:10
|
||||
msgid "IP Range"
|
||||
@ -12617,7 +12616,7 @@ msgstr "Hata oluşturma şablonu"
|
||||
|
||||
#: netbox/templates/dcim/device/render_config.html:70
|
||||
msgid "No configuration template has been assigned for this device."
|
||||
msgstr "Bu aygıt için herhangi bir yapılandırma şablonu atanmadı."
|
||||
msgstr ""
|
||||
|
||||
#: netbox/templates/dcim/device_edit.html:44
|
||||
msgid "Parent Bay"
|
||||
@ -13883,7 +13882,7 @@ msgstr "Yardım Merkezi"
|
||||
|
||||
#: netbox/templates/inc/user_menu.html:41
|
||||
msgid "Django Admin"
|
||||
msgstr "Django Yöneticisi"
|
||||
msgstr ""
|
||||
|
||||
#: netbox/templates/inc/user_menu.html:61
|
||||
msgid "Log Out"
|
||||
@ -14296,7 +14295,7 @@ msgstr "Sanal Disk Ekle"
|
||||
|
||||
#: netbox/templates/virtualization/virtualmachine/render_config.html:70
|
||||
msgid "No configuration template has been assigned for this virtual machine."
|
||||
msgstr "Bu sanal makine için herhangi bir yapılandırma şablonu atanmadı."
|
||||
msgstr ""
|
||||
|
||||
#: netbox/templates/vpn/ikepolicy.html:10
|
||||
#: netbox/templates/vpn/ipsecprofile.html:33 netbox/vpn/tables/crypto.py:166
|
||||
@ -15393,7 +15392,6 @@ msgid ""
|
||||
"{device} belongs to a different site ({device_site}) than the cluster "
|
||||
"({cluster_site})"
|
||||
msgstr ""
|
||||
"{device} farklı bir siteye aittir ({device_site}) kümeden ({cluster_site})"
|
||||
|
||||
#: netbox/virtualization/forms/model_forms.py:192
|
||||
msgid "Optionally pin this VM to a specific host device within the cluster"
|
||||
@ -16125,7 +16123,7 @@ msgstr "kablosuz bağlantılar"
|
||||
|
||||
#: netbox/wireless/models.py:236
|
||||
msgid "Must specify a unit when setting a wireless distance"
|
||||
msgstr "Kablosuz mesafeyi ayarlarken bir birim belirtmelisiniz"
|
||||
msgstr ""
|
||||
|
||||
#: netbox/wireless/models.py:242 netbox/wireless/models.py:248
|
||||
#, python-brace-format
|
||||
|
Binary file not shown.
@ -5,8 +5,8 @@
|
||||
#
|
||||
# Translators:
|
||||
# Volodymyr Pidgornyi, 2024
|
||||
# Jeremy Stretch, 2024
|
||||
# Vladyslav V. Prodan, 2024
|
||||
# Jeremy Stretch, 2025
|
||||
#
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
@ -15,7 +15,7 @@ msgstr ""
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2025-01-04 05:02+0000\n"
|
||||
"PO-Revision-Date: 2023-10-30 17:48+0000\n"
|
||||
"Last-Translator: Jeremy Stretch, 2025\n"
|
||||
"Last-Translator: Vladyslav V. Prodan, 2024\n"
|
||||
"Language-Team: Ukrainian (https://app.transifex.com/netbox-community/teams/178115/uk/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
@ -1235,7 +1235,7 @@ msgstr "Призначення групи каналів зв'язку"
|
||||
|
||||
#: netbox/circuits/models/circuits.py:240
|
||||
msgid "termination"
|
||||
msgstr "припинення"
|
||||
msgstr ""
|
||||
|
||||
#: netbox/circuits/models/circuits.py:257
|
||||
msgid "port speed (Kbps)"
|
||||
@ -1298,14 +1298,11 @@ msgstr "кінці каналу зв'язку"
|
||||
msgid ""
|
||||
"A circuit termination must attach to either a site or a provider network."
|
||||
msgstr ""
|
||||
"Припинення схеми повинно приєднатися або до сайту, або до мережі провайдера."
|
||||
|
||||
#: netbox/circuits/models/circuits.py:310
|
||||
msgid ""
|
||||
"A circuit termination cannot attach to both a site and a provider network."
|
||||
msgstr ""
|
||||
"Припинення схеми не може приєднатися як до сайту, так і до мережі "
|
||||
"провайдера."
|
||||
|
||||
#: netbox/circuits/models/providers.py:22
|
||||
#: netbox/circuits/models/providers.py:66
|
||||
@ -9862,7 +9859,7 @@ msgstr "Діапазон ASN"
|
||||
|
||||
#: netbox/ipam/forms/model_forms.py:231
|
||||
msgid "Site/VLAN Assignment"
|
||||
msgstr "Призначення сайту/VLAN"
|
||||
msgstr ""
|
||||
|
||||
#: netbox/ipam/forms/model_forms.py:259 netbox/templates/ipam/iprange.html:10
|
||||
msgid "IP Range"
|
||||
@ -12692,7 +12689,7 @@ msgstr "Помилка візуалізації шаблону"
|
||||
|
||||
#: netbox/templates/dcim/device/render_config.html:70
|
||||
msgid "No configuration template has been assigned for this device."
|
||||
msgstr "Для цього пристрою не призначено жодного шаблону конфігурації."
|
||||
msgstr ""
|
||||
|
||||
#: netbox/templates/dcim/device_edit.html:44
|
||||
msgid "Parent Bay"
|
||||
@ -13958,7 +13955,7 @@ msgstr "Довідковий центр"
|
||||
|
||||
#: netbox/templates/inc/user_menu.html:41
|
||||
msgid "Django Admin"
|
||||
msgstr "Джанго Адміністратор"
|
||||
msgstr ""
|
||||
|
||||
#: netbox/templates/inc/user_menu.html:61
|
||||
msgid "Log Out"
|
||||
@ -14371,7 +14368,7 @@ msgstr "Додати віртуальний диск"
|
||||
|
||||
#: netbox/templates/virtualization/virtualmachine/render_config.html:70
|
||||
msgid "No configuration template has been assigned for this virtual machine."
|
||||
msgstr "Жоден шаблон конфігурації не призначено для цієї віртуальної машини."
|
||||
msgstr ""
|
||||
|
||||
#: netbox/templates/vpn/ikepolicy.html:10
|
||||
#: netbox/templates/vpn/ipsecprofile.html:33 netbox/vpn/tables/crypto.py:166
|
||||
@ -15478,8 +15475,6 @@ msgid ""
|
||||
"{device} belongs to a different site ({device_site}) than the cluster "
|
||||
"({cluster_site})"
|
||||
msgstr ""
|
||||
"{device} належить до іншого сайту ({device_site}) ніж кластер "
|
||||
"({cluster_site})"
|
||||
|
||||
#: netbox/virtualization/forms/model_forms.py:192
|
||||
msgid "Optionally pin this VM to a specific host device within the cluster"
|
||||
@ -16218,7 +16213,7 @@ msgstr "бездротові канали зв'язку"
|
||||
|
||||
#: netbox/wireless/models.py:236
|
||||
msgid "Must specify a unit when setting a wireless distance"
|
||||
msgstr "Необхідно вказати одиницю при установці бездротової відстані"
|
||||
msgstr ""
|
||||
|
||||
#: netbox/wireless/models.py:242 netbox/wireless/models.py:248
|
||||
#, python-brace-format
|
||||
|
Binary file not shown.
@ -15,6 +15,7 @@
|
||||
# 闻寄云, 2024
|
||||
# luo jiyin, 2024
|
||||
# Jeremy Stretch, 2025
|
||||
# yawei jia, 2025
|
||||
#
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
@ -23,7 +24,7 @@ msgstr ""
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2025-01-04 05:02+0000\n"
|
||||
"PO-Revision-Date: 2023-10-30 17:48+0000\n"
|
||||
"Last-Translator: Jeremy Stretch, 2025\n"
|
||||
"Last-Translator: yawei jia, 2025\n"
|
||||
"Language-Team: Chinese (https://app.transifex.com/netbox-community/teams/178115/zh/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
@ -1242,7 +1243,7 @@ msgstr "电路组分配"
|
||||
|
||||
#: netbox/circuits/models/circuits.py:240
|
||||
msgid "termination"
|
||||
msgstr "终止"
|
||||
msgstr "终端"
|
||||
|
||||
#: netbox/circuits/models/circuits.py:257
|
||||
msgid "port speed (Kbps)"
|
||||
@ -1303,12 +1304,12 @@ msgstr "线路接入"
|
||||
#: netbox/circuits/models/circuits.py:308
|
||||
msgid ""
|
||||
"A circuit termination must attach to either a site or a provider network."
|
||||
msgstr "电路终端必须连接到站点或提供商网络。"
|
||||
msgstr "电路终端必须连接到站点或服务提供商网络。"
|
||||
|
||||
#: netbox/circuits/models/circuits.py:310
|
||||
msgid ""
|
||||
"A circuit termination cannot attach to both a site and a provider network."
|
||||
msgstr "电路终端不能同时连接到站点和提供商网络。"
|
||||
msgstr "电路终端不能同时连接到站点和服务提供商网络。"
|
||||
|
||||
#: netbox/circuits/models/providers.py:22
|
||||
#: netbox/circuits/models/providers.py:66
|
||||
@ -1741,11 +1742,11 @@ msgstr "对象已删除"
|
||||
|
||||
#: netbox/core/events.py:30
|
||||
msgid "Job started"
|
||||
msgstr "工作已开始"
|
||||
msgstr "作业已开始"
|
||||
|
||||
#: netbox/core/events.py:31
|
||||
msgid "Job completed"
|
||||
msgstr "任务已完成"
|
||||
msgstr "作业已完成"
|
||||
|
||||
#: netbox/core/events.py:32
|
||||
msgid "Job failed"
|
||||
@ -9638,7 +9639,7 @@ msgstr "ASN范围"
|
||||
|
||||
#: netbox/ipam/forms/model_forms.py:231
|
||||
msgid "Site/VLAN Assignment"
|
||||
msgstr "站点/VLAN 分配"
|
||||
msgstr "站点/VLAN 关联"
|
||||
|
||||
#: netbox/ipam/forms/model_forms.py:259 netbox/templates/ipam/iprange.html:10
|
||||
msgid "IP Range"
|
||||
@ -12414,7 +12415,7 @@ msgstr "渲染模板时出错"
|
||||
|
||||
#: netbox/templates/dcim/device/render_config.html:70
|
||||
msgid "No configuration template has been assigned for this device."
|
||||
msgstr "尚未为此设备分配任何配置模板。"
|
||||
msgstr "尚未为该设备分配配置模板。"
|
||||
|
||||
#: netbox/templates/dcim/device_edit.html:44
|
||||
msgid "Parent Bay"
|
||||
@ -14051,7 +14052,7 @@ msgstr "增加虚拟硬盘"
|
||||
|
||||
#: netbox/templates/virtualization/virtualmachine/render_config.html:70
|
||||
msgid "No configuration template has been assigned for this virtual machine."
|
||||
msgstr "尚未为此虚拟机分配任何配置模板。"
|
||||
msgstr "尚未为该虚拟机分配配置模板。"
|
||||
|
||||
#: netbox/templates/vpn/ikepolicy.html:10
|
||||
#: netbox/templates/vpn/ipsecprofile.html:33 netbox/vpn/tables/crypto.py:166
|
||||
@ -15100,7 +15101,7 @@ msgstr "序列号"
|
||||
msgid ""
|
||||
"{device} belongs to a different site ({device_site}) than the cluster "
|
||||
"({cluster_site})"
|
||||
msgstr "{device} 属于另一个站点 ({device_site}) 而不是集群 ({cluster_site})"
|
||||
msgstr "{device} 属于与集群 ({cluster_site}) 不同的站点 ({device_site})"
|
||||
|
||||
#: netbox/virtualization/forms/model_forms.py:192
|
||||
msgid "Optionally pin this VM to a specific host device within the cluster"
|
||||
|
@ -2,7 +2,7 @@ import django_filters
|
||||
from django import forms
|
||||
from django.conf import settings
|
||||
from django.forms import BoundField
|
||||
from django.urls import reverse, reverse_lazy
|
||||
from django.urls import reverse
|
||||
|
||||
from utilities.forms import widgets
|
||||
from utilities.views import get_viewname
|
||||
@ -171,10 +171,8 @@ class DynamicModelChoiceMixin:
|
||||
|
||||
# Include quick add?
|
||||
if self.quick_add:
|
||||
app_label = self.model._meta.app_label
|
||||
model_name = self.model._meta.model_name
|
||||
widget.quick_add_context = {
|
||||
'url': reverse_lazy(f'{app_label}:{model_name}_add'),
|
||||
'url': reverse(get_viewname(self.model, 'add')),
|
||||
'params': {},
|
||||
}
|
||||
for k, v in self.quick_add_params.items():
|
||||
|
@ -132,8 +132,9 @@ class TableConfigForm(forms.Form):
|
||||
super().__init__(*args, **kwargs)
|
||||
|
||||
# Initialize columns field based on table attributes
|
||||
self.fields['available_columns'].choices = table.available_columns
|
||||
self.fields['columns'].choices = table.selected_columns
|
||||
if table:
|
||||
self.fields['available_columns'].choices = table.available_columns
|
||||
self.fields['columns'].choices = table.selected_columns
|
||||
|
||||
@property
|
||||
def table_name(self):
|
||||
|
@ -29,7 +29,7 @@ def serialize_object(obj, resolve_tags=True, extra=None, exclude=None):
|
||||
exclude = exclude or []
|
||||
|
||||
# Include custom_field_data as "custom_fields"
|
||||
if hasattr(obj, 'custom_field_data'):
|
||||
if 'custom_field_data' in data:
|
||||
data['custom_fields'] = data.pop('custom_field_data')
|
||||
|
||||
# Resolve any assigned tags to their names. Check for tags cached on the instance;
|
||||
|
@ -1,3 +1,3 @@
|
||||
{% load helpers %}
|
||||
|
||||
{% if viewname %}<a href="{% url viewname %}?tag={{ tag.slug }}">{% endif %}<span class="badge" style="color: {{ tag.color|fgcolor }}; background-color: #{{ tag.color }}">{{ tag }}</span>{% if viewname %}</a>{% endif %}
|
||||
{% if viewname %}<a href="{% url viewname %}?tag={{ tag.slug }}">{% endif %}<span {% if tag.description %}title="{{ tag.description }}"{% endif %} class="badge" style="color: {{ tag.color|fgcolor }}; background-color: #{{ tag.color }}">{{ tag }}</span>{% if viewname %}</a>{% endif %}
|
||||
|
@ -6,7 +6,7 @@ from dcim.constants import INTERFACE_MTU_MAX, INTERFACE_MTU_MIN
|
||||
from dcim.forms.mixins import ScopedBulkEditForm
|
||||
from dcim.models import Device, DeviceRole, Platform, Site
|
||||
from extras.models import ConfigTemplate
|
||||
from ipam.models import VLAN, VLANGroup, VRF
|
||||
from ipam.models import VLAN, VLANGroup, VLANTranslationPolicy, VRF
|
||||
from netbox.forms import NetBoxModelBulkEditForm
|
||||
from tenancy.models import Tenant
|
||||
from utilities.forms import BulkRenameForm, add_blank_choice
|
||||
@ -242,15 +242,23 @@ class VMInterfaceBulkEditForm(NetBoxModelBulkEditForm):
|
||||
required=False,
|
||||
label=_('VRF')
|
||||
)
|
||||
vlan_translation_policy = DynamicModelChoiceField(
|
||||
queryset=VLANTranslationPolicy.objects.all(),
|
||||
required=False,
|
||||
label=_('VLAN Translation Policy')
|
||||
)
|
||||
|
||||
model = VMInterface
|
||||
fieldsets = (
|
||||
FieldSet('mtu', 'enabled', 'vrf', 'description'),
|
||||
FieldSet('parent', 'bridge', name=_('Related Interfaces')),
|
||||
FieldSet('mode', 'vlan_group', 'untagged_vlan', 'tagged_vlans', name=_('802.1Q Switching')),
|
||||
FieldSet(
|
||||
'mode', 'vlan_group', 'untagged_vlan', 'tagged_vlans', 'vlan_translation_policy',
|
||||
name=_('802.1Q Switching')
|
||||
),
|
||||
)
|
||||
nullable_fields = (
|
||||
'parent', 'bridge', 'mtu', 'vrf', 'description',
|
||||
'parent', 'bridge', 'mtu', 'vrf', 'description', 'vlan_translation_policy',
|
||||
)
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
|
@ -122,7 +122,7 @@ class VMInterfaceTable(BaseInterfaceTable):
|
||||
fields = (
|
||||
'pk', 'id', 'name', 'virtual_machine', 'enabled', 'mtu', 'mode', 'description', 'tags', 'vrf',
|
||||
'primary_mac_address', 'l2vpn', 'tunnel', 'ip_addresses', 'fhrp_groups', 'untagged_vlan', 'tagged_vlans',
|
||||
'qinq_svlan', 'created', 'last_updated',
|
||||
'qinq_svlan', 'created', 'last_updated', 'vlan_translation_policy',
|
||||
)
|
||||
default_columns = ('pk', 'name', 'virtual_machine', 'enabled', 'description')
|
||||
|
||||
|
@ -6,7 +6,7 @@ from django.urls import reverse
|
||||
from django.utils.translation import gettext_lazy as _
|
||||
|
||||
from netbox.models import ChangeLoggedModel, OrganizationalModel, PrimaryModel
|
||||
from netbox.models.features import CustomFieldsMixin, CustomLinksMixin, TagsMixin
|
||||
from netbox.models.features import ContactsMixin, CustomFieldsMixin, CustomLinksMixin, TagsMixin
|
||||
from vpn.choices import *
|
||||
|
||||
__all__ = (
|
||||
@ -16,7 +16,7 @@ __all__ = (
|
||||
)
|
||||
|
||||
|
||||
class TunnelGroup(OrganizationalModel):
|
||||
class TunnelGroup(ContactsMixin, OrganizationalModel):
|
||||
"""
|
||||
An administrative grouping of Tunnels. This can be used to correlate peer-to-peer tunnels which form a mesh,
|
||||
for example.
|
||||
@ -27,7 +27,7 @@ class TunnelGroup(OrganizationalModel):
|
||||
verbose_name_plural = _('tunnel groups')
|
||||
|
||||
|
||||
class Tunnel(PrimaryModel):
|
||||
class Tunnel(ContactsMixin, PrimaryModel):
|
||||
name = models.CharField(
|
||||
verbose_name=_('name'),
|
||||
max_length=100,
|
||||
|
@ -68,6 +68,11 @@ class TunnelGroupBulkDeleteView(generic.BulkDeleteView):
|
||||
table = tables.TunnelGroupTable
|
||||
|
||||
|
||||
@register_model_view(TunnelGroup, 'contacts')
|
||||
class TunnelGroupContactsView(ObjectContactsView):
|
||||
queryset = TunnelGroup.objects.all()
|
||||
|
||||
|
||||
#
|
||||
# Tunnels
|
||||
#
|
||||
@ -132,6 +137,11 @@ class TunnelBulkDeleteView(generic.BulkDeleteView):
|
||||
table = tables.TunnelTable
|
||||
|
||||
|
||||
@register_model_view(Tunnel, 'contacts')
|
||||
class TunnelContactsView(ObjectContactsView):
|
||||
queryset = Tunnel.objects.all()
|
||||
|
||||
|
||||
#
|
||||
# Tunnel terminations
|
||||
#
|
||||
|
@ -3,8 +3,10 @@ import logging
|
||||
from django.db.models.signals import post_save, post_delete
|
||||
from django.dispatch import receiver
|
||||
|
||||
from dcim.exceptions import UnsupportedCablePath
|
||||
from dcim.models import CablePath, Interface
|
||||
from dcim.utils import create_cablepath
|
||||
from utilities.exceptions import AbortRequest
|
||||
from .models import WirelessLink
|
||||
|
||||
|
||||
@ -34,7 +36,10 @@ def update_connected_interfaces(instance, created, raw=False, **kwargs):
|
||||
# Create/update cable paths
|
||||
if created:
|
||||
for interface in (instance.interface_a, instance.interface_b):
|
||||
create_cablepath([interface])
|
||||
try:
|
||||
create_cablepath([interface])
|
||||
except UnsupportedCablePath as e:
|
||||
raise AbortRequest(e)
|
||||
|
||||
|
||||
@receiver(post_delete, sender=WirelessLink)
|
||||
|
@ -1,14 +1,14 @@
|
||||
Django==5.1.5
|
||||
django-cors-headers==4.6.0
|
||||
Django==5.1.6
|
||||
django-cors-headers==4.7.0
|
||||
django-debug-toolbar==5.0.1
|
||||
django-filter==24.3
|
||||
django-htmx==1.21.0
|
||||
django-filter==25.1
|
||||
django-htmx==1.22.0
|
||||
django-graphiql-debug-toolbar==0.2.0
|
||||
django-mptt==0.16.0
|
||||
django-pglocks==1.0.4
|
||||
django-prometheus==2.3.1
|
||||
django-redis==5.4.0
|
||||
django-rich==1.13.0
|
||||
django-rich==1.14.0
|
||||
django-rq==3.0
|
||||
django-taggit==6.1.0
|
||||
django-tables2==2.7.5
|
||||
@ -20,7 +20,7 @@ feedparser==6.0.11
|
||||
gunicorn==23.0.0
|
||||
Jinja2==3.1.5
|
||||
Markdown==3.7
|
||||
mkdocs-material==9.6.2
|
||||
mkdocs-material==9.6.5
|
||||
mkdocstrings[python-legacy]==0.27.0
|
||||
netaddr==1.3.0
|
||||
nh3==0.2.20
|
||||
@ -29,9 +29,9 @@ psycopg[c,pool]==3.2.4
|
||||
PyYAML==6.0.2
|
||||
requests==2.32.3
|
||||
rq==2.1.0
|
||||
social-auth-app-django==5.4.2
|
||||
social-auth-core==4.5.4
|
||||
strawberry-graphql==0.258.0
|
||||
social-auth-app-django==5.4.3
|
||||
social-auth-core==4.5.6
|
||||
strawberry-graphql==0.260.2
|
||||
strawberry-graphql-django==0.52.0
|
||||
svgwrite==1.4.3
|
||||
tablib==3.8.0
|
||||
|
Loading…
Reference in New Issue
Block a user