From 8d3fba6b339652394be2b7319fb2fa93259d72a4 Mon Sep 17 00:00:00 2001
From: Calum Mackervoy <c.mackervoy@gmail.com>
Date: Wed, 8 Apr 2020 20:51:59 +0100
Subject: [PATCH] added FilterBackends for local objects

---
 djangoldp/filters.py | 23 +++++++++++++++++++++++
 1 file changed, 23 insertions(+)
 create mode 100644 djangoldp/filters.py

diff --git a/djangoldp/filters.py b/djangoldp/filters.py
new file mode 100644
index 00000000..59afd6b9
--- /dev/null
+++ b/djangoldp/filters.py
@@ -0,0 +1,23 @@
+from rest_framework.filters import BaseFilterBackend
+from djangoldp.models import Model
+
+
+class LocalObjectFilterBackend(BaseFilterBackend):
+    """
+    Filter which removes external objects (federated backlinks) from the queryset
+    For querysets which should only include local objects
+    """
+    def filter_queryset(self, request, queryset, view):
+        internal_ids = [x.pk for x in queryset if not Model.is_external(x)]
+        return queryset.filter(pk__in=internal_ids)
+
+
+class LocalObjectOnContainerPathBackend(LocalObjectFilterBackend):
+    """
+    Override of LocalObjectFilterBackend which removes external objects when the view requested
+    is the model container path
+    """
+    def filter_queryset(self, request, queryset, view):
+        if issubclass(view.model, Model) and request.path_info == view.model.get_container_path():
+            return super(LocalObjectOnContainerPathBackend, self).filter_queryset(request, queryset, view)
+        return queryset
-- 
GitLab