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