Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 5 additions & 8 deletions .github/workflows/lint.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,13 +15,10 @@ jobs:
- name: Checkout code
uses: actions/checkout@0c366fd6a839edf440554fa01a7085ccba70ac98

- name: Check conformance to Black standards
uses: psf/black@e015af4a681dd2ac847188b13a81dc4a573d4dcb
- name: Check conformance to Ruff formatting standards
uses: astral-sh/ruff-action@8c228c72ff504d587be6b6cfbcf074768fdd6883
with:
options: "--check"
src: "netbox_dhcp"
options: "format --check --diff"

- name: Check conformance to Ruff standards
uses: astral-sh/ruff-action@6576144cee480b9d2fc567667a9868f2c3725d1b
with:
version: "latest"
- name: Run the ruff code checker
uses: astral-sh/ruff-action@8c228c72ff504d587be6b6cfbcf074768fdd6883
21 changes: 7 additions & 14 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,7 @@ Include the following information in your post:
* All new functionality must be accompanied by relevant tests where possible.
* All code submissions should meet the following criteria, which are automatically checked by the GitHub CI workflow:
* Python syntax is valid.
* `black` code formatting is enforced.
* ruff code checking is enforced.
* `ruff` code formatting and checking is enforced
* `/opt/netbox/venv/bin/manage.py test netbox_dhcp` must run successfully.
* Include a reference to the fixed bug or feature request in the description of the pull request, e.g. `fixes #23`. See the [GitHub documentation](https://docs.github.com/en/get-started/writing-on-github/working-with-advanced-formatting/using-keywords-in-issues-and-pull-requests) for details.
* If the main branch has moved on while you were working on a pull request, please __do not merge but rebase__ your branch. Merging normally isn't usually necessary, and it creates merge commits that unnecessarily clutter the project's history.
Expand Down Expand Up @@ -59,16 +58,10 @@ $ git remote add upstream https://github.com/sys4/netbox-plugin-dhcp.git
$ source /opt/netbox/venv/bin/activate
```

* Install the `black` code formatter:
* Install the `ruff` code formatting and checking utility:

```bash
$ /opt/netbox/venv/bin/python3 -m pip install black
```

* Install the `ruff` linter:

```bash
$ /opt/netbox/venv/bin/python3 -m pip install ruff
$ pip3 install ruff
```

* Install `netbox-plugin-dhcp`. In a development environment it makes most sense to use an editable installation, which can be achieved by the following commands (assuming you checked out the NetBox DHCP repository to `/install-path/netbox-plugin-dhcp`):
Expand Down Expand Up @@ -96,17 +89,17 @@ After these steps are completed successfully, you're all set up.

## Code formatting and linting

To achieve a consistent coding style, all code for the NetBox DHCP plugin is formatted using the [`black` formatter](https://black.readthedocs.io/en/stable/index.html) and checked for inconsistencies such as unused imports and variables using the [`ruff` linter](https://docs.astral.sh/ruff/linter/).
To achieve a consistent coding style and catch common errors such as unused imports and variables, all code for the NetBox DNS plugin is formatted and checked for inconsistencies such as unused imports and variables using the [`ruff`](https://docs.astral.sh/ruff/) utility.

```
$ /opt/netbox/venv/bin/black netbox_dhcp
$ /opt/netbox/venv/bin/ruff check netbox_dhcp
$ /opt/netbox/venv/bin/ruff check
$ /opt/netbox/venv/bin/ruff format
```

## Running the Tests

Go to the NetBox directory and run:

```bash
$ /opt/netbox/netbox/manage.py test netbox_dhcp.tests
$ /opt/netbox/netbox/manage.py test netbox_dhcp
```
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ This works in much the same way in which NetBox provides configuration data for
<a href="https://github.com/sys4/netbox-plugin-dhcp/pulls"><img src="https://img.shields.io/github/issues-pr/sys4/netbox-plugin-dhcp" alt="Pull Requests Badge"/></a>
<a href="https://github.com/sys4/netbox-plugin-dhcp/graphs/contributors"><img alt="GitHub contributors" src="https://img.shields.io/github/contributors/sys4/netbox-plugin-dhcp?color=2b9348"></a>
<a href="https://github.com/sys4/netbox-plugin-dhcp/blob/master/LICENSE"><img src="https://img.shields.io/github/license/sys4/netbox-plugin-dhcp?color=2b9348" alt="License Badge"/></a>
<a href="https://github.com/psf/black"><img src="https://img.shields.io/badge/code%20style-black-000000.svg" alt="Code Style Black"/></a>
<a href="https://github.com/astral-sh/ruff"><img src="https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json" alt="Code Style Ruff"/></a>
<a href="https://pepy.tech/project/netbox-plugin-dhcp"><img alt="Downloads" src="https://static.pepy.tech/badge/netbox-plugin-dhcp"></a>
<a href="https://pepy.tech/project/netbox-plugin-dhcp"><img alt="Downloads/Week" src="https://static.pepy.tech/badge/netbox-plugin-dhcp/month"></a>
<a href="https://pepy.tech/project/netbox-plugin-dhcp"><img alt="Downloads/Month" src="https://static.pepy.tech/badge/netbox-plugin-dhcp/week"></a>
Expand Down
2 changes: 1 addition & 1 deletion netbox_dhcp/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,8 @@ class DHCPConfig(PluginConfig):
def ready(self):
super().ready()

from netbox_dhcp.signals import dhcp_server # noqa: F401
from netbox_dhcp.fields import ip_address # noqa: F401
from netbox_dhcp.signals import dhcp_server # noqa: F401


#
Expand Down
11 changes: 5 additions & 6 deletions netbox_dhcp/api/nested_serializers.py
Original file line number Diff line number Diff line change
@@ -1,15 +1,14 @@
from rest_framework import serializers

from netbox.api.serializers import WritableNestedSerializer

from netbox_dhcp.models import (
DHCPServer,
ClientClass,
Subnet,
SharedNetwork,
Pool,
PDPool,
DHCPServer,
HostReservation,
PDPool,
Pool,
SharedNetwork,
Subnet,
)

__all__ = (
Expand Down
3 changes: 1 addition & 2 deletions netbox_dhcp/api/serializers.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
from .nested_serializers import *
from .serializers_.client_class import *
from .serializers_.dhcp_cluster import *
from .serializers_.dhcp_server import *
Expand All @@ -8,5 +9,3 @@
from .serializers_.pool import *
from .serializers_.shared_network import *
from .serializers_.subnet import *

from .nested_serializers import *
3 changes: 1 addition & 2 deletions netbox_dhcp/api/serializers_/client_class.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,10 @@
from rest_framework import serializers

from netbox.api.serializers import PrimaryModelSerializer

from netbox_dhcp.models import ClientClass

from .option import OptionSerializer
from .dhcp_server import DHCPServerSerializer
from .option import OptionSerializer

__all__ = ("ClientClassSerializer",)

Expand Down
1 change: 0 additions & 1 deletion netbox_dhcp/api/serializers_/dhcp_cluster.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@
from rest_framework import serializers

from netbox.api.serializers import PrimaryModelSerializer

from netbox_dhcp.models import DHCPCluster

from ..nested_serializers import NestedDHCPServerSerializer
Expand Down
12 changes: 5 additions & 7 deletions netbox_dhcp/api/serializers_/dhcp_server.py
Original file line number Diff line number Diff line change
@@ -1,24 +1,22 @@
from django.utils.translation import gettext_lazy as _
from rest_framework import serializers

from netbox.api.serializers import NetBoxModelSerializer, PrimaryModelSerializer

from dcim.api.serializers import DeviceSerializer, InterfaceSerializer
from netbox.api.serializers import NetBoxModelSerializer, PrimaryModelSerializer
from netbox_dhcp.models import DHCPServer, DHCPServerInterface
from virtualization.api.serializers import (
VirtualMachineSerializer,
VMInterfaceSerializer,
)

from .dhcp_cluster import DHCPClusterSerializer
from .mixins import ClientClassSerializerMixin
from ..nested_serializers import (
NestedDHCPServerSerializer,
NestedHostReservationSerializer,
NestedSharedNetworkSerializer,
NestedSubnetSerializer,
NestedHostReservationSerializer,
)

from netbox_dhcp.models import DHCPServer, DHCPServerInterface
from .dhcp_cluster import DHCPClusterSerializer
from .mixins import ClientClassSerializerMixin

__all__ = (
"DHCPServerSerializer",
Expand Down
7 changes: 3 additions & 4 deletions netbox_dhcp/api/serializers_/host_reservation.py
Original file line number Diff line number Diff line change
@@ -1,13 +1,12 @@
from rest_framework import serializers
from django.utils.translation import gettext as _
from rest_framework import serializers

from netbox.api.serializers import PrimaryModelSerializer
from ipam.api.serializers import IPAddressSerializer, PrefixSerializer

from netbox.api.serializers import PrimaryModelSerializer
from netbox_dhcp.models import HostReservation

from .option import OptionSerializer
from .mixins import ClientClassSerializerMixin
from .option import OptionSerializer

__all__ = ("HostReservationSerializer",)

Expand Down
13 changes: 8 additions & 5 deletions netbox_dhcp/api/serializers_/option.py
Original file line number Diff line number Diff line change
@@ -1,14 +1,13 @@
from django.contrib.contenttypes.models import ContentType
from django.db.models import Q
from rest_framework import serializers
from drf_spectacular.utils import extend_schema_field
from rest_framework import serializers

from netbox.api.serializers import PrimaryModelSerializer
from netbox.api.fields import ContentTypeField
from utilities.api import get_serializer_for_model

from netbox_dhcp.models import Option
from netbox.api.serializers import PrimaryModelSerializer
from netbox_dhcp.choices import OptionSendChoices
from netbox_dhcp.models import Option
from utilities.api import get_serializer_for_model

from .mixins import ClientClassSerializerMixin

Expand Down Expand Up @@ -120,10 +119,14 @@ def get_always_send(self, instance):
if instance.send_option is not None:
return instance.send_option == OptionSendChoices.ALWAYS_SEND

return None

def get_never_send(self, instance):
if instance.send_option is not None:
return instance.send_option == OptionSendChoices.NEVER_SEND

return None

def create(self, validated_data):
client_classes = validated_data.pop("client_classes", None)

Expand Down
1 change: 0 additions & 1 deletion netbox_dhcp/api/serializers_/option_definition.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
from rest_framework import serializers

from netbox.api.serializers import PrimaryModelSerializer

from netbox_dhcp.models import OptionDefinition

__all__ = ("OptionDefinitionSerializer",)
Expand Down
6 changes: 2 additions & 4 deletions netbox_dhcp/api/serializers_/pd_pool.py
Original file line number Diff line number Diff line change
@@ -1,17 +1,15 @@
from rest_framework import serializers

from netbox.api.serializers import PrimaryModelSerializer
from ipam.api.serializers import PrefixSerializer

from netbox.api.serializers import PrimaryModelSerializer
from netbox_dhcp.models import PDPool

from .mixins import (
ClientClassSerializerMixin,
EvaluateClientClassSerializerMixin,
)

from .subnet import SubnetSerializer
from .option import OptionSerializer
from .subnet import SubnetSerializer

__all__ = ("PDPoolSerializer",)

Expand Down
6 changes: 2 additions & 4 deletions netbox_dhcp/api/serializers_/pool.py
Original file line number Diff line number Diff line change
@@ -1,17 +1,15 @@
from rest_framework import serializers

from netbox.api.serializers import PrimaryModelSerializer
from ipam.api.serializers import IPRangeSerializer

from netbox.api.serializers import PrimaryModelSerializer
from netbox_dhcp.models import Pool

from .mixins import (
ClientClassSerializerMixin,
EvaluateClientClassSerializerMixin,
)

from .subnet import SubnetSerializer
from .option import OptionSerializer
from .subnet import SubnetSerializer

__all__ = ("PoolSerializer",)

Expand Down
8 changes: 3 additions & 5 deletions netbox_dhcp/api/serializers_/shared_network.py
Original file line number Diff line number Diff line change
@@ -1,18 +1,16 @@
from rest_framework import serializers

from netbox.api.serializers import PrimaryModelSerializer
from ipam.api.serializers import PrefixSerializer

from netbox.api.serializers import PrimaryModelSerializer
from netbox_dhcp.models import SharedNetwork

from ..nested_serializers import NestedSubnetSerializer
from .dhcp_server import DHCPServerSerializer
from .mixins import (
ClientClassSerializerMixin,
EvaluateClientClassSerializerMixin,
)

from .dhcp_server import DHCPServerSerializer
from .option import OptionSerializer
from ..nested_serializers import NestedSubnetSerializer

__all__ = ("SharedNetworkSerializer",)

Expand Down
12 changes: 5 additions & 7 deletions netbox_dhcp/api/serializers_/subnet.py
Original file line number Diff line number Diff line change
@@ -1,23 +1,21 @@
from rest_framework import serializers

from netbox.api.serializers import PrimaryModelSerializer
from ipam.api.serializers import PrefixSerializer

from netbox.api.serializers import PrimaryModelSerializer
from netbox_dhcp.models import Subnet
from .dhcp_server import DHCPServerSerializer
from .shared_network import SharedNetworkSerializer
from .option import OptionSerializer

from ..nested_serializers import (
NestedHostReservationSerializer,
NestedPDPoolSerializer,
NestedPoolSerializer,
NestedHostReservationSerializer,
)

from .dhcp_server import DHCPServerSerializer
from .mixins import (
ClientClassSerializerMixin,
EvaluateClientClassSerializerMixin,
)
from .option import OptionSerializer
from .shared_network import SharedNetworkSerializer

__all__ = ("SubnetSerializer",)

Expand Down
7 changes: 3 additions & 4 deletions netbox_dhcp/api/urls.py
Original file line number Diff line number Diff line change
@@ -1,14 +1,13 @@
from netbox.api.routers import NetBoxRouter

from netbox_dhcp.api.views import (
NetBoxDHCPRootView,
ClientClassViewSet,
DHCPClusterViewSet,
DHCPServerViewSet,
DHCPServerInterfaceViewSet,
DHCPServerViewSet,
HostReservationViewSet,
OptionViewSet,
NetBoxDHCPRootView,
OptionDefinitionViewSet,
OptionViewSet,
PDPoolViewSet,
PoolViewSet,
SharedNetworkViewSet,
Expand Down
7 changes: 3 additions & 4 deletions netbox_dhcp/api/views.py
Original file line number Diff line number Diff line change
@@ -1,15 +1,14 @@
from rest_framework.routers import APIRootView

from netbox.api.viewsets import NetBoxModelViewSet

from netbox_dhcp.api.serializers import (
ClientClassSerializer,
DHCPClusterSerializer,
DHCPServerSerializer,
DHCPServerInterfaceSerializer,
DHCPServerSerializer,
HostReservationSerializer,
OptionSerializer,
OptionDefinitionSerializer,
OptionSerializer,
PDPoolSerializer,
PoolSerializer,
SharedNetworkSerializer,
Expand All @@ -21,8 +20,8 @@
DHCPServerFilterSet,
DHCPServerInterfaceFilterSet,
HostReservationFilterSet,
OptionFilterSet,
OptionDefinitionFilterSet,
OptionFilterSet,
PDPoolFilterSet,
PoolFilterSet,
SharedNetworkFilterSet,
Expand Down
2 changes: 1 addition & 1 deletion netbox_dhcp/choices/__init__.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
from .ddns import *
from .dhcp_server import *
from .dhcp_cluster import *
from .dhcp_server import *
from .host_reservation import *
from .netbox_dhcp import *
from .option import *
2 changes: 1 addition & 1 deletion netbox_dhcp/fields/choice_array.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
from django import forms
from django.contrib.postgres.fields import ArrayField
from django.db.models import Transform, IntegerField
from django.db.models import IntegerField, Transform


class ArrayLength(Transform):
Expand Down
2 changes: 1 addition & 1 deletion netbox_dhcp/filtersets/client_class.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@

from ..models import ClientClass
from .mixins import (
DHCPServerFilterMixin,
BOOTPFilterMixin,
DHCPServerFilterMixin,
LifetimeFilterMixin,
OptionFilterMixin,
)
Expand Down
Loading
Loading