1- import django_filters
21import logging
2+
33from core .models import ObjectChange
44from core .tables import ObjectChangeTable
55from 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
87from django .shortcuts import get_object_or_404 , render
98from django .urls import reverse
109from django .utils .translation import gettext_lazy as _
1312from extras .forms import JournalEntryForm
1413from extras .models import JournalEntry
1514from extras .tables import JournalEntryTable
16- from netbox .filtersets import BaseFilterSet
1715from netbox .forms import (
1816 NetBoxModelBulkEditForm ,
1917 NetBoxModelFilterSetForm ,
2321from netbox .views .generic .mixins import TableMixin
2422from utilities .forms import ConfirmationForm
2523from 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
3225
26+ from netbox_custom_objects .filtersets import get_filterset_class
3327from netbox_custom_objects .tables import CustomObjectTable
34-
3528from . import field_types , filtersets , forms , tables
3629from .models import CustomObject , CustomObjectType , CustomObjectTypeField
3730from extras .choices import CustomFieldTypeChoices
@@ -172,9 +165,22 @@ def get_table(self, data, request, bulk_actions=True):
172165
173166 def get_extra_context (self , request , instance ):
174167 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+
175180 return {
176181 "custom_objects" : model .objects .all (),
177182 "table" : self .get_table (self .queryset , request ),
183+ "field_groups" : field_groups ,
178184 }
179185
180186
@@ -194,6 +200,16 @@ def _get_dependent_objects(self, obj):
194200 dependent_objects = super ()._get_dependent_objects (obj )
195201 model = obj .get_model ()
196202 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+
197213 return dependent_objects
198214
199215
@@ -319,44 +335,7 @@ def get_queryset(self, request):
319335 return model .objects .all ()
320336
321337 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 )
360339
361340 def get_filterset_form (self ):
362341 model = self .queryset .model
0 commit comments