diff --git a/netbox_custom_objects/api/views.py b/netbox_custom_objects/api/views.py index 9b9ce3a..b46dd3d 100644 --- a/netbox_custom_objects/api/views.py +++ b/netbox_custom_objects/api/views.py @@ -2,6 +2,7 @@ from rest_framework.routers import APIRootView from rest_framework.viewsets import ModelViewSet +from netbox_custom_objects.filtersets import get_filterset_class from netbox_custom_objects.models import CustomObjectType, CustomObjectTypeField from . import serializers @@ -39,6 +40,10 @@ def get_queryset(self): self.model = custom_object_type.get_model() return self.model.objects.all() + @property + def filterset_class(self): + return get_filterset_class(self.model) + def list(self, request, *args, **kwargs): return super().list(request, *args, **kwargs) diff --git a/netbox_custom_objects/filtersets.py b/netbox_custom_objects/filtersets.py index 63142b9..49a0420 100644 --- a/netbox_custom_objects/filtersets.py +++ b/netbox_custom_objects/filtersets.py @@ -1,8 +1,14 @@ -from netbox.filtersets import NetBoxModelFilterSet +import django_filters +from django.contrib.postgres.fields import ArrayField +from django.db.models import JSONField +from netbox.filtersets import BaseFilterSet, NetBoxModelFilterSet from .models import CustomObjectType -__all__ = ("CustomObjectTypeFilterSet",) +__all__ = ( + "CustomObjectTypeFilterSet", + "get_filterset_class", +) class CustomObjectTypeFilterSet(NetBoxModelFilterSet): @@ -14,18 +20,44 @@ class Meta: ) -""" -class CustomObjectFilterSet(NetBoxModelFilterSet): - class Meta: - model = CustomObject - fields = ( - "id", - "name", - "custom_object_type", - ) +def get_filterset_class(model): + """ + Create and return a filterset class for the given custom object model. + """ + fields = [field.name for field in model._meta.fields] + + meta = type( + "Meta", + (), + { + "model": model, + "fields": fields, + # TODO: overrides should come from FieldType + # These are placeholders; should use different logic + "filter_overrides": { + JSONField: { + "filter_class": django_filters.CharFilter, + "extra": lambda f: { + "lookup_expr": "icontains", + }, + }, + ArrayField: { + "filter_class": django_filters.CharFilter, + "extra": lambda f: { + "lookup_expr": "icontains", + }, + }, + }, + }, + ) + + attrs = { + "Meta": meta, + "__module__": "database.filtersets", + } - def search(self, queryset, name, value): - if not value.strip(): - return queryset - return queryset.filter(Q(name__icontains=value)) -""" + return type( + f"{model._meta.object_name}FilterSet", + (BaseFilterSet,), # TODO: Should be a NetBoxModelFilterSet + attrs, + ) diff --git a/netbox_custom_objects/views.py b/netbox_custom_objects/views.py index bf4069c..29ae044 100644 --- a/netbox_custom_objects/views.py +++ b/netbox_custom_objects/views.py @@ -1,10 +1,9 @@ -import django_filters import logging + from core.models import ObjectChange from core.tables import ObjectChangeTable from django.contrib.contenttypes.models import ContentType -from django.contrib.postgres.fields import ArrayField -from django.db.models import JSONField, Q +from django.db.models import Q from django.shortcuts import get_object_or_404, render from django.urls import reverse from django.utils.translation import gettext_lazy as _ @@ -13,21 +12,15 @@ from extras.forms import JournalEntryForm from extras.models import JournalEntry from extras.tables import JournalEntryTable -from netbox.filtersets import BaseFilterSet from netbox.forms import NetBoxModelBulkEditForm, NetBoxModelFilterSetForm from netbox.views import generic from netbox.views.generic.mixins import TableMixin from utilities.forms import ConfirmationForm from utilities.htmx import htmx_partial -from utilities.views import ( - ConditionalLoginRequiredMixin, - ViewTab, - get_viewname, - register_model_view, -) +from utilities.views import ConditionalLoginRequiredMixin, ViewTab, get_viewname, register_model_view +from netbox_custom_objects.filtersets import get_filterset_class from netbox_custom_objects.tables import CustomObjectTable - from . import field_types, filtersets, forms, tables from .models import CustomObject, CustomObjectType, CustomObjectTypeField @@ -324,44 +317,7 @@ def get_queryset(self, request): return model.objects.all() def get_filterset(self): - model = self.queryset.model - fields = [field.name for field in model._meta.fields] - - meta = type( - "Meta", - (), - { - "model": model, - "fields": fields, - # TODO: overrides should come from FieldType - # These are placeholders; should use different logic - "filter_overrides": { - JSONField: { - "filter_class": django_filters.CharFilter, - "extra": lambda f: { - "lookup_expr": "icontains", - }, - }, - ArrayField: { - "filter_class": django_filters.CharFilter, - "extra": lambda f: { - "lookup_expr": "icontains", - }, - }, - }, - }, - ) - - attrs = { - "Meta": meta, - "__module__": "database.filtersets", - } - - return type( - f"{model._meta.object_name}FilterSet", - (BaseFilterSet,), # TODO: Should be a NetBoxModelFilterSet - attrs, - ) + return get_filterset_class(self.queryset.model) def get_filterset_form(self): model = self.queryset.model