diff --git a/djangoldp/views.py b/djangoldp/views.py index bae30f1beb4760329ac3dcc609dc887d16fc047c..d08943348bd13ef0945b26563b3fbda86eb4eb21 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)