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