mirror of
https://github.com/netbox-community/netbox.git
synced 2025-07-18 13:06:30 -06:00
Merge branch 'feature' into 9856-strawberry-2
This commit is contained in:
commit
dbe4097a78
2
.github/workflows/ci.yml
vendored
2
.github/workflows/ci.yml
vendored
@ -9,7 +9,7 @@ jobs:
|
|||||||
NETBOX_CONFIGURATION: netbox.configuration_testing
|
NETBOX_CONFIGURATION: netbox.configuration_testing
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
python-version: ['3.8', '3.9', '3.10', '3.11']
|
python-version: ['3.10', '3.11']
|
||||||
node-version: ['14.x']
|
node-version: ['14.x']
|
||||||
services:
|
services:
|
||||||
redis:
|
redis:
|
||||||
|
@ -7,7 +7,7 @@ Getting started with NetBox development is pretty straightforward, and should fe
|
|||||||
* A Linux system or compatible environment
|
* A Linux system or compatible environment
|
||||||
* A PostgreSQL server, which can be installed locally [per the documentation](../installation/1-postgresql.md)
|
* A PostgreSQL server, which can be installed locally [per the documentation](../installation/1-postgresql.md)
|
||||||
* A Redis server, which can also be [installed locally](../installation/2-redis.md)
|
* A Redis server, which can also be [installed locally](../installation/2-redis.md)
|
||||||
* Python 3.8 or later
|
* Python 3.10 or later
|
||||||
|
|
||||||
### 1. Fork the Repo
|
### 1. Fork the Repo
|
||||||
|
|
||||||
|
@ -6,8 +6,8 @@ This section of the documentation discusses installing and configuring the NetBo
|
|||||||
|
|
||||||
Begin by installing all system packages required by NetBox and its dependencies.
|
Begin by installing all system packages required by NetBox and its dependencies.
|
||||||
|
|
||||||
!!! warning "Python 3.8 or later required"
|
!!! warning "Python 3.10 or later required"
|
||||||
NetBox requires Python 3.8, 3.9, 3.10 or 3.11.
|
NetBox requires Python 3.10 or 3.11.
|
||||||
|
|
||||||
=== "Ubuntu"
|
=== "Ubuntu"
|
||||||
|
|
||||||
@ -21,7 +21,7 @@ Begin by installing all system packages required by NetBox and its dependencies.
|
|||||||
sudo yum install -y gcc libxml2-devel libxslt-devel libffi-devel libpq-devel openssl-devel redhat-rpm-config
|
sudo yum install -y gcc libxml2-devel libxslt-devel libffi-devel libpq-devel openssl-devel redhat-rpm-config
|
||||||
```
|
```
|
||||||
|
|
||||||
Before continuing, check that your installed Python version is at least 3.8:
|
Before continuing, check that your installed Python version is at least 3.10:
|
||||||
|
|
||||||
```no-highlight
|
```no-highlight
|
||||||
python3 -V
|
python3 -V
|
||||||
@ -255,10 +255,10 @@ Once NetBox has been configured, we're ready to proceed with the actual installa
|
|||||||
sudo /opt/netbox/upgrade.sh
|
sudo /opt/netbox/upgrade.sh
|
||||||
```
|
```
|
||||||
|
|
||||||
Note that **Python 3.8 or later is required** for NetBox v3.2 and later releases. If the default Python installation on your server is set to a lesser version, pass the path to the supported installation as an environment variable named `PYTHON`. (Note that the environment variable must be passed _after_ the `sudo` command.)
|
Note that **Python 3.10 or later is required** for NetBox v4.0 and later releases. If the default Python installation on your server is set to a lesser version, pass the path to the supported installation as an environment variable named `PYTHON`. (Note that the environment variable must be passed _after_ the `sudo` command.)
|
||||||
|
|
||||||
```no-highlight
|
```no-highlight
|
||||||
sudo PYTHON=/usr/bin/python3.8 /opt/netbox/upgrade.sh
|
sudo PYTHON=/usr/bin/python3.10 /opt/netbox/upgrade.sh
|
||||||
```
|
```
|
||||||
|
|
||||||
!!! note
|
!!! note
|
||||||
|
@ -20,7 +20,7 @@ The following sections detail how to set up a new instance of NetBox:
|
|||||||
|
|
||||||
| Dependency | Minimum Version |
|
| Dependency | Minimum Version |
|
||||||
|------------|-----------------|
|
|------------|-----------------|
|
||||||
| Python | 3.8 |
|
| Python | 3.10 |
|
||||||
| PostgreSQL | 12 |
|
| PostgreSQL | 12 |
|
||||||
| Redis | 4.0 |
|
| Redis | 4.0 |
|
||||||
|
|
||||||
|
@ -19,7 +19,7 @@ NetBox requires the following dependencies:
|
|||||||
|
|
||||||
| Dependency | Minimum Version |
|
| Dependency | Minimum Version |
|
||||||
|------------|-----------------|
|
|------------|-----------------|
|
||||||
| Python | 3.8 |
|
| Python | 3.10 |
|
||||||
| PostgreSQL | 12 |
|
| PostgreSQL | 12 |
|
||||||
| Redis | 4.0 |
|
| Redis | 4.0 |
|
||||||
|
|
||||||
@ -108,10 +108,10 @@ sudo ./upgrade.sh
|
|||||||
```
|
```
|
||||||
|
|
||||||
!!! warning
|
!!! warning
|
||||||
If the default version of Python is not at least 3.8, you'll need to pass the path to a supported Python version as an environment variable when calling the upgrade script. For example:
|
If the default version of Python is not at least 3.10, you'll need to pass the path to a supported Python version as an environment variable when calling the upgrade script. For example:
|
||||||
|
|
||||||
```no-highlight
|
```no-highlight
|
||||||
sudo PYTHON=/usr/bin/python3.8 ./upgrade.sh
|
sudo PYTHON=/usr/bin/python3.10 ./upgrade.sh
|
||||||
```
|
```
|
||||||
|
|
||||||
This script performs the following actions:
|
This script performs the following actions:
|
||||||
|
@ -135,7 +135,7 @@ Any additional apps must be installed within the same Python environment as NetB
|
|||||||
|
|
||||||
## Create setup.py
|
## Create setup.py
|
||||||
|
|
||||||
`setup.py` is the [setup script](https://docs.python.org/3.8/distutils/setupscript.html) used to package and install our plugin once it's finished. The primary function of this script is to call the setuptools library's `setup()` function to create a Python distribution package. We can pass a number of keyword arguments to control the package creation as well as to provide metadata about the plugin. An example `setup.py` is below:
|
`setup.py` is the [setup script](https://docs.python.org/3.10/distutils/setupscript.html) used to package and install our plugin once it's finished. The primary function of this script is to call the setuptools library's `setup()` function to create a Python distribution package. We can pass a number of keyword arguments to control the package creation as well as to provide metadata about the plugin. An example `setup.py` is below:
|
||||||
|
|
||||||
```python
|
```python
|
||||||
from setuptools import find_packages, setup
|
from setuptools import find_packages, setup
|
||||||
@ -170,7 +170,7 @@ python3 -m venv ~/.virtualenvs/my_plugin
|
|||||||
You can make NetBox available within this environment by creating a path file pointing to its location. This will add NetBox to the Python path upon activation. (Be sure to adjust the command below to specify your actual virtual environment path, Python version, and NetBox installation.)
|
You can make NetBox available within this environment by creating a path file pointing to its location. This will add NetBox to the Python path upon activation. (Be sure to adjust the command below to specify your actual virtual environment path, Python version, and NetBox installation.)
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
echo /opt/netbox/netbox > $VENV/lib/python3.8/site-packages/netbox.pth
|
echo /opt/netbox/netbox > $VENV/lib/python3.10/site-packages/netbox.pth
|
||||||
```
|
```
|
||||||
|
|
||||||
## Development Installation
|
## Development Installation
|
||||||
|
@ -10,6 +10,7 @@
|
|||||||
* The internal ConfigRevision model has moved from `extras` to `core`. Configuration history will be retained throughout the upgrade process.
|
* 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 [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 `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
|
### New Features
|
||||||
|
|
||||||
|
@ -1,9 +1,5 @@
|
|||||||
from decimal import Decimal
|
from decimal import Decimal
|
||||||
try:
|
from zoneinfo import ZoneInfo
|
||||||
from zoneinfo import ZoneInfo
|
|
||||||
except ImportError:
|
|
||||||
# Python 3.8
|
|
||||||
from backports.zoneinfo import ZoneInfo
|
|
||||||
|
|
||||||
import yaml
|
import yaml
|
||||||
from django.contrib.auth import get_user_model
|
from django.contrib.auth import get_user_model
|
||||||
|
@ -1,9 +0,0 @@
|
|||||||
from .navigation import *
|
|
||||||
from .registration import *
|
|
||||||
from .templates import *
|
|
||||||
from .utils import *
|
|
||||||
from netbox.plugins import PluginConfig
|
|
||||||
|
|
||||||
|
|
||||||
# TODO: Remove in v4.0
|
|
||||||
warnings.warn(f"{__name__} is deprecated. Import from netbox.plugins instead.", DeprecationWarning)
|
|
@ -1,7 +0,0 @@
|
|||||||
import warnings
|
|
||||||
|
|
||||||
from netbox.plugins.navigation import *
|
|
||||||
|
|
||||||
|
|
||||||
# TODO: Remove in v4.0
|
|
||||||
warnings.warn(f"{__name__} is deprecated. Import from netbox.plugins instead.", DeprecationWarning)
|
|
@ -1,7 +0,0 @@
|
|||||||
import warnings
|
|
||||||
|
|
||||||
from netbox.plugins.registration import *
|
|
||||||
|
|
||||||
|
|
||||||
# TODO: Remove in v4.0
|
|
||||||
warnings.warn(f"{__name__} is deprecated. Import from netbox.plugins instead.", DeprecationWarning)
|
|
@ -1,7 +0,0 @@
|
|||||||
import warnings
|
|
||||||
|
|
||||||
from netbox.plugins.templates import *
|
|
||||||
|
|
||||||
|
|
||||||
# TODO: Remove in v4.0
|
|
||||||
warnings.warn(f"{__name__} is deprecated. Import from netbox.plugins instead.", DeprecationWarning)
|
|
@ -1,7 +0,0 @@
|
|||||||
import warnings
|
|
||||||
|
|
||||||
from netbox.plugins.urls import *
|
|
||||||
|
|
||||||
|
|
||||||
# TODO: Remove in v4.0
|
|
||||||
warnings.warn(f"{__name__} is deprecated. Import from netbox.plugins instead.", DeprecationWarning)
|
|
@ -1,7 +0,0 @@
|
|||||||
import warnings
|
|
||||||
|
|
||||||
from netbox.plugins.utils import *
|
|
||||||
|
|
||||||
|
|
||||||
# TODO: Remove in v4.0
|
|
||||||
warnings.warn(f"{__name__} is deprecated. Import from netbox.plugins instead.", DeprecationWarning)
|
|
@ -1,7 +0,0 @@
|
|||||||
import warnings
|
|
||||||
|
|
||||||
from netbox.plugins.views import *
|
|
||||||
|
|
||||||
|
|
||||||
# TODO: Remove in v4.0
|
|
||||||
warnings.warn(f"{__name__} is deprecated. Import from netbox.plugins instead.", DeprecationWarning)
|
|
@ -1,10 +0,0 @@
|
|||||||
import warnings
|
|
||||||
|
|
||||||
from .webhooks import send_webhook as process_webhook
|
|
||||||
|
|
||||||
|
|
||||||
# TODO: Remove in v4.0
|
|
||||||
warnings.warn(
|
|
||||||
f"webhooks_worker.process_webhook has been moved to webhooks.send_webhook.",
|
|
||||||
DeprecationWarning
|
|
||||||
)
|
|
@ -30,13 +30,13 @@ __all__ = (
|
|||||||
'CustomFieldsMixin',
|
'CustomFieldsMixin',
|
||||||
'CustomLinksMixin',
|
'CustomLinksMixin',
|
||||||
'CustomValidationMixin',
|
'CustomValidationMixin',
|
||||||
|
'EventRulesMixin',
|
||||||
'ExportTemplatesMixin',
|
'ExportTemplatesMixin',
|
||||||
'ImageAttachmentsMixin',
|
'ImageAttachmentsMixin',
|
||||||
'JobsMixin',
|
'JobsMixin',
|
||||||
'JournalingMixin',
|
'JournalingMixin',
|
||||||
'SyncedDataMixin',
|
'SyncedDataMixin',
|
||||||
'TagsMixin',
|
'TagsMixin',
|
||||||
'EventRulesMixin',
|
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@ -3,17 +3,18 @@ import importlib
|
|||||||
import importlib.util
|
import importlib.util
|
||||||
import os
|
import os
|
||||||
import platform
|
import platform
|
||||||
import requests
|
|
||||||
import sys
|
import sys
|
||||||
import warnings
|
import warnings
|
||||||
from urllib.parse import urlencode, urlsplit
|
from urllib.parse import urlencode, urlsplit
|
||||||
|
|
||||||
import django
|
import django
|
||||||
|
import requests
|
||||||
from django.contrib.messages import constants as messages
|
from django.contrib.messages import constants as messages
|
||||||
from django.core.exceptions import ImproperlyConfigured, ValidationError
|
from django.core.exceptions import ImproperlyConfigured, ValidationError
|
||||||
from django.core.validators import URLValidator
|
from django.core.validators import URLValidator
|
||||||
from django.utils.encoding import force_str
|
from django.utils.encoding import force_str
|
||||||
from django.utils.translation import gettext_lazy as _
|
from django.utils.translation import gettext_lazy as _
|
||||||
|
|
||||||
try:
|
try:
|
||||||
import sentry_sdk
|
import sentry_sdk
|
||||||
except ModuleNotFoundError:
|
except ModuleNotFoundError:
|
||||||
@ -37,9 +38,9 @@ HOSTNAME = platform.node()
|
|||||||
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
||||||
|
|
||||||
# Validate Python version
|
# Validate Python version
|
||||||
if sys.version_info < (3, 8):
|
if sys.version_info < (3, 10):
|
||||||
raise RuntimeError(
|
raise RuntimeError(
|
||||||
f"NetBox requires Python 3.8 or later. (Currently installed: Python {platform.python_version()})"
|
f"NetBox requires Python 3.10 or later. (Currently installed: Python {platform.python_version()})"
|
||||||
)
|
)
|
||||||
|
|
||||||
#
|
#
|
||||||
|
@ -1,5 +1,3 @@
|
|||||||
import warnings
|
|
||||||
|
|
||||||
from netbox.constants import DEFAULT_ACTION_PERMISSIONS
|
from netbox.constants import DEFAULT_ACTION_PERMISSIONS
|
||||||
from utilities.permissions import get_permission_for_model
|
from utilities.permissions import get_permission_for_model
|
||||||
|
|
||||||
@ -26,38 +24,11 @@ class ActionsMixin:
|
|||||||
"""
|
"""
|
||||||
model = model or self.queryset.model
|
model = model or self.queryset.model
|
||||||
|
|
||||||
# TODO: Remove backward compatibility in Netbox v4.0
|
|
||||||
# Determine how permissions are being mapped to actions for the view
|
|
||||||
if hasattr(self, 'action_perms'):
|
|
||||||
# Backward compatibility for <3.7
|
|
||||||
permissions_map = self.action_perms
|
|
||||||
warnings.warn(
|
|
||||||
"Setting action_perms on views is deprecated and will be removed in NetBox v4.0. Use actions instead.",
|
|
||||||
DeprecationWarning
|
|
||||||
)
|
|
||||||
elif type(self.actions) is dict:
|
|
||||||
# New actions format (3.7+)
|
|
||||||
permissions_map = self.actions
|
|
||||||
else:
|
|
||||||
# actions is still defined as a list or tuple (<3.7) but no custom mapping is defined; use the old
|
|
||||||
# default mapping
|
|
||||||
permissions_map = {
|
|
||||||
'add': {'add'},
|
|
||||||
'import': {'add'},
|
|
||||||
'bulk_edit': {'change'},
|
|
||||||
'bulk_delete': {'delete'},
|
|
||||||
}
|
|
||||||
warnings.warn(
|
|
||||||
"View actions should be defined as a dictionary mapping. Support for the legacy list format will be "
|
|
||||||
"removed in NetBox v4.0.",
|
|
||||||
DeprecationWarning
|
|
||||||
)
|
|
||||||
|
|
||||||
# Resolve required permissions for each action
|
# Resolve required permissions for each action
|
||||||
permitted_actions = []
|
permitted_actions = []
|
||||||
for action in self.actions:
|
for action in self.actions:
|
||||||
required_permissions = [
|
required_permissions = [
|
||||||
get_permission_for_model(model, name) for name in permissions_map.get(action, set())
|
get_permission_for_model(model, name) for name in self.actions.get(action, set())
|
||||||
]
|
]
|
||||||
if not required_permissions or user.has_perms(required_permissions):
|
if not required_permissions or user.has_perms(required_permissions):
|
||||||
permitted_actions.append(action)
|
permitted_actions.append(action)
|
||||||
|
Loading…
Reference in New Issue
Block a user