Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions netbox_custom_objects/api/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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)

Expand Down
64 changes: 48 additions & 16 deletions netbox_custom_objects/filtersets.py
Original file line number Diff line number Diff line change
@@ -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):
Expand All @@ -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,
)
54 changes: 5 additions & 49 deletions netbox_custom_objects/views.py
Original file line number Diff line number Diff line change
@@ -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 _
Expand All @@ -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

Expand Down Expand Up @@ -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
Expand Down