1
- import django_filters
2
1
import logging
2
+
3
3
from core .models import ObjectChange
4
4
from core .tables import ObjectChangeTable
5
5
from django .contrib .contenttypes .models import ContentType
6
- from django .contrib .postgres .fields import ArrayField
7
- from django .db .models import JSONField , Q
6
+ from django .db .models import Q
8
7
from django .shortcuts import get_object_or_404 , render
9
8
from django .urls import reverse
10
9
from django .utils .translation import gettext_lazy as _
13
12
from extras .forms import JournalEntryForm
14
13
from extras .models import JournalEntry
15
14
from extras .tables import JournalEntryTable
16
- from netbox .filtersets import BaseFilterSet
17
15
from netbox .forms import (
18
16
NetBoxModelBulkEditForm ,
19
17
NetBoxModelFilterSetForm ,
23
21
from netbox .views .generic .mixins import TableMixin
24
22
from utilities .forms import ConfirmationForm
25
23
from utilities .htmx import htmx_partial
26
- from utilities .views import (
27
- ConditionalLoginRequiredMixin ,
28
- ViewTab ,
29
- get_viewname ,
30
- register_model_view ,
31
- )
24
+ from utilities .views import ConditionalLoginRequiredMixin , ViewTab , get_viewname , register_model_view
32
25
26
+ from netbox_custom_objects .filtersets import get_filterset_class
33
27
from netbox_custom_objects .tables import CustomObjectTable
34
-
35
28
from . import field_types , filtersets , forms , tables
36
29
from .models import CustomObject , CustomObjectType , CustomObjectTypeField
37
30
from extras .choices import CustomFieldTypeChoices
@@ -172,9 +165,22 @@ def get_table(self, data, request, bulk_actions=True):
172
165
173
166
def get_extra_context (self , request , instance ):
174
167
model = instance .get_model ()
168
+
169
+ # Get fields and group them by group_name
170
+ fields = instance .fields .all ().order_by ("group_name" , "weight" , "name" )
171
+
172
+ # Group fields by group_name
173
+ field_groups = {}
174
+ for field in fields :
175
+ group_name = field .group_name or None # Use None for ungrouped fields
176
+ if group_name not in field_groups :
177
+ field_groups [group_name ] = []
178
+ field_groups [group_name ].append (field )
179
+
175
180
return {
176
181
"custom_objects" : model .objects .all (),
177
182
"table" : self .get_table (self .queryset , request ),
183
+ "field_groups" : field_groups ,
178
184
}
179
185
180
186
@@ -194,6 +200,16 @@ def _get_dependent_objects(self, obj):
194
200
dependent_objects = super ()._get_dependent_objects (obj )
195
201
model = obj .get_model ()
196
202
dependent_objects [model ] = list (model .objects .all ())
203
+
204
+ # Find CustomObjectTypeFields that reference this CustomObjectType
205
+ referencing_fields = CustomObjectTypeField .objects .filter (
206
+ related_object_type = obj .content_type
207
+ )
208
+
209
+ # Add the CustomObjectTypeFields that reference this CustomObjectType
210
+ if referencing_fields .exists ():
211
+ dependent_objects [CustomObjectTypeField ] = list (referencing_fields )
212
+
197
213
return dependent_objects
198
214
199
215
@@ -319,44 +335,7 @@ def get_queryset(self, request):
319
335
return model .objects .all ()
320
336
321
337
def get_filterset (self ):
322
- model = self .queryset .model
323
- fields = [field .name for field in model ._meta .fields ]
324
-
325
- meta = type (
326
- "Meta" ,
327
- (),
328
- {
329
- "model" : model ,
330
- "fields" : fields ,
331
- # TODO: overrides should come from FieldType
332
- # These are placeholders; should use different logic
333
- "filter_overrides" : {
334
- JSONField : {
335
- "filter_class" : django_filters .CharFilter ,
336
- "extra" : lambda f : {
337
- "lookup_expr" : "icontains" ,
338
- },
339
- },
340
- ArrayField : {
341
- "filter_class" : django_filters .CharFilter ,
342
- "extra" : lambda f : {
343
- "lookup_expr" : "icontains" ,
344
- },
345
- },
346
- },
347
- },
348
- )
349
-
350
- attrs = {
351
- "Meta" : meta ,
352
- "__module__" : "database.filtersets" ,
353
- }
354
-
355
- return type (
356
- f"{ model ._meta .object_name } FilterSet" ,
357
- (BaseFilterSet ,), # TODO: Should be a NetBoxModelFilterSet
358
- attrs ,
359
- )
338
+ return get_filterset_class (self .queryset .model )
360
339
361
340
def get_filterset_form (self ):
362
341
model = self .queryset .model
0 commit comments