Merge pull request #14830 from netbox-community/develop

Release v3.7.1
This commit is contained in:
Jeremy Stretch 2024-01-17 15:00:06 -05:00 committed by GitHub
commit b871a6c7a6
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
51 changed files with 475 additions and 309 deletions

View File

@ -23,7 +23,7 @@ body:
attributes:
label: NetBox Version
description: What version of NetBox are you currently running?
placeholder: v3.7.0
placeholder: v3.7.1
validations:
required: true
- type: dropdown

View File

@ -7,6 +7,9 @@ contact_links:
- name: ❓ Discussion
url: https://github.com/netbox-community/netbox/discussions
about: "If you're just looking for help, try starting a discussion instead."
- name: 🌎 Correct a Translation
url: https://explore.transifex.com/netbox-community/netbox/
about: "Spot an incorrect translation? You can propose a fix on Transifex."
- name: 💡 Plugin Idea
url: https://plugin-ideas.netbox.dev
about: "Have an idea for a plugin? Head over to the ideas board!"

View File

@ -14,7 +14,7 @@ body:
attributes:
label: NetBox version
description: What version of NetBox are you currently running?
placeholder: v3.7.0
placeholder: v3.7.1
validations:
required: true
- type: dropdown

153
README.md
View File

@ -1,86 +1,129 @@
<div align="center">
<img src="https://raw.githubusercontent.com/netbox-community/netbox/develop/docs/netbox_logo.svg" width="400" alt="NetBox logo" />
<p>The premier source of truth powering network automation</p>
<img src="https://github.com/netbox-community/netbox/workflows/CI/badge.svg?branch=master" alt="CI status" />
<p><strong>The cornerstone of every automated network</strong></p>
<a href="https://github.com/netbox-community/netbox/releases"><img src="https://img.shields.io/github/v/release/netbox-community/netbox" alt="Latest release" /></a>
<a href="https://github.com/netbox-community/netbox/blob/master/LICENSE.txt"><img src="https://img.shields.io/badge/license-Apache_2.0-blue.svg" alt="License" /></a>
<a href="https://github.com/netbox-community/netbox/graphs/contributors"><img src="https://img.shields.io/github/contributors/netbox-community/netbox?color=blue" alt="Contributors" /></a>
<a href="https://github.com/netbox-community/netbox/stargazers"><img src="https://img.shields.io/github/stars/netbox-community/netbox?style=flat" alt="GitHub stars" /></a>
<a href="https://explore.transifex.com/netbox-community/netbox/"><img src="https://img.shields.io/badge/languages-4-blue" alt="Languages supported" /></a>
<a href="https://github.com/netbox-community/netbox/actions/workflows/ci.yml"><img src="https://github.com/netbox-community/netbox/workflows/CI/badge.svg?branch=master" alt="CI status" /></a>
<p></p>
</div>
NetBox is the leading solution for modeling and documenting modern networks. By
combining the traditional disciplines of IP address management (IPAM) and
datacenter infrastructure management (DCIM) with powerful APIs and extensions,
NetBox provides the ideal "source of truth" to power network automation.
Available as open source software under the Apache 2.0 license, NetBox serves
as the cornerstone for network automation in thousands of organizations.
NetBox exists to empower network engineers. Since its release in 2016, it has become the go-to solution for modeling and documenting network infrastructure for thousands of organizations worldwide. As a successor to legacy IPAM and DCIM applications, NetBox provides a cohesive, extensive, and accessible data model for all things networked. By providing a single robust user interface and programmable APIs for everything from cable maps to device configurations, NetBox serves as the central source of truth for the modern network.
* **Physical infrastructure:** Accurately model the physical world, from global regions down to individual racks of gear. Then connect everything - network, console, and power!
* **Modern IPAM:** All the standard IPAM functionality you expect, plus VRF import/export tracking, VLAN management, and overlay support.
* **Data circuits:** Confidently manage the delivery of critical circuits from various service providers, modeled seamlessly alongside your own infrastructure.
* **Power tracking:** Map the distribution of power from upstream sources to individual feeds and outlets.
* **Organization:** Manage tenant and contact assignments natively.
* **Powerful search:** Easily find anything you need using a single global search function.
* **Comprehensive logging:** Leverage both automatic change logging and user-submitted journal entries to track your network's growth over time.
* **Endless customization:** Custom fields, custom links, tags, export templates, custom validation, reports, scripts, and more!
* **Flexible permissions:** An advanced permissions systems enables very flexible delegation of permissions.
* **Integrations:** Easily connect NetBox to your other tooling via its REST & GraphQL APIs.
* **Plugins:** Not finding what you need in the core application? Try one of many community plugins - or build your own!
<p align="center">
<a href="#netboxs-role">NetBox's Role</a> |
<a href="#why-netbox">Why NetBox?</a> |
<a href="#getting-started">Getting Started</a> |
<a href="#get-involved">Get Involved</a> |
<a href="#project-stats">Project Stats</a> |
<a href="#screenshots">Screenshots</a>
</p>
![Screenshot of NetBox UI](docs/media/screenshots/netbox-ui.png "NetBox UI")
<p align="center">
<img src="docs/media/screenshots/home-light.png" width="600" alt="NetBox user interface screenshot" />
</p>
## NetBox's Role
NetBox functions as the **source of truth** for your network infrastructure. Its job is to define and validate the _intended state_ of all network components and resources. NetBox does not interact with network nodes directly; rather, it makes this data available programmatically to purpose-built automation, monitoring, and assurance tools. This separation of duties enables the construction of a robust yet flexible automation system.
<p align="center">
<img src="docs/media/misc/reference_architecture.png" alt="Reference network automation architecture" />
</p>
The diagram above illustrates the recommended deployment architecture for an automated network, leveraging NetBox as the central authority for network state. This approach allows your team to swap out individual tools to meet changing needs while retaining a predictable, modular workflow.
## Why NetBox?
### Comprehensive Data Model
Racks, devices, cables, IP addresses, VLANs, circuits, power, VPNs, and lots more: NetBox is built for networks. Its comprehensive and thoroughly inter-linked data model provides for natural and highly structured modeling of myriad network primitives that just isn't possible using general-purpose tools. And there's no need to waste time contemplating how to build out a database: Everything is ready to go upon installation.
### Focused Development
NetBox strives to meet a singular goal: Provide the best available solution for making network infrastructure programmatically accessible. Unlike "all-in-one" tools which awkwardly bolt on half-baked features in an attempt to check every box, NetBox is committed to its core function. NetBox provides the best possible solution for modeling network infrastructure, and provides rich APIs for integrating with tools that excel in other areas of network automation.
### Extensible and Customizable
No two networks are exactly the same. Users are empowered to extend NetBox's native data model with custom fields and tags to best suit their unique needs. You can even write your own plugins to introduce entirely new objects and functionality!
### Flexible Permissions
NetBox includes a fully customizable permission system, which affords administrators incredible granularity when assigning roles to users and groups. Want to restrict certain users to working only with cabling and not be able to change IP addresses? Or maybe each team should have access only to a particular tenant? NetBox enables you to craft roles as you see fit.
### Custom Validation & Protection Rules
The data you put into NetBox is crucial to network operations. In addition to its robust native validation rules, NetBox provides mechanisms for administrators to define their own custom validation rules for objects. Custom validation can be used both to ensure new or modified objects adhere to a set of rules, and to prevent the deletion of objects which don't meet certain criteria. (For example, you might want to prevent the deletion of a device with an "active" status.)
### Device Configuration Rendering
NetBox can render user-created Jinja2 templates to generate device configurations from its own data. Configuration templates can be uploaded individually or pulled automatically from an external source, such as a git repository. Rendered configurations can be retrieved via the REST API for application directly to network devices via a provisioning tool such as Ansible or Salt.
### Custom Scripts
Complex workflows, such as provisioning a new branch office, can be tedious to carry out via the user interface. NetBox allows you to write and upload custom scripts that can be run directly from the UI. Scripts prompt users for input and then automate the necessary tasks to greatly simplify otherwise burdensome processes.
### Automated Events
Users can define event rules to automatically trigger a custom script or outbound webhook in response to a NetBox event. For example, you might want to automatically update a network monitoring service whenever a new device is added to NetBox, or update a DHCP server when an IP range is allocated.
### Comprehensive Change Logging
NetBox automatically logs the creation, modification, and deletion of all managed objects, providing a thorough change history. Changes can be attributed to the executing user, and related changes are grouped automatically by request ID.
> [!NOTE]
> A complete list of NetBox's myriad features can be found in [the introductory documentation](https://docs.netbox.dev/en/stable/introduction/).
## Getting Started
<div align="center">
[![NetBox logo](https://raw.githubusercontent.com/wiki/netbox-community/netbox/images/deploy/deploy1.png)](https://github.com/netbox-community/netbox)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
[![Docker logo](https://raw.githubusercontent.com/wiki/netbox-community/netbox/images/deploy/deploy2.png)](https://github.com/netbox-community/netbox-docker)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
[![NetBox Labs logo](https://raw.githubusercontent.com/wiki/netbox-community/netbox/images/deploy/deploy3.png)](https://netboxlabs.com/netbox-cloud/)
</div>
* Just want to explore? Check out [our public demo](https://demo.netbox.dev/) right now!
* The [official documentation](https://docs.netbox.dev) offers a comprehensive introduction.
* Check out [our wiki](https://github.com/netbox-community/netbox/wiki/Community-Contributions) for even more projects to get the most out of NetBox!
<p align="center">
<a href="https://netboxlabs.com/netbox-cloud/"><img src="docs/media/misc/netbox_cloud.png" alt="NetBox Cloud" /></a><br />
Looking for an enterprise solution? Check out <strong><a href="https://netboxlabs.com/netbox-cloud/">NetBox Cloud</a></strong>!
</p>
## Get Involved
* Follow [@NetBoxOfficial](https://twitter.com/NetBoxOfficial) on Twitter!
* Join the conversation on [the discussion forum](https://github.com/netbox-community/netbox/discussions) and [Slack](https://netdev.chat/)!
* Already a power user? You can [suggest a feature](https://github.com/netbox-community/netbox/issues/new?assignees=&labels=type%3A+feature&template=feature_request.yaml) or [report a bug](https://github.com/netbox-community/netbox/issues/new?assignees=&labels=type%3A+bug&template=bug_report.yaml) on GitHub.
* Contributions from the community are encouraged and appreciated! Check out our [contributing guide](CONTRIBUTING.md) to get started.
* [Share your idea](https://plugin-ideas.netbox.dev/) for a new plugin, or [learn how to build one](https://github.com/netbox-community/netbox-plugin-tutorial) yourself!
## Project Stats
<div align="center">
<p align="center">
<a href="https://github.com/netbox-community/netbox/commits"><img src="https://images.repography.com/29023055/netbox-community/netbox/recent-activity/whQtEr_TGD9PhW1BPlhlEQ5jnrgQ0KJpm-LlGtpoGO0/3Kx_iWUSBRJ5-AI4QwJEJWrUDEz3KrX2lvh8aYE0WXY_timeline.svg" alt="Timeline graph"></a>
<a href="https://github.com/netbox-community/netbox/issues"><img src="https://images.repography.com/29023055/netbox-community/netbox/recent-activity/whQtEr_TGD9PhW1BPlhlEQ5jnrgQ0KJpm-LlGtpoGO0/3Kx_iWUSBRJ5-AI4QwJEJWrUDEz3KrX2lvh8aYE0WXY_issues.svg" alt="Issues graph"></a>
<a href="https://github.com/netbox-community/netbox/pulls"><img src="https://images.repography.com/29023055/netbox-community/netbox/recent-activity/whQtEr_TGD9PhW1BPlhlEQ5jnrgQ0KJpm-LlGtpoGO0/3Kx_iWUSBRJ5-AI4QwJEJWrUDEz3KrX2lvh8aYE0WXY_prs.svg" alt="Pull requests graph"></a>
<a href="https://github.com/netbox-community/netbox/graphs/contributors"><img src="https://images.repography.com/29023055/netbox-community/netbox/recent-activity/whQtEr_TGD9PhW1BPlhlEQ5jnrgQ0KJpm-LlGtpoGO0/3Kx_iWUSBRJ5-AI4QwJEJWrUDEz3KrX2lvh8aYE0WXY_users.svg" alt="Top contributors"></a>
<br />Stats via <a href="https://repography.com">Repography</a>
</div>
## Sponsors
<div align="center">
[![NetBox Labs](https://raw.githubusercontent.com/wiki/netbox-community/netbox/images/sponsors/netbox_labs.png)](https://netboxlabs.com)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
[![DigitalOcean](https://raw.githubusercontent.com/wiki/netbox-community/netbox/images/sponsors/digitalocean.png)](https://try.digitalocean.com/developer-cloud)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
[![Sentry](https://raw.githubusercontent.com/wiki/netbox-community/netbox/images/sponsors/sentry.png)](https://sentry.io)
<br />
[![Equinix Metal](https://raw.githubusercontent.com/wiki/netbox-community/netbox/images/sponsors/equinix.png)](https://metal.equinix.com)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
[![OneMind Services](https://raw.githubusercontent.com/wiki/netbox-community/netbox/images/sponsors/onemind_services.png)](https://onemindservices.com)
</div>
</p>
## Screenshots
![Screenshot of main page (dark mode)](docs/media/screenshots/home-dark.png "Main page (dark mode)")
![Screenshot of rack elevation](docs/media/screenshots/rack.png "Rack elevation")
![Screenshot of prefixes hierarchy](docs/media/screenshots/prefixes-list.png "Prefixes hierarchy")
![Screenshot of cable trace](docs/media/screenshots/cable-trace.png "Cable tracing")
<p align="center">
<strong>NetBox Dashboard (Light Mode)</strong><br />
<img src="docs/media/screenshots/home-light.png" width="600" alt="NetBox dashboard (light mode)" />
</p>
<p align="center">
<strong>NetBox Dashboard (Dark Mode)</strong><br />
<img src="docs/media/screenshots/home-dark.png" width="600" alt="NetBox dashboard (dark mode)" />
</p>
<p align="center">
<strong>Prefixes List</strong><br />
<img src="docs/media/screenshots/prefixes-list.png" width="600" alt="Prefixes list" />
</p>
<p align="center">
<strong>Rack View</strong><br />
<img src="docs/media/screenshots/rack.png" width="600" alt="Rack view" />
</p>
<p align="center">
<strong>Cable Trace</strong><br />
<img src="docs/media/screenshots/cable-trace.png" width="600" alt="Cable trace" />
</p>

View File

@ -73,7 +73,7 @@ You should be redirected to Microsoft's authentication portal. Enter the usernam
If successful, you will be redirected back to the NetBox UI, and will be logged in as the AD user. You can verify this by navigating to your profile (using the button at top right).
This user account has been replicated locally to NetBox, and can now be assigned groups and permissions within the NetBox admin UI.
This user account has been replicated locally to NetBox, and can now be assigned groups and permissions by navigating to Admin > Permissions.
## Troubleshooting

View File

@ -67,4 +67,4 @@ You should be redirected to Okta's authentication portal. Enter the username/ema
If successful, you will be redirected back to the NetBox UI, and will be logged in as the Okta user. You can verify this by navigating to your profile (using the button at top right).
This user account has been replicated locally to NetBox, and can now be assigned groups and permissions within the NetBox admin UI.
This user account has been replicated locally to NetBox, and can now be assigned groups and permissions by navigating to Admin > Permissions.

View File

@ -2,9 +2,9 @@
## Local Authentication
Local user accounts and groups can be created in NetBox under the "Authentication and Authorization" section of the administrative user interface. This interface is available only to users with the "staff" permission enabled.
Local user accounts and groups can be created in NetBox under the "Authentication" section in the "Admin" menu. This section is available only to users with the "staff" permission enabled.
At a minimum, each user account must have a username and password set. User accounts may also denote a first name, last name, and email address. [Permissions](../permissions.md) may also be assigned to users and/or groups within the admin UI.
At a minimum, each user account must have a username and password set. User accounts may also denote a first name, last name, and email address. [Permissions](../permissions.md) may also be assigned to users and/or groups under Admin > Permissions.
## Remote Authentication

View File

@ -46,4 +46,4 @@ The configuration file may be modified at any time. However, the WSGI service (e
$ sudo systemctl restart netbox
```
Configuration parameters which are set via the admin UI (those listed under "dynamic settings") take effect immediately.
Dynamic configuration parameters (those which can be modified via the UI) take effect immediately.

View File

@ -288,9 +288,9 @@ An IPv4 or IPv6 network with a mask. Returns a `netaddr.IPNetwork` object. Two a
## Running Custom Scripts
!!! note
To run a custom script, a user must be assigned via permissions for `Extras > Script`, `Extras > ScriptModule`, and `Core > ManagedFile` objects. They must also be assigned the `extras.run_script` permission. This is achieved by assigning the user (or group) a permission on the Script object and specifying the `run` action in the admin UI as shown below.
To run a custom script, a user must be assigned permissions for `Extras > Script`, `Extras > Script Module`, and `Core > Managed File` objects. They must also be assigned the `extras.run_script` permission. This is achieved by assigning the user (or group) a permission on the Script object and specifying the `run` action in "Permissions" as shown below.
![Adding the run action to a permission](../media/admin_ui_run_permission.png)
![Adding the run action to a permission](../media/run_permission.png)
### Via the Web UI

View File

@ -132,9 +132,9 @@ Once you have created a report, it will appear in the reports list. Initially, r
## Running Reports
!!! note
To run a report, a user must be assigned via permissions for `Extras > Report`, `Extras > ReportModule`, and `Core > ManagedFile` objects. They must also be assigned the `extras.run_report` permission. This is achieved by assigning the user (or group) a permission on the Report object and specifying the `run` action in the admin UI as shown below.
To run a report, a user must be assigned permissions for `Extras > Report`, `Extras > Report Module`, and `Core > Managed File` objects. They must also be assigned the `extras.run_report` permission. This is achieved by assigning the user (or group) a permission on the Report object and specifying the `run` action in "Permissions" as shown below.
![Adding the run action to a permission](../media/admin_ui_run_permission.png)
![Adding the run action to a permission](../media/run_permission.png)
### Via the Web UI

View File

@ -80,6 +80,18 @@ Run the following command to update the device type definition validation schema
This will automatically update the schema file at `contrib/generated_schema.json`.
### Update & Compile Translations
Log into [Transifex](https://app.transifex.com/netbox-community/netbox/dashboard/) to download the updated string maps. Download the resource (portable object, or `.po`) file for each language and save them to `netbox/translations/$lang/LC_MESSAGES/django.po`, overwriting the current files. (Be sure to click the **Download for use** link.)
![Transifex download](../media/development/transifex_download.png)
Once the resource files for all languages have been updated, compile the machine object (`.mo`) files using the `compilemessages` management command:
```nohighlight
./manage.py compilemessages
```
### Update Version and Changelog
* Update the `VERSION` constant in `settings.py` to the new release version.
@ -90,7 +102,7 @@ Commit these changes to the `develop` branch and push upstream.
### Verify CI Build Status
Ensure that continuous integration testing on the `develop` branch is completing successfully. If it fails, take action to correct the failure before proceding with the release.
Ensure that continuous integration testing on the `develop` branch is completing successfully. If it fails, take action to correct the failure before proceeding with the release.
### Submit a Pull Request

View File

@ -0,0 +1,30 @@
# Translations
NetBox coordinates all translation work using the [Transifex](https://explore.transifex.com/netbox-community/netbox/) platform. Signing up for a Transifex account is free.
All language translations in NetBox are generated from the source file found at `netbox/translations/en/LC_MESSAGES/django.po`. This file contains the original English strings with empty mappings, and is generated as part of NetBox's release process. Transifex updates source strings from this file on a recurring basis, so new translation strings will appear in the platform automatically as it is updated in the code base.
Reviewers log into Transifex and navigate to their designated language(s) to translate strings. The initial translation for most strings will be machine-generated via the AWS Translate service. Human reviewers are responsible for reviewing these translations and making corrections where necessary.
Immediately prior to each NetBox release, the translation maps for all completed languages will be downloaded from Transifex, compiled, and checked into the NetBox code base by a maintainer.
## Updating Translation Sources
To update the English `.po` file from which all translations are derived, use the `makemessages` management command:
```nohighlight
./manage.py makemessages -l en
```
Then, commit the change and push to the `develop` branch on GitHub. After some time, any new strings will appear for translation on Transifex automatically.
## Proposing New Languages
If you'd like to add support for a new language to NetBox, the first step is to [submit a GitHub issue](https://github.com/netbox-community/netbox/issues/new?assignees=&labels=type%3A+translation&projects=&template=translation.yaml) to capture the proposal. While we'd like to add as many languages as possible, we do need to limit the rate at which new languages are added. New languages will be selected according to community interest and the number of volunteers who sign up as translators.
Once a proposed language has been approved, a NetBox maintainer will:
* Add it to the Transifex platform
* Designate one or more reviewers
* Create the initial machine-generated translations for review
* Add it to the list of supported languages

View File

@ -39,7 +39,7 @@ When rendered for a specific NetBox device, the template's `device` variable wil
### Context Data
The objet for which the configuration is being rendered is made available as template context as `device` or `virtualmachine` for devices and virtual machines, respectively. Additionally, NetBox model classes can be accessed by the app or plugin in which they reside. For example:
The object for which the configuration is being rendered is made available as template context as `device` or `virtualmachine` for devices and virtual machines, respectively. Additionally, NetBox model classes can be accessed by the app or plugin in which they reside. For example:
```
There are {{ dcim.Site.objects.count() }} sites.
@ -70,6 +70,11 @@ This request will trigger resolution of the device's preferred config template i
If no config template has been assigned to any of these three objects, the request will fail.
The configuration can be rendered as JSON or as plaintext by setting the `Accept:` HTTP header. For example:
* `Accept: application/json`
* `Accept: text/plain`
### General Purpose Use
NetBox config templates can also be rendered without being tied to any specific device, using a separate general purpose REST API endpoint. Any data included with a POST request to this endpoint will be passed as context data for the template.

View File

@ -1,6 +1,6 @@
# Synchronized Data
Several models in NetBox support the automatic synchronization of local data from a designated remote source. For example, [configuration templates](./configuration-rendering.md) defined in NetBox can source their content from text files stored in a remote git repository. This accomplished using the core [data source](../models/core/datasource.md) and [data file](../models/core/datafile.md) models.
Several models in NetBox support the automatic synchronization of local data from a designated remote source. For example, [configuration templates](./configuration-rendering.md) defined in NetBox can source their content from text files stored in a remote git repository. This is accomplished using the core [data source](../models/core/datasource.md) and [data file](../models/core/datafile.md) models.
To enable remote data synchronization, the NetBox administrator first designates one or more remote data sources. NetBox currently supports the following source types:

View File

@ -4,7 +4,7 @@
NetBox is the leading solution for modeling and documenting modern networks. By combining the traditional disciplines of IP address management (IPAM) and datacenter infrastructure management (DCIM) with powerful APIs and extensions, NetBox provides the ideal "source of truth" to power network automation. Read on to discover why thousands of organizations worldwide put NetBox at the heart of their infrastructure.
[![NetBox UI](./media/screenshots/netbox-ui.png)](./media/screenshots/netbox-ui.png)
[![NetBox UI](./media/screenshots/home-light.png)](./media/screenshots/home-light.png)
## :material-server-network: Built for Networks

View File

@ -106,6 +106,6 @@ Content-Type: application/x-www-form-urlencoded
------------
```
Note that `webhook_receiver` does not actually _do_ anything with the information received: It merely prints the request headers and body for inspection.
Note that `webhook_receiver` does not actually _do_ anything with the information received: It merely prints the request headers and body for inspection. If you don't see any output, check that the `rqworker` process is running and that webhook events are being placed into the queue.
Now, when the NetBox webhook is triggered and processed, you should see its headers and content appear in the terminal where the webhook receiver is listening. If you don't, check that the `rqworker` process is running and that webhook events are being placed into the queue (visible under the NetBox admin UI).
Webhook results can be found in the NetBox admin UI under the Background Tasks section. You can see any finished or failed runs, as well as the error log for failed webhooks.

Binary file not shown.

After

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

View File

Before

Width:  |  Height:  |  Size: 22 KiB

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 100 KiB

After

Width:  |  Height:  |  Size: 207 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 173 KiB

After

Width:  |  Height:  |  Size: 316 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 309 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 171 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 116 KiB

After

Width:  |  Height:  |  Size: 356 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 81 KiB

After

Width:  |  Height:  |  Size: 235 KiB

View File

@ -1,5 +1,23 @@
# NetBox v3.7
## v3.7.1 (2024-01-17)
### Bug Fixes
* [#13844](https://github.com/netbox-community/netbox/issues/13844) - Use `available_at_site` filter when filtering VLANs under prefix form
* [#14663](https://github.com/netbox-community/netbox/issues/14663) - Fix tunnel creation when setting initial termination to a VM interface
* [#14706](https://github.com/netbox-community/netbox/issues/14706) - Relax one-to-one mapping of tunnel termination to IP address
* [#14709](https://github.com/netbox-community/netbox/issues/14709) - Fix typo in tunnel termination type choice name
* [#14749](https://github.com/netbox-community/netbox/issues/14749) - Remove errant translation wrapper from `installed_device` on DeviceBay
* [#14778](https://github.com/netbox-community/netbox/issues/14778) - Custom field API serializer should accept null values for all optional fields
* [#14791](https://github.com/netbox-community/netbox/issues/14791) - Hide available prefixes when searching within a parent prefix
* [#14793](https://github.com/netbox-community/netbox/issues/14793) - Add missing Diffie-Hellman group 15
* [#14816](https://github.com/netbox-community/netbox/issues/14816) - Ensure default contact assignment ordering is consistent
* [#14817](https://github.com/netbox-community/netbox/issues/14817) - Relax required fields for IKE & IPSec models on bulk import
* [#14827](https://github.com/netbox-community/netbox/issues/14827) - Ensure all matching event rules are processed in response to an event
---
## v3.7.0 (2023-12-29)
### Breaking Changes
@ -10,6 +28,7 @@
* The internal ConfigRevision model has moved from `extras` to `core`. Configuration history will be retained throughout the upgrade process.
* The [L2VPN](../models/vpn/l2vpn.md) and [L2VPNTermination](../models/vpn/l2vpntermination.md) models have moved from the `ipam` app to the new `vpn` app. All object data will be retained, however please note that the relevant API endpoints have likewise moved to `/api/vpn/`.
* The `CustomFieldsMixin`, `SavedFiltersMixin`, and `TagsMixin` classes have moved from the `extras.forms.mixins` module to `netbox.forms.mixins`.
* The `netbox.models.features.WebhooksMixin` class has been renamed to `EventRulesMixin`.
### New Features

View File

@ -286,6 +286,7 @@ nav:
- User Preferences: 'development/user-preferences.md'
- Web UI: 'development/web-ui.md'
- Internationalization: 'development/internationalization.md'
- Translations: 'development/translations.md'
- Release Checklist: 'development/release-checklist.md'
- git Cheat Sheet: 'development/git-cheat-sheet.md'
- Release Notes:

View File

@ -1115,7 +1115,7 @@ class DeviceBay(ComponentModel, TrackingModelMixin):
installed_device = models.OneToOneField(
to='dcim.Device',
on_delete=models.SET_NULL,
related_name=_('parent_bay'),
related_name='parent_bay',
blank=True,
null=True
)

View File

@ -126,11 +126,15 @@ class CustomFieldSerializer(ValidatedModelSerializer):
type = ChoiceField(choices=CustomFieldTypeChoices)
object_type = ContentTypeField(
queryset=ContentType.objects.all(),
required=False
required=False,
allow_null=True
)
filter_logic = ChoiceField(choices=CustomFieldFilterLogicChoices, required=False)
data_type = serializers.SerializerMethodField()
choice_set = NestedCustomFieldChoiceSetSerializer(required=False)
choice_set = NestedCustomFieldChoiceSetSerializer(
required=False,
allow_null=True
)
ui_visible = ChoiceField(choices=CustomFieldUIVisibleChoices, required=False)
ui_editable = ChoiceField(choices=CustomFieldUIEditableChoices, required=False)

View File

@ -81,7 +81,7 @@ def process_event_rules(event_rules, model_name, event, data, username, snapshot
# Evaluate event rule conditions (if any)
if not event_rule.eval_conditions(data):
return
continue
# Webhooks
if event_rule.action_type == EventRuleActionChoices.WEBHOOK:

View File

@ -214,7 +214,7 @@ class PrefixForm(TenancyForm, NetBoxModelForm):
required=False,
selector=True,
query_params={
'site_id': '$site',
'available_at_site': '$site',
},
label=_('VLAN'),
)

View File

@ -604,7 +604,7 @@ class PrefixIPAddressesView(generic.ObjectChildrenView):
return parent.get_child_ips().restrict(request.user, 'view').prefetch_related('vrf', 'tenant', 'tenant__group')
def prep_table_data(self, request, queryset, parent):
if not get_table_ordering(request, self.table):
if not request.GET.get('q') and not get_table_ordering(request, self.table):
return add_available_ipaddresses(parent.prefix, queryset, parent.is_pool)
return queryset

View File

@ -30,13 +30,13 @@ __all__ = (
'CustomFieldsMixin',
'CustomLinksMixin',
'CustomValidationMixin',
'EventRulesMixin',
'ExportTemplatesMixin',
'ImageAttachmentsMixin',
'JobsMixin',
'JournalingMixin',
'SyncedDataMixin',
'TagsMixin',
'EventRulesMixin',
)

View File

@ -28,7 +28,7 @@ from netbox.plugins import PluginConfig
# Environment setup
#
VERSION = '3.7.0'
VERSION = '3.7.1'
# Hostname
HOSTNAME = platform.node()

View File

@ -83,6 +83,6 @@ class ContactViewSet(NetBoxModelViewSet):
class ContactAssignmentViewSet(NetBoxModelViewSet):
queryset = ContactAssignment.objects.prefetch_related('object', 'contact', 'role')
queryset = ContactAssignment.objects.prefetch_related('content_type', 'object', 'contact', 'role', 'tags')
serializer_class = serializers.ContactAssignmentSerializer
filterset_class = filtersets.ContactAssignmentFilterSet

View File

@ -0,0 +1,17 @@
# Generated by Django 4.2.8 on 2024-01-17 15:27
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('tenancy', '0013_gfk_indexes'),
]
operations = [
migrations.AlterModelOptions(
name='contactassignment',
options={'ordering': ('contact', 'priority', 'role', 'pk')},
),
]

View File

@ -140,7 +140,7 @@ class ContactAssignment(CustomFieldsMixin, ExportTemplatesMixin, TagsMixin, Chan
clone_fields = ('content_type', 'object_id', 'role', 'priority')
class Meta:
ordering = ('priority', 'contact')
ordering = ('contact', 'priority', 'role', 'pk')
indexes = (
models.Index(fields=('content_type', 'object_id')),
)

View File

@ -25,7 +25,7 @@ class ObjectContactsView(generic.ObjectChildrenView):
return ContactAssignment.objects.restrict(request.user, 'view').filter(
content_type=ContentType.objects.get_for_model(parent),
object_id=parent.pk
)
).order_by('priority', 'contact', 'role')
def get_table(self, *args, **kwargs):
table = super().get_table(*args, **kwargs)

View File

@ -5,6 +5,7 @@
#
# Translators:
# Jeremy Stretch, 2023
# Jonathan Senecal, 2024
#
#, fuzzy
msgid ""
@ -13,7 +14,7 @@ msgstr ""
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-12-21 17:54+0000\n"
"PO-Revision-Date: 2023-10-30 17:48+0000\n"
"Last-Translator: Jeremy Stretch, 2023\n"
"Last-Translator: Jonathan Senecal, 2024\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"
@ -110,7 +111,7 @@ msgstr "Région (ID)"
#: virtualization/filtersets.py:52 virtualization/filtersets.py:179
#: vpn/filtersets.py:325
msgid "Region (slug)"
msgstr "Région (limace)"
msgstr "Région (slug)"
#: circuits/filtersets.py:42 circuits/filtersets.py:195 dcim/filtersets.py:194
#: dcim/filtersets.py:269 dcim/filtersets.py:377 dcim/filtersets.py:894
@ -188,11 +189,11 @@ msgstr "Site"
#: virtualization/filtersets.py:75 virtualization/filtersets.py:202
#: vpn/filtersets.py:335
msgid "Site (slug)"
msgstr "Site (limace)"
msgstr "Site (slug)"
#: circuits/filtersets.py:65
msgid "ASN (ID)"
msgstr "ASN (IDENTIFIANT)"
msgstr "ASN (ID)"
#: circuits/filtersets.py:86 circuits/filtersets.py:112
#: circuits/filtersets.py:146
@ -210,7 +211,7 @@ msgstr "Compte fournisseur (ID)"
#: circuits/filtersets.py:162
msgid "Provider network (ID)"
msgstr "Réseau de fournisseurs (ID)"
msgstr "Réseau fournisseur (ID)"
#: circuits/filtersets.py:166
msgid "Circuit type (ID)"
@ -256,7 +257,7 @@ msgstr "Circuit"
#: circuits/filtersets.py:254
msgid "ProviderNetwork (ID)"
msgstr "Réseau de fournisseurs (ID)"
msgstr "Réseau fournisseur (ID)"
#: circuits/forms/bulk_edit.py:25 circuits/forms/filtersets.py:56
#: circuits/forms/model_forms.py:26 circuits/tables/providers.py:33
@ -266,7 +267,7 @@ msgstr "Réseau de fournisseurs (ID)"
#: netbox/navigation/menu.py:160 netbox/navigation/menu.py:163
#: templates/circuits/provider.html:24
msgid "ASNs"
msgstr "SAN"
msgstr "Numéros d'AS"
#: circuits/forms/bulk_edit.py:29 circuits/forms/bulk_edit.py:51
#: circuits/forms/bulk_edit.py:78 circuits/forms/bulk_edit.py:99
@ -363,7 +364,7 @@ msgstr "SAN"
#: vpn/forms/bulk_edit.py:277 wireless/forms/bulk_edit.py:28
#: wireless/forms/bulk_edit.py:81 wireless/forms/bulk_edit.py:128
msgid "Description"
msgstr "Descriptif"
msgstr "Description"
#: circuits/forms/bulk_edit.py:46 circuits/forms/bulk_edit.py:68
#: circuits/forms/bulk_edit.py:118 circuits/forms/bulk_import.py:35
@ -449,7 +450,7 @@ msgstr "Type"
#: circuits/forms/bulk_edit.py:123 circuits/forms/bulk_import.py:82
#: circuits/forms/filtersets.py:139 circuits/forms/model_forms.py:97
msgid "Provider account"
msgstr "Compte du fournisseur"
msgstr "Identifiant de compte du prestataire"
#: circuits/forms/bulk_edit.py:131 circuits/forms/bulk_import.py:95
#: circuits/forms/filtersets.py:150 core/forms/filtersets.py:34
@ -504,7 +505,7 @@ msgstr "Compte du fournisseur"
#: wireless/forms/filtersets.py:82 wireless/tables/wirelesslan.py:52
#: wireless/tables/wirelesslink.py:19
msgid "Status"
msgstr "État"
msgstr "Statut"
#: circuits/forms/bulk_edit.py:137 circuits/forms/bulk_import.py:100
#: circuits/forms/filtersets.py:119 dcim/forms/bulk_edit.py:120
@ -575,7 +576,7 @@ msgstr "Date de résiliation"
#: circuits/forms/bulk_edit.py:153 circuits/forms/filtersets.py:186
msgid "Commit rate (Kbps)"
msgstr "Taux de validation (Kbits/s)"
msgstr "Débit engagé (Kbits/s)"
#: circuits/forms/bulk_edit.py:168 circuits/forms/model_forms.py:111
msgid "Service Parameters"
@ -597,7 +598,7 @@ msgstr "Paramètres du service"
#: vpn/forms/model_forms.py:146 vpn/forms/model_forms.py:404
#: wireless/forms/model_forms.py:55 wireless/forms/model_forms.py:160
msgid "Tenancy"
msgstr "Location"
msgstr "Utilisateur"
#: circuits/forms/bulk_import.py:38 circuits/forms/bulk_import.py:53
#: circuits/forms/bulk_import.py:79
@ -608,11 +609,11 @@ msgstr "Prestataire assigné"
#: dcim/forms/bulk_import.py:380 dcim/forms/bulk_import.py:1092
#: dcim/forms/bulk_import.py:1171 extras/forms/bulk_import.py:229
msgid "RGB color in hexadecimal. Example:"
msgstr "Couleur RGB en hexadécimal. Exemple :"
msgstr "Couleur RVB en hexadécimal. Exemple :"
#: circuits/forms/bulk_import.py:85
msgid "Assigned provider account"
msgstr "Compte fournisseur attribué"
msgstr "Compte prestataire attribué"
#: circuits/forms/bulk_import.py:92
msgid "Type of circuit"
@ -1174,7 +1175,7 @@ msgstr "Courir"
#: core/choices.py:58 extras/choices.py:211
msgid "Errored"
msgstr "Errulé"
msgstr "En erreur"
#: core/data_backends.py:29 templates/dcim/interface.html:224
msgid "Local"
@ -1188,7 +1189,7 @@ msgstr "Nom d'utilisateur"
#: core/data_backends.py:49 core/data_backends.py:55
msgid "Only used for cloning with HTTP(S)"
msgstr "Utilisé uniquement pour le clonage avec HTTP (S)"
msgstr "Utilisé uniquement pour le clonage avec HTTP(S)"
#: core/data_backends.py:53 templates/account/base.html:17
#: templates/account/password.html:11 users/forms/model_forms.py:171
@ -1343,7 +1344,7 @@ msgstr "Paramètres du backend"
#: core/forms/model_forms.py:94
msgid "File Upload"
msgstr "Téléchargement de fichiers"
msgstr "Téléversement de fichiers"
#: core/forms/model_forms.py:147 templates/core/configrevision.html:43
#: templates/dcim/rack_elevation_list.html:6
@ -1394,7 +1395,7 @@ msgstr "Divers"
#: core/forms/model_forms.py:158
msgid "Config Revision"
msgstr "Révision de la configuration"
msgstr "Révision de configuration"
#: core/forms/model_forms.py:197
msgid "This parameter has been defined statically and cannot be modified."
@ -1426,7 +1427,7 @@ msgstr "données de configuration"
#: core/models/config.py:36
msgid "config revision"
msgstr "révision de la configuration"
msgstr "révision de configuration"
#: core/models/config.py:37
msgid "config revisions"
@ -7596,7 +7597,7 @@ msgstr "Secondaire"
#: ipam/choices.py:91
msgid "Anycast"
msgstr "N'importe quel cast"
msgstr "Anycast"
#: ipam/choices.py:115
msgid "Standard"
@ -7791,8 +7792,8 @@ msgstr "C'est une piscine"
#: ipam/forms/bulk_edit.py:257 ipam/forms/bulk_edit.py:301
#: ipam/models/ip.py:271 ipam/models/ip.py:538
#, python-format
msgid "Treat as 100% utilized"
msgstr "Traiter comme utilisé à 100 %"
msgid "Treat as 100%% utilized"
msgstr "Traiter comme utilisé à 100%%"
#: ipam/forms/bulk_edit.py:349 ipam/models/ip.py:771
msgid "DNS name"
@ -8009,7 +8010,7 @@ msgstr "Famille d'adresses"
#: ipam/forms/filtersets.py:118 templates/ipam/asnrange.html:26
msgid "Range"
msgstr "Gamme"
msgstr "Plage"
#: ipam/forms/filtersets.py:127
msgid "Start"
@ -8029,8 +8030,8 @@ msgstr "Présent en VRF"
#: ipam/forms/filtersets.py:243 ipam/forms/filtersets.py:282
#, python-format
msgid "Marked as 100% utilized"
msgstr "Marqué comme étant utilisé à 100 %"
msgid "Marked as 100%% utilized"
msgstr "Marqué comme étant utilisé à 100%%"
#: ipam/forms/filtersets.py:297
msgid "Device/VM"
@ -8094,7 +8095,7 @@ msgstr "Agrégat"
#: ipam/forms/model_forms.py:134 templates/ipam/asnrange.html:12
msgid "ASN Range"
msgstr "Gamme ASN"
msgstr "Plage ASN"
#: ipam/forms/model_forms.py:230
msgid "Site/VLAN Assignment"
@ -8102,7 +8103,7 @@ msgstr "Affectation de site/VLAN"
#: ipam/forms/model_forms.py:256 templates/ipam/iprange.html:11
msgid "IP Range"
msgstr "Gamme IP"
msgstr "Plage IP"
#: ipam/forms/model_forms.py:285 ipam/forms/model_forms.py:454
#: templates/ipam/fhrpgroup.html:19 templates/ipam/ipaddress_edit.html:52
@ -8184,11 +8185,11 @@ msgstr "démarrer"
#: ipam/models/asns.py:51
msgid "ASN range"
msgstr "Gamme ASN"
msgstr "Plage ASN"
#: ipam/models/asns.py:52
msgid "ASN ranges"
msgstr "Gammes ASN"
msgstr "Plages ASN"
#: ipam/models/asns.py:72
#, python-brace-format
@ -8380,7 +8381,7 @@ msgstr "plage IP"
#: ipam/models/ip.py:548
msgid "IP ranges"
msgstr "Gammes IP"
msgstr "Plages IP"
#: ipam/models/ip.py:564
msgid "Starting and ending IP address versions must match"
@ -8636,7 +8637,7 @@ msgstr "Utilisation"
#: ipam/tables/ip.py:170 netbox/navigation/menu.py:149
msgid "IP Ranges"
msgstr "Gammes d'adresses IP"
msgstr "Plages d'adresses IP"
#: ipam/tables/ip.py:220
msgid "Prefix (Flat)"
@ -8706,7 +8707,7 @@ msgstr "Préfixes pour enfants"
#: ipam/views.py:571
msgid "Child Ranges"
msgstr "Gammes pour enfants"
msgstr "Plages pour enfants"
#: ipam/views.py:868
msgid "Related IPs"
@ -9050,7 +9051,7 @@ msgstr "Préfixes et rôles VLAN"
#: netbox/navigation/menu.py:162
msgid "ASN Ranges"
msgstr "Gammes ASN"
msgstr "Plages ASN"
#: netbox/navigation/menu.py:184
msgid "VLAN Groups"
@ -9457,7 +9458,7 @@ msgstr "Annuler"
#: utilities/templates/helpers/applied_filters.html:16
#: utilities/templates/helpers/table_config_form.html:40
msgid "Save"
msgstr "Sauver"
msgstr "Sauvegarder"
#: templates/account/preferences.html:41
msgid "Table Configurations"
@ -9598,11 +9599,11 @@ msgid ""
"production system"
msgstr ""
"Les performances peuvent être limitées. Le débogage ne doit jamais être "
"activé sur un système de production"
"activé sur un système en production"
#: templates/base/layout.html:83
msgid "Maintenance Mode"
msgstr "Mode de maintenance"
msgstr "Mode Maintenance"
#: templates/base/layout.html:134
msgid "Docs"
@ -9642,16 +9643,16 @@ msgstr "Date de résiliation"
#: templates/circuits/circuit_terminations_swap.html:4
msgid "Swap Circuit Terminations"
msgstr "Terminaisons du circuit d'échange"
msgstr "Échanger les terminaisons du circuit"
#: templates/circuits/circuit_terminations_swap.html:8
#, python-format
msgid "Swap these terminations for circuit %(circuit)s?"
msgstr "Remplacez ces terminaisons par un circuit %(circuit)s?"
msgstr "Échanger les terminaisons du circuit %(circuit)s?"
#: templates/circuits/circuit_terminations_swap.html:14
msgid "A side"
msgstr "Un côté"
msgstr "Coté A"
#: templates/circuits/circuit_terminations_swap.html:22
msgid "Z side"
@ -9662,11 +9663,11 @@ msgstr "Côté Z"
#: templates/dcim/frontport.html:128 templates/dcim/interface.html:199
#: templates/dcim/rearport.html:118
msgid "Circuit Termination"
msgstr "Terminaison du circuit"
msgstr "Terminaison de circuit"
#: templates/circuits/circuittermination_edit.html:41
msgid "Termination Details"
msgstr "Détails de résiliation"
msgstr "Détails de terminaison"
#: templates/circuits/circuittype.html:10
msgid "Add Circuit"

View File

@ -4,8 +4,8 @@
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
# Translators:
# Renato Almeida de Oliveira, 2023
# Jeremy Stretch, 2023
# Renato Almeida de Oliveira, 2024
#
#, fuzzy
msgid ""
@ -14,7 +14,7 @@ msgstr ""
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-12-21 17:54+0000\n"
"PO-Revision-Date: 2023-10-30 17:48+0000\n"
"Last-Translator: Jeremy Stretch, 2023\n"
"Last-Translator: Renato Almeida de Oliveira, 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"
@ -30,7 +30,7 @@ msgstr "Chave"
#: account/tables.py:31 users/forms/filtersets.py:133
msgid "Write Enabled"
msgstr "Gravação ativada"
msgstr "Escrita permitida"
#: account/tables.py:34 core/tables/jobs.py:29 extras/choices.py:135
#: extras/tables/tables.py:469 templates/account/token.html:44
@ -2041,7 +2041,7 @@ msgstr "Grupo (ID)"
#: dcim/filtersets.py:138
msgid "Group (slug)"
msgstr "Grupo (lesma)"
msgstr "Grupo (slug)"
#: dcim/filtersets.py:144 dcim/filtersets.py:149
msgid "AS (ID)"
@ -2055,7 +2055,7 @@ msgstr "Localização (ID)"
#: dcim/filtersets.py:224 dcim/filtersets.py:299 dcim/filtersets.py:397
#: dcim/filtersets.py:1219 extras/filtersets.py:447
msgid "Location (slug)"
msgstr "Localização (lesma)"
msgstr "Localização (slug)"
#: dcim/filtersets.py:313 dcim/filtersets.py:764 dcim/filtersets.py:854
#: dcim/filtersets.py:1619 ipam/filtersets.py:347 ipam/filtersets.py:459
@ -2068,7 +2068,7 @@ msgstr "Função (ID)"
#: ipam/filtersets.py:465 ipam/filtersets.py:946
#: virtualization/filtersets.py:215
msgid "Role (slug)"
msgstr "Papel (lesma)"
msgstr "Papel (slug)"
#: dcim/filtersets.py:347 dcim/filtersets.py:922 dcim/filtersets.py:1224
#: dcim/filtersets.py:1942
@ -2095,7 +2095,7 @@ msgstr "Fabricante (ID)"
#: dcim/filtersets.py:811 dcim/filtersets.py:839 dcim/filtersets.py:1122
#: dcim/filtersets.py:1615
msgid "Manufacturer (slug)"
msgstr "Fabricante (lesma)"
msgstr "Fabricante (slug)"
#: dcim/filtersets.py:445
msgid "Default platform (ID)"
@ -2180,7 +2180,7 @@ msgstr "Modelo de configuração (ID)"
#: dcim/filtersets.py:845
msgid "Device type (slug)"
msgstr "Tipo de dispositivo (lesma)"
msgstr "Tipo de dispositivo (slug)"
#: dcim/filtersets.py:865
msgid "Parent Device (ID)"
@ -2193,7 +2193,7 @@ msgstr "Plataforma (ID)"
#: dcim/filtersets.py:875 extras/filtersets.py:474
#: virtualization/filtersets.py:225
msgid "Platform (slug)"
msgstr "Plataforma (lesma)"
msgstr "Plataforma (slug)"
#: dcim/filtersets.py:911 dcim/filtersets.py:1208 dcim/filtersets.py:1703
#: dcim/filtersets.py:1875 dcim/filtersets.py:1933
@ -3634,7 +3634,7 @@ msgstr "Reserva"
#: dcim/forms/model_forms.py:297 dcim/forms/model_forms.py:380
#: utilities/forms/fields/fields.py:47
msgid "Slug"
msgstr "Lesma"
msgstr "Slug"
#: dcim/forms/model_forms.py:304 templates/dcim/devicetype.html:12
msgid "Chassis"
@ -5198,7 +5198,7 @@ msgstr "Já existe uma região de nível superior com esse nome."
#: dcim/models/sites.py:59
msgid "A top-level region with this slug already exists."
msgstr "Já existe uma região de alto nível com essa lesma."
msgstr "Já existe uma região de alto nível com essa slug."
#: dcim/models/sites.py:62
msgid "region"
@ -6029,7 +6029,7 @@ msgstr "Tipo de cluster"
#: extras/filtersets.py:485 virtualization/filtersets.py:95
#: virtualization/filtersets.py:146
msgid "Cluster type (slug)"
msgstr "Tipo de cluster (lesma)"
msgstr "Tipo de cluster (slug)"
#: extras/filtersets.py:490 ipam/forms/bulk_edit.py:475
#: ipam/forms/model_forms.py:585 virtualization/forms/filtersets.py:108
@ -6038,7 +6038,7 @@ msgstr "Grupo de clusters"
#: extras/filtersets.py:496 virtualization/filtersets.py:135
msgid "Cluster group (slug)"
msgstr "Grupo de clusters (lesma)"
msgstr "Grupo de clusters (slug)"
#: extras/filtersets.py:506 tenancy/forms/forms.py:16
#: tenancy/forms/forms.py:39
@ -6056,7 +6056,7 @@ msgstr "Tag"
#: extras/filtersets.py:534
msgid "Tag (slug)"
msgstr "Tag (lesma)"
msgstr "Tag (slug)"
#: extras/filtersets.py:594 extras/forms/filtersets.py:438
msgid "Has local config context data"
@ -7630,7 +7630,7 @@ msgstr "RIR (ID)"
#: ipam/filtersets.py:142 ipam/filtersets.py:181 ipam/filtersets.py:204
msgid "RIR (slug)"
msgstr "RIR (lesma)"
msgstr "RIR (slug)"
#: ipam/filtersets.py:251
msgid "Within prefix"
@ -12175,7 +12175,7 @@ msgstr "Função de contato (ID)"
#: tenancy/filtersets.py:114
msgid "Contact role (slug)"
msgstr "Função de contato (lesma)"
msgstr "Função de contato (slug)"
#: tenancy/filtersets.py:146
msgid "Contact group"
@ -12191,7 +12191,7 @@ msgstr "Grupo de inquilinos (ID)"
#: tenancy/filtersets.py:216
msgid "Tenant Group (slug)"
msgstr "Grupo de inquilinos (lesma)"
msgstr "Grupo de inquilinos (slug)"
#: tenancy/forms/bulk_edit.py:65
msgid "Desciption"
@ -13147,7 +13147,7 @@ msgstr "Grupo de túneis (ID)"
#: vpn/filtersets.py:47
msgid "Tunnel group (slug)"
msgstr "Grupo de túneis (lesma)"
msgstr "Grupo de túneis (slug)"
#: vpn/filtersets.py:54
msgid "IPSec profile (ID)"

File diff suppressed because it is too large Load Diff

View File

@ -38,11 +38,11 @@ class TunnelEncapsulationChoices(ChoiceSet):
class TunnelTerminationTypeChoices(ChoiceSet):
# For TunnelCreateForm
TYPE_DEVICE = 'dcim.device'
TYPE_VIRUTALMACHINE = 'virtualization.virtualmachine'
TYPE_VIRTUALMACHINE = 'virtualization.virtualmachine'
CHOICES = (
(TYPE_DEVICE, _('Device')),
(TYPE_VIRUTALMACHINE, _('Virtual Machine')),
(TYPE_VIRTUALMACHINE, _('Virtual Machine')),
)
@ -179,6 +179,7 @@ class DHGroupChoices(ChoiceSet):
(GROUP_2, _('Group {n}').format(n=2)),
(GROUP_5, _('Group {n}').format(n=5)),
(GROUP_14, _('Group {n}').format(n=14)),
(GROUP_15, _('Group {n}').format(n=15)),
(GROUP_16, _('Group {n}').format(n=16)),
(GROUP_17, _('Group {n}').format(n=17)),
(GROUP_18, _('Group {n}').format(n=18)),

View File

@ -151,7 +151,8 @@ class IKEProposalImportForm(NetBoxModelImportForm):
)
authentication_algorithm = CSVChoiceField(
label=_('Authentication algorithm'),
choices=AuthenticationAlgorithmChoices
choices=AuthenticationAlgorithmChoices,
required=False
)
group = CSVChoiceField(
label=_('Group'),
@ -191,11 +192,13 @@ class IKEPolicyImportForm(NetBoxModelImportForm):
class IPSecProposalImportForm(NetBoxModelImportForm):
encryption_algorithm = CSVChoiceField(
label=_('Encryption algorithm'),
choices=EncryptionAlgorithmChoices
choices=EncryptionAlgorithmChoices,
required=False
)
authentication_algorithm = CSVChoiceField(
label=_('Authentication algorithm'),
choices=AuthenticationAlgorithmChoices
choices=AuthenticationAlgorithmChoices,
required=False
)
class Meta:
@ -209,7 +212,8 @@ class IPSecProposalImportForm(NetBoxModelImportForm):
class IPSecPolicyImportForm(NetBoxModelImportForm):
pfs_group = CSVChoiceField(
label=_('Diffie-Hellman group for Perfect Forward Secrecy'),
choices=DHGroupChoices
choices=DHGroupChoices,
required=False
)
proposals = CSVModelMultipleChoiceField(
queryset=IPSecProposal.objects.all(),

View File

@ -7,7 +7,7 @@ from ipam.models import IPAddress, RouteTarget, VLAN
from netbox.forms import NetBoxModelForm
from tenancy.forms import TenancyForm
from utilities.forms.fields import CommentField, DynamicModelChoiceField, DynamicModelMultipleChoiceField, SlugField
from utilities.forms.utils import add_blank_choice
from utilities.forms.utils import add_blank_choice, get_field_value
from utilities.forms.widgets import HTMXSelect
from virtualization.models import VirtualMachine, VMInterface
from vpn.choices import *
@ -157,7 +157,7 @@ class TunnelCreateForm(TunnelForm):
def __init__(self, *args, initial=None, **kwargs):
super().__init__(*args, initial=initial, **kwargs)
if initial and initial.get('termination1_type') == TunnelTerminationTypeChoices.TYPE_VIRUTALMACHINE:
if get_field_value(self, 'termination1_type') == TunnelTerminationTypeChoices.TYPE_VIRTUALMACHINE:
self.fields['termination1_parent'].label = _('Virtual Machine')
self.fields['termination1_parent'].queryset = VirtualMachine.objects.all()
self.fields['termination1_termination'].queryset = VMInterface.objects.all()
@ -168,7 +168,7 @@ class TunnelCreateForm(TunnelForm):
'virtual_machine_id': '$termination1_parent',
})
if initial and initial.get('termination2_type') == TunnelTerminationTypeChoices.TYPE_VIRUTALMACHINE:
if get_field_value(self, 'termination2_type') == TunnelTerminationTypeChoices.TYPE_VIRTUALMACHINE:
self.fields['termination2_parent'].label = _('Virtual Machine')
self.fields['termination2_parent'].queryset = VirtualMachine.objects.all()
self.fields['termination2_termination'].queryset = VMInterface.objects.all()
@ -265,7 +265,7 @@ class TunnelTerminationForm(NetBoxModelForm):
def __init__(self, *args, initial=None, **kwargs):
super().__init__(*args, initial=initial, **kwargs)
if initial and initial.get('type') == TunnelTerminationTypeChoices.TYPE_VIRUTALMACHINE:
if initial and initial.get('type') == TunnelTerminationTypeChoices.TYPE_VIRTUALMACHINE:
self.fields['parent'].label = _('Virtual Machine')
self.fields['parent'].queryset = VirtualMachine.objects.all()
self.fields['termination'].queryset = VMInterface.objects.all()

View File

@ -0,0 +1,20 @@
# Generated by Django 4.2.8 on 2024-01-05 19:31
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('ipam', '0069_gfk_indexes'),
('vpn', '0002_move_l2vpn'),
]
operations = [
migrations.AlterField(
model_name='tunneltermination',
name='outside_ip',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='tunnel_terminations', to='ipam.ipaddress'),
),
]

View File

@ -129,10 +129,10 @@ class TunnelTermination(CustomFieldsMixin, CustomLinksMixin, TagsMixin, ChangeLo
ct_field='termination_type',
fk_field='termination_id'
)
outside_ip = models.OneToOneField(
outside_ip = models.ForeignKey(
to='ipam.IPAddress',
on_delete=models.PROTECT,
related_name='tunnel_termination',
related_name='tunnel_terminations',
blank=True,
null=True
)

View File

@ -1,5 +1,5 @@
bleach==6.1.0
Django==4.2.8
Django==4.2.9
django-cors-headers==4.3.1
django-debug-toolbar==4.2.0
django-filter==23.5
@ -15,21 +15,21 @@ django-tables2==2.7.0
django-timezone-field==6.1.0
djangorestframework==3.14.0
drf-spectacular==0.27.0
drf-spectacular-sidecar==2023.12.1
drf-spectacular-sidecar==2024.1.1
feedparser==6.0.11
graphene-django==3.0.0
gunicorn==21.2.0
Jinja2==3.1.2
Markdown==3.5.1
mkdocs-material==9.5.3
Jinja2==3.1.3
Markdown==3.5.2
mkdocs-material==9.5.4
mkdocstrings[python-legacy]==0.24.0
netaddr==0.9.0
Pillow==10.1.0
psycopg[binary,pool]==3.1.16
netaddr==0.10.1
Pillow==10.2.0
psycopg[binary,pool]==3.1.17
PyYAML==6.0.1
requests==2.31.0
social-auth-app-django==5.4.0
social-auth-core[openidconnect]==4.5.1
svgwrite==1.4.3
tablib==3.5.0
tzdata==2023.3
tzdata==2023.4