From ab31455fe1c9972fa413777561f9a49a62329e8e Mon Sep 17 00:00:00 2001
From: Calum Mackervoy <c.mackervoy@gmail.com>
Date: Thu, 13 Aug 2020 14:29:36 +0000
Subject: [PATCH] update: nested_urls respect custom viewset

---
 djangoldp/views.py | 24 ++++++++++++++++++++++--
 1 file changed, 22 insertions(+), 2 deletions(-)

diff --git a/djangoldp/views.py b/djangoldp/views.py
index bae30f1b..d0894334 100644
--- a/djangoldp/views.py
+++ b/djangoldp/views.py
@@ -306,7 +306,16 @@ class LDPViewSetGenerator(ModelViewSet):
         return r'(?P<{}>{}+)/'.format(lookup_field, lookup_group)
 
     @classonlymethod
-    def nested_urls(cls, nested_field, **kwargs):
+    def nested_urls(cls, nested_field, view_set=None, **kwargs):
+        '''
+        constructs url patterns for parameterised nested_field
+        :param view_set: an optional CustomViewSet to mixin with the LDPNestedViewSet implementation
+        '''
+        if view_set is not None:
+            class LDPNestedCustomViewSet(LDPNestedViewSet, view_set):
+                pass
+            return LDPNestedCustomViewSet.nested_urls(nested_field, **kwargs)
+
         return LDPNestedViewSet.nested_urls(nested_field, **kwargs)
 
     @classonlymethod
@@ -326,7 +335,18 @@ class LDPViewSetGenerator(ModelViewSet):
 
         # append nested fields to the urls list
         for field in kwargs.get('nested_fields') or cls.nested_fields:
-            urls.append(url('^' + detail_expr + field + '/', cls.nested_urls(field, **kwargs)))
+            # the nested property may have a custom viewset defined
+            try:
+                nested_model = kwargs['model']._meta.get_field(field).related_model
+            except FieldDoesNotExist:
+                nested_model = getattr(kwargs['model'], field).field.model
+
+            if hasattr(nested_model, 'get_view_set'):
+                kwargs['view_set'] = nested_model.get_view_set()
+                urls_fct = kwargs['view_set'].nested_urls # our custom view_set may override nested_urls
+            else:
+                urls_fct = cls.nested_urls
+            urls.append(url('^' + detail_expr + field + '/', urls_fct(field, **kwargs)))
 
         return include(urls)
 
-- 
GitLab