Skip to content

Commit de5e8c0

Browse files
authored
Merge pull request #6 from netboxlabs/code-cleanup
Code cleanup
2 parents cb2c699 + 4a857e6 commit de5e8c0

28 files changed

+1389
-1128
lines changed

netbox_custom_objects/__init__.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
from django.conf import settings
2-
31
from netbox.plugins import PluginConfig
42

53

netbox_custom_objects/api/serializers.py

Lines changed: 84 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -1,56 +1,79 @@
11
from django.contrib.contenttypes.models import ContentType
2-
from django.db.models import Model, QuerySet
2+
from extras.choices import CustomFieldTypeChoices
3+
from netbox.api.serializers import NetBoxModelSerializer
34
from rest_framework import serializers
45
from rest_framework.exceptions import ValidationError
56
from rest_framework.reverse import reverse
67

7-
from extras.choices import CustomFieldTypeChoices
8-
from extras.graphql.types import CustomFieldType
9-
from netbox.api.serializers import NetBoxModelSerializer
10-
# from netbox_service_mappings.choices import MappingFieldTypeChoices
11-
from netbox_custom_objects.models import CustomObject, CustomObjectType, CustomObjectTypeField
12-
from utilities.api import get_serializer_for_model
8+
from netbox_custom_objects.models import (CustomObject, CustomObjectType,
9+
CustomObjectTypeField)
1310

1411
__all__ = (
15-
'CustomObjectTypeSerializer',
16-
'CustomObjectSerializer',
12+
"CustomObjectTypeSerializer",
13+
"CustomObjectSerializer",
1714
)
1815

1916

2017
class ContentTypeSerializer(NetBoxModelSerializer):
2118
class Meta:
2219
model = ContentType
23-
fields = ('id', 'app_label', 'model',)
20+
fields = (
21+
"id",
22+
"app_label",
23+
"model",
24+
)
2425

2526

2627
class CustomObjectTypeFieldSerializer(NetBoxModelSerializer):
2728
url = serializers.HyperlinkedIdentityField(
28-
view_name='plugins-api:netbox_custom_objects-api:customobjecttypefield-detail'
29+
view_name="plugins-api:netbox_custom_objects-api:customobjecttypefield-detail"
2930
)
30-
# content_type = serializers.SerializerMethodField()
3131
app_label = serializers.CharField(required=False)
3232
model = serializers.CharField(required=False)
3333

3434
class Meta:
3535
model = CustomObjectTypeField
3636
fields = (
3737
# 'id', 'url', 'name', 'label', 'custom_object_type', 'field_type', 'content_type', 'many', 'options',
38-
'id', 'name', 'label', 'custom_object_type', 'type', 'primary', 'default', 'choice_set',
39-
'validation_regex', 'validation_minimum', 'validation_maximum',
40-
'related_object_type', 'app_label', 'model',
38+
"id",
39+
"name",
40+
"label",
41+
"custom_object_type",
42+
"type",
43+
"primary",
44+
"default",
45+
"choice_set",
46+
"validation_regex",
47+
"validation_minimum",
48+
"validation_maximum",
49+
"related_object_type",
50+
"app_label",
51+
"model",
4152
)
4253

4354
def validate(self, attrs):
44-
app_label = attrs.pop('app_label', None)
45-
model = attrs.pop('model', None)
46-
if attrs['type'] in [CustomFieldTypeChoices.TYPE_OBJECT, CustomFieldTypeChoices.TYPE_MULTIOBJECT]:
55+
app_label = attrs.pop("app_label", None)
56+
model = attrs.pop("model", None)
57+
if attrs["type"] in [
58+
CustomFieldTypeChoices.TYPE_OBJECT,
59+
CustomFieldTypeChoices.TYPE_MULTIOBJECT,
60+
]:
4761
try:
48-
attrs['related_object_type'] = ContentType.objects.get(app_label=app_label, model=model)
62+
attrs["related_object_type"] = ContentType.objects.get(
63+
app_label=app_label, model=model
64+
)
4965
except ContentType.DoesNotExist:
50-
raise ValidationError('Must provide valid app_label and model for object field type.')
51-
if attrs['type'] in [CustomFieldTypeChoices.TYPE_SELECT, CustomFieldTypeChoices.TYPE_MULTISELECT]:
52-
if not attrs.get('choice_set', None):
53-
raise ValidationError('Must provide choice_set with valid PK for select field type.')
66+
raise ValidationError(
67+
"Must provide valid app_label and model for object field type."
68+
)
69+
if attrs["type"] in [
70+
CustomFieldTypeChoices.TYPE_SELECT,
71+
CustomFieldTypeChoices.TYPE_MULTISELECT,
72+
]:
73+
if not attrs.get("choice_set", None):
74+
raise ValidationError(
75+
"Must provide choice_set with valid PK for select field type."
76+
)
5477
return super().validate(attrs)
5578

5679
def create(self, validated_data):
@@ -70,7 +93,7 @@ def get_related_object_type(self, obj):
7093

7194
class CustomObjectTypeSerializer(NetBoxModelSerializer):
7295
url = serializers.HyperlinkedIdentityField(
73-
view_name='plugins-api:netbox_custom_objects-api:customobjecttype-detail'
96+
view_name="plugins-api:netbox_custom_objects-api:customobjecttype-detail"
7497
)
7598
fields = CustomObjectTypeFieldSerializer(
7699
nested=True,
@@ -81,9 +104,16 @@ class CustomObjectTypeSerializer(NetBoxModelSerializer):
81104
class Meta:
82105
model = CustomObjectType
83106
fields = [
84-
'id', 'url', 'name', 'description', 'tags', 'created', 'last_updated', 'fields',
107+
"id",
108+
"url",
109+
"name",
110+
"description",
111+
"tags",
112+
"created",
113+
"last_updated",
114+
"fields",
85115
]
86-
brief_fields = ('id', 'url', 'name', 'description')
116+
brief_fields = ("id", "url", "name", "description")
87117

88118
def create(self, validated_data):
89119
return super().create(validated_data)
@@ -92,39 +122,43 @@ def create(self, validated_data):
92122
class CustomObjectSerializer(NetBoxModelSerializer):
93123
relation_fields = None
94124

95-
# url = serializers.HyperlinkedIdentityField(
96-
# view_name='plugins-api:netbox_custom_objects-api:custom-object-detail', kwargs={'custom_object_type': 1}
97-
# )
98125
url = serializers.SerializerMethodField()
99126
field_data = serializers.SerializerMethodField()
100127
custom_object_type = CustomObjectTypeSerializer(nested=True)
101128

102129
class Meta:
103130
model = CustomObject
104131
fields = [
105-
'id', 'url', 'name', 'display', 'custom_object_type', 'tags', 'created', 'last_updated', 'data', 'field_data',
132+
"id",
133+
"url",
134+
"name",
135+
"display",
136+
"custom_object_type",
137+
"tags",
138+
"created",
139+
"last_updated",
140+
"data",
141+
"field_data",
106142
]
107-
brief_fields = ('id', 'url', 'name', 'custom_object_type',)
143+
brief_fields = (
144+
"id",
145+
"url",
146+
"name",
147+
"custom_object_type",
148+
)
108149

109150
def get_display(self, obj):
110-
return f'{obj.custom_object_type}: {obj.name}'
151+
return f"{obj.custom_object_type}: {obj.name}"
111152

112153
def validate(self, attrs):
113-
# self.relation_fields = {}
114-
# object_field_types = [CustomFieldTypeChoices.TYPE_OBJECT, CustomFieldTypeChoices.TYPE_MULTIOBJECT]
115-
# for field in attrs['custom_object_type'].fields.filter(type__in=object_field_types):
116-
# self.relation_fields[field.name] = attrs['data'].pop(field.name, None)
117154
return super().validate(attrs)
118155

119156
def update_relation_fields(self, instance):
120157
# TODO: Implement this
121158
pass
122159

123160
def create(self, validated_data):
124-
# instance = super().create(validated_data)
125-
# self.update_relation_fields(instance)
126-
127-
model = validated_data['custom_object_type'].get_model()
161+
model = validated_data["custom_object_type"].get_model()
128162
instance = model.objects.create(**validated_data)
129163

130164
return instance
@@ -142,31 +176,21 @@ def get_url(self, obj):
142176
attributes are not configured to correctly match the URL conf.
143177
"""
144178
# Unsaved objects will not yet have a valid URL.
145-
if hasattr(obj, 'pk') and obj.pk in (None, ''):
179+
if hasattr(obj, "pk") and obj.pk in (None, ""):
146180
return None
147181

148-
view_name = 'plugins-api:netbox_custom_objects-api:custom-object-detail'
149-
lookup_value = getattr(obj, 'pk')
150-
kwargs = {'pk': lookup_value, 'custom_object_type': obj.custom_object_type.name.lower()}
151-
request = self.context['request']
152-
format = self.context.get('format')
182+
view_name = "plugins-api:netbox_custom_objects-api:custom-object-detail"
183+
lookup_value = getattr(obj, "pk")
184+
kwargs = {
185+
"pk": lookup_value,
186+
"custom_object_type": obj.custom_object_type.name.lower(),
187+
}
188+
request = self.context["request"]
189+
format = self.context.get("format")
153190
return reverse(view_name, kwargs=kwargs, request=request, format=format)
154191

155192
def get_field_data(self, obj):
156193
result = {}
157-
# for field_name, value in obj.fields.items():
158-
# if isinstance(value, Model) or isinstance(value, QuerySet):
159-
# # serializer = get_serializer_for_model(field.model_class)
160-
# if isinstance(value, QuerySet):
161-
# serializer = get_serializer_for_model(value.model)
162-
# many = True
163-
# else:
164-
# serializer = get_serializer_for_model(value._meta.model)
165-
# many = False
166-
# context = {'request': self.context['request']}
167-
# result[field_name] = serializer(value, nested=True, context=context, many=many).data
168-
# continue
169-
# result[field_name] = obj.data.get(field_name)
170194
return result
171195

172196

@@ -187,9 +211,7 @@ def get_serializer_class(model):
187211

188212
serializer = type(
189213
f"{model._meta.object_name}Serializer",
190-
(
191-
serializers.ModelSerializer,
192-
),
214+
(serializers.ModelSerializer,),
193215
attrs,
194216
)
195217

netbox_custom_objects/api/urls.py

Lines changed: 17 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,26 @@
1-
from rest_framework.urlpatterns import format_suffix_patterns
2-
from django.urls import path, include
3-
1+
from django.urls import include, path
42
from netbox.api.routers import NetBoxRouter
5-
from . import views
63

4+
from . import views
75

8-
custom_object_list = views.CustomObjectViewSet.as_view({
9-
'get': 'list',
10-
'post': 'create'
11-
})
12-
custom_object_detail = views.CustomObjectViewSet.as_view({
13-
'get': 'retrieve',
14-
'put': 'update',
15-
'patch': 'partial_update',
16-
'delete': 'destroy'
17-
})
6+
custom_object_list = views.CustomObjectViewSet.as_view(
7+
{"get": "list", "post": "create"}
8+
)
9+
custom_object_detail = views.CustomObjectViewSet.as_view(
10+
{"get": "retrieve", "put": "update", "patch": "partial_update", "delete": "destroy"}
11+
)
1812

1913
router = NetBoxRouter()
2014
router.APIRootView = views.RootView
21-
router.register('custom-object-types', views.CustomObjectTypeViewSet)
22-
# router.register('custom-objects', views.CustomObjectViewSet)
23-
router.register('custom-object-type-fields', views.CustomObjectTypeFieldViewSet)
24-
# router.register('mapping-relations', views.MappingRelationViewSet)
25-
26-
# urlpatterns = router.urls
15+
router.register("custom-object-types", views.CustomObjectTypeViewSet)
16+
router.register("custom-object-type-fields", views.CustomObjectTypeFieldViewSet)
2717

2818
urlpatterns = [
29-
path('', include(router.urls)),
30-
path('<str:custom_object_type>/', custom_object_list, name='customobject-list'),
31-
path('<str:custom_object_type>/<int:pk>/', custom_object_detail, name='customobject-detail'),
19+
path("", include(router.urls)),
20+
path("<str:custom_object_type>/", custom_object_list, name="customobject-list"),
21+
path(
22+
"<str:custom_object_type>/<int:pk>/",
23+
custom_object_detail,
24+
name="customobject-detail",
25+
),
3226
]
33-
# urlpatterns = format_suffix_patterns(urlpatterns, allowed=['json', 'html'])

netbox_custom_objects/api/views.py

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,39 +2,35 @@
22
from rest_framework.routers import APIRootView
33
from rest_framework.viewsets import ModelViewSet
44

5-
from netbox_custom_objects import filtersets
6-
from netbox_custom_objects.models import CustomObject, CustomObjectType, CustomObjectTypeField
5+
from netbox_custom_objects.models import (CustomObject, CustomObjectType,
6+
CustomObjectTypeField)
7+
78
from . import serializers
8-
from ..views import CustomObjectTypeView
99

1010

1111
class RootView(APIRootView):
1212
def get_view_name(self):
13-
return 'CustomObjects'
13+
return "CustomObjects"
1414

1515

1616
class CustomObjectTypeViewSet(ModelViewSet):
1717
queryset = CustomObjectType.objects.all()
1818
serializer_class = serializers.CustomObjectTypeSerializer
19-
# filterset_class = filtersets.BranchFilterSet
2019

2120

2221
class CustomObjectViewSet(ModelViewSet):
2322
queryset = CustomObject.objects.all()
2423
serializer_class = serializers.CustomObjectSerializer
25-
# filterset_class = filtersets.CustomObjectFilterSet
2624
model = None
2725

28-
# def get_view_name(self):
29-
# custom_object_type = CustomObjectType.objects.get(name__iexact=self.kwargs['custom_object_type'])
30-
# return custom_object_type.name
31-
3226
def get_serializer_class(self):
3327
return serializers.get_serializer_class(self.model)
3428

3529
def get_queryset(self):
3630
try:
37-
custom_object_type = CustomObjectType.objects.get(name__iexact=self.kwargs['custom_object_type'])
31+
custom_object_type = CustomObjectType.objects.get(
32+
name__iexact=self.kwargs["custom_object_type"]
33+
)
3834
except CustomObjectType.DoesNotExist:
3935
raise Http404
4036
self.model = custom_object_type.get_model()

netbox_custom_objects/choices.py

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,20 @@
11
from django.utils.translation import gettext_lazy as _
2-
32
from utilities.choices import ChoiceSet
43

54

65
class MappingFieldTypeChoices(ChoiceSet):
7-
CHAR = 'char'
8-
INTEGER = 'integer'
9-
BOOLEAN = 'boolean'
10-
DATE = 'date'
11-
DATETIME = 'datetime'
12-
OBJECT = 'object'
6+
CHAR = "char"
7+
INTEGER = "integer"
8+
BOOLEAN = "boolean"
9+
DATE = "date"
10+
DATETIME = "datetime"
11+
OBJECT = "object"
1312

1413
CHOICES = (
15-
(CHAR, _('String'), 'cyan'),
16-
(INTEGER, _('Integer'), 'orange'),
17-
(BOOLEAN, _('Boolean'), 'green'),
18-
(DATE, _('Date'), 'red'),
19-
(DATETIME, _('DateTime'), 'blue'),
20-
(OBJECT, _('Object'), 'orange'),
14+
(CHAR, _("String"), "cyan"),
15+
(INTEGER, _("Integer"), "orange"),
16+
(BOOLEAN, _("Boolean"), "green"),
17+
(DATE, _("Date"), "red"),
18+
(DATETIME, _("DateTime"), "blue"),
19+
(OBJECT, _("Object"), "orange"),
2120
)

netbox_custom_objects/constants.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
# Models which do not support change logging, but whose database tables
22
# must be replicated for each branch to ensure proper functionality
33
INCLUDE_MODELS = (
4-
'dcim.cablepath',
5-
'extras.cachedvalue',
4+
"dcim.cablepath",
5+
"extras.cachedvalue",
66
)
77

8-
APP_LABEL = 'netbox_custom_objects'
8+
APP_LABEL = "netbox_custom_objects"

0 commit comments

Comments
 (0)