From 77263104d9f53398d0159afb9a81a683d7a07f10 Mon Sep 17 00:00:00 2001
From: autodeploy <benoit@startinblox.com>
Date: Fri, 12 Jul 2024 14:27:52 +0200
Subject: [PATCH] feature: filter on is_active if exists by default

---
 djangoldp/__init__.py    |  2 +-
 djangoldp/filters.py     | 14 ++++++++++++--
 djangoldp/permissions.py |  4 ++--
 3 files changed, 15 insertions(+), 5 deletions(-)

diff --git a/djangoldp/__init__.py b/djangoldp/__init__.py
index 7f7595fa..9d420347 100644
--- a/djangoldp/__init__.py
+++ b/djangoldp/__init__.py
@@ -5,4 +5,4 @@ __version__ = '0.0.0'
 options.DEFAULT_NAMES += (
     'lookup_field', 'rdf_type', 'rdf_context', 'auto_author', 'owner_field', 'owner_urlid_field',
     'view_set', 'container_path', 'permission_classes', 'serializer_fields', 'serializer_fields_exclude', 'empty_containers',
-    'nested_fields', 'depth', 'permission_roles', 'inherit_permissions', 'public_field', 'static_version', 'static_params')
+    'nested_fields', 'depth', 'permission_roles', 'inherit_permissions', 'public_field', 'static_version', 'static_params', 'active_field')
diff --git a/djangoldp/filters.py b/djangoldp/filters.py
index c1da4106..3cf502d1 100644
--- a/djangoldp/filters.py
+++ b/djangoldp/filters.py
@@ -21,13 +21,23 @@ class OwnerFilterBackend(BaseFilterBackend):
 
 class PublicFilterBackend(BaseFilterBackend):
     """
-    No filter applied.
-    This class is useful for permission classes that don't filter objects, so that they can be chained with other
+    Public filter applied.
+    This class is on models which bears a is_public boolean field, to filter objects that are public
     """       
     def filter_queryset(self, request, queryset, view):
         public_field = queryset.model._meta.public_field
         return queryset.filter(**{public_field: True})
 
+class ActiveFilterBackend(BaseFilterBackend):
+    """
+    Filter which removes inactive objects from the queryset, useful for user for instance and configurable using the active_field meta
+    """
+    def filter_queryset(self, request, queryset, view):
+        if (hasattr(queryset.model._meta, 'active_field')):
+            is_active_field = queryset.model._meta.active_field
+            return queryset.filter(**{is_active_field :True})
+        return queryset
+
 class NoFilterBackend(BaseFilterBackend):
     """
     No filter applied.
diff --git a/djangoldp/permissions.py b/djangoldp/permissions.py
index 95c43099..0f03840e 100644
--- a/djangoldp/permissions.py
+++ b/djangoldp/permissions.py
@@ -4,7 +4,7 @@ from django.http import Http404
 from rest_framework.permissions import BasePermission, DjangoObjectPermissions, OR, AND
 from rest_framework.filters import BaseFilterBackend
 from rest_framework_guardian.filters import ObjectPermissionsFilter
-from djangoldp.filters import OwnerFilterBackend, NoFilterBackend, PublicFilterBackend, IPFilterBackend
+from djangoldp.filters import OwnerFilterBackend, NoFilterBackend, PublicFilterBackend, IPFilterBackend, ActiveFilterBackend
 from djangoldp.utils import is_anonymous_user, is_authenticated_user, check_client_ip
 
 
@@ -79,7 +79,7 @@ class LDPBasePermission(BasePermission):
     """
     # filter backends associated with the permissions class. This will be used to filter queryset in the (auto-generated)
     # view for a model, and in the serializing nested fields
-    filter_backend = NoFilterBackend
+    filter_backend = ActiveFilterBackend
     # by default, all permissions
     permissions = getattr(settings, 'DJANGOLDP_PERMISSIONS', DEFAULT_DJANGOLDP_PERMISSIONS)
     # perms_map defines the permissions required for different methods
-- 
GitLab