1
+ from django .conf import settings
1
2
from django .http import Http404
2
3
from django .shortcuts import get_object_or_404
4
+ from django .views .static import serve
3
5
from django_rq .queues import get_connection
4
6
from drf_spectacular .utils import extend_schema , extend_schema_view
5
7
from rest_framework import status
@@ -32,6 +34,7 @@ class ExtrasRootView(APIRootView):
32
34
"""
33
35
Extras API root view
34
36
"""
37
+
35
38
def get_view_name (self ):
36
39
return 'Extras'
37
40
@@ -40,6 +43,7 @@ def get_view_name(self):
40
43
# EventRules
41
44
#
42
45
46
+
43
47
class EventRuleViewSet (NetBoxModelViewSet ):
44
48
metadata_class = ContentTypeMetadata
45
49
queryset = EventRule .objects .all ()
@@ -51,6 +55,7 @@ class EventRuleViewSet(NetBoxModelViewSet):
51
55
# Webhooks
52
56
#
53
57
58
+
54
59
class WebhookViewSet (NetBoxModelViewSet ):
55
60
metadata_class = ContentTypeMetadata
56
61
queryset = Webhook .objects .all ()
@@ -62,6 +67,7 @@ class WebhookViewSet(NetBoxModelViewSet):
62
67
# Custom fields
63
68
#
64
69
70
+
65
71
class CustomFieldViewSet (NetBoxModelViewSet ):
66
72
metadata_class = ContentTypeMetadata
67
73
queryset = CustomField .objects .select_related ('choice_set' )
@@ -89,9 +95,7 @@ def choices(self, request, pk):
89
95
90
96
# Paginate data
91
97
if page := self .paginate_queryset (choices ):
92
- data = [
93
- {'id' : c [0 ], 'display' : c [1 ]} for c in page
94
- ]
98
+ data = [{'id' : c [0 ], 'display' : c [1 ]} for c in page ]
95
99
else :
96
100
data = []
97
101
@@ -102,6 +106,7 @@ def choices(self, request, pk):
102
106
# Custom links
103
107
#
104
108
109
+
105
110
class CustomLinkViewSet (NetBoxModelViewSet ):
106
111
metadata_class = ContentTypeMetadata
107
112
queryset = CustomLink .objects .all ()
@@ -113,6 +118,7 @@ class CustomLinkViewSet(NetBoxModelViewSet):
113
118
# Export templates
114
119
#
115
120
121
+
116
122
class ExportTemplateViewSet (SyncedDataMixin , NetBoxModelViewSet ):
117
123
metadata_class = ContentTypeMetadata
118
124
queryset = ExportTemplate .objects .all ()
@@ -124,6 +130,7 @@ class ExportTemplateViewSet(SyncedDataMixin, NetBoxModelViewSet):
124
130
# Saved filters
125
131
#
126
132
133
+
127
134
class SavedFilterViewSet (NetBoxModelViewSet ):
128
135
metadata_class = ContentTypeMetadata
129
136
queryset = SavedFilter .objects .all ()
@@ -135,6 +142,7 @@ class SavedFilterViewSet(NetBoxModelViewSet):
135
142
# Table Configs
136
143
#
137
144
145
+
138
146
class TableConfigViewSet (NetBoxModelViewSet ):
139
147
metadata_class = ContentTypeMetadata
140
148
queryset = TableConfig .objects .all ()
@@ -146,6 +154,7 @@ class TableConfigViewSet(NetBoxModelViewSet):
146
154
# Bookmarks
147
155
#
148
156
157
+
149
158
class BookmarkViewSet (NetBoxModelViewSet ):
150
159
metadata_class = ContentTypeMetadata
151
160
queryset = Bookmark .objects .all ()
@@ -157,6 +166,7 @@ class BookmarkViewSet(NetBoxModelViewSet):
157
166
# Notifications & subscriptions
158
167
#
159
168
169
+
160
170
class NotificationViewSet (NetBoxModelViewSet ):
161
171
metadata_class = ContentTypeMetadata
162
172
queryset = Notification .objects .all ()
@@ -178,6 +188,7 @@ class SubscriptionViewSet(NetBoxModelViewSet):
178
188
# Tags
179
189
#
180
190
191
+
181
192
class TagViewSet (NetBoxModelViewSet ):
182
193
queryset = Tag .objects .all ()
183
194
serializer_class = serializers .TagSerializer
@@ -194,17 +205,30 @@ class TaggedItemViewSet(RetrieveModelMixin, ListModelMixin, BaseViewSet):
194
205
# Image attachments
195
206
#
196
207
208
+
197
209
class ImageAttachmentViewSet (NetBoxModelViewSet ):
198
210
metadata_class = ContentTypeMetadata
199
211
queryset = ImageAttachment .objects .all ()
200
212
serializer_class = serializers .ImageAttachmentSerializer
201
213
filterset_class = filtersets .ImageAttachmentFilterSet
202
214
215
+ @action (
216
+ methods = ['GET' ],
217
+ detail = True ,
218
+ url_path = 'download' ,
219
+ url_name = 'download' ,
220
+ )
221
+ def download (self , request , pk , * args , ** kwargs ):
222
+ obj = get_object_or_404 (self .queryset , pk = pk )
223
+ # Render and return the elevation as an SVG drawing with the correct content type
224
+ return serve (request , obj .image .path , document_root = settings .MEDIA_ROOT )
225
+
203
226
204
227
#
205
228
# Journal entries
206
229
#
207
230
231
+
208
232
class JournalEntryViewSet (NetBoxModelViewSet ):
209
233
metadata_class = ContentTypeMetadata
210
234
queryset = JournalEntry .objects .all ()
@@ -216,6 +240,7 @@ class JournalEntryViewSet(NetBoxModelViewSet):
216
240
# Config contexts
217
241
#
218
242
243
+
219
244
class ConfigContextViewSet (SyncedDataMixin , NetBoxModelViewSet ):
220
245
queryset = ConfigContext .objects .all ()
221
246
serializer_class = serializers .ConfigContextSerializer
@@ -226,6 +251,7 @@ class ConfigContextViewSet(SyncedDataMixin, NetBoxModelViewSet):
226
251
# Config templates
227
252
#
228
253
254
+
229
255
class ConfigTemplateViewSet (SyncedDataMixin , ConfigTemplateRenderMixin , NetBoxModelViewSet ):
230
256
queryset = ConfigTemplate .objects .all ()
231
257
serializer_class = serializers .ConfigTemplateSerializer
@@ -247,6 +273,7 @@ def render(self, request, pk):
247
273
# Scripts
248
274
#
249
275
276
+
250
277
@extend_schema_view (
251
278
update = extend_schema (request = serializers .ScriptInputSerializer ),
252
279
partial_update = extend_schema (request = serializers .ScriptInputSerializer ),
@@ -287,10 +314,7 @@ def post(self, request, pk):
287
314
raise PermissionDenied ("This user does not have permission to run scripts." )
288
315
289
316
script = self ._get_script (pk )
290
- input_serializer = serializers .ScriptInputSerializer (
291
- data = request .data ,
292
- context = {'script' : script }
293
- )
317
+ input_serializer = serializers .ScriptInputSerializer (data = request .data , context = {'script' : script })
294
318
295
319
# Check that at least one RQ worker is running
296
320
if not Worker .count (get_connection ('default' )):
@@ -305,7 +329,7 @@ def post(self, request, pk):
305
329
commit = input_serializer .data ['commit' ],
306
330
job_timeout = script .python_class .job_timeout ,
307
331
schedule_at = input_serializer .validated_data .get ('schedule_at' ),
308
- interval = input_serializer .validated_data .get ('interval' )
332
+ interval = input_serializer .validated_data .get ('interval' ),
309
333
)
310
334
serializer = serializers .ScriptDetailSerializer (script , context = {'request' : request })
311
335
@@ -318,10 +342,12 @@ def post(self, request, pk):
318
342
# Object types
319
343
#
320
344
345
+
321
346
class ObjectTypeViewSet (ReadOnlyModelViewSet ):
322
347
"""
323
348
Read-only list of ObjectTypes.
324
349
"""
350
+
325
351
permission_classes = [IsAuthenticatedOrLoginNotRequired ]
326
352
queryset = ObjectType .objects .order_by ('app_label' , 'model' )
327
353
serializer_class = serializers .ObjectTypeSerializer
@@ -332,6 +358,7 @@ class ObjectTypeViewSet(ReadOnlyModelViewSet):
332
358
# User dashboard
333
359
#
334
360
361
+
335
362
class DashboardView (RetrieveUpdateDestroyAPIView ):
336
363
queryset = Dashboard .objects .all ()
337
364
serializer_class = serializers .DashboardSerializer
0 commit comments