From 4571b25d4d3ec4cc33c75097dda1a0db8e342e3a Mon Sep 17 00:00:00 2001 From: Calum Mackervoy <c.mackervoy@gmail.com> Date: Fri, 27 Nov 2020 16:35:33 +0000 Subject: [PATCH 1/2] minor: removed nested_urls in favour of simpler system --- djangoldp/views.py | 72 +++++++++++++++++++++------------------------- 1 file changed, 32 insertions(+), 40 deletions(-) diff --git a/djangoldp/views.py b/djangoldp/views.py index 5659f3cd..5b026d04 100644 --- a/djangoldp/views.py +++ b/djangoldp/views.py @@ -334,18 +334,15 @@ class LDPViewSetGenerator(ModelViewSet): return r'(?P<{}>{}+)/'.format(lookup_field, lookup_group) @classonlymethod - 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 - ''' + def build_nested_view_set(cls, view_set=None): + '''returns the the view_set parameter mixed into the LDPNestedViewSet class''' if view_set is not None: - class LDPNestedCustomViewSet(LDPNestedViewSet, view_set): + class CustomLDPNestedViewSet(LDPNestedViewSet, view_set): pass - return LDPNestedCustomViewSet.nested_urls(nested_field, **kwargs) + return CustomLDPNestedViewSet - return LDPNestedViewSet.nested_urls(nested_field, **kwargs) + return LDPNestedViewSet @classonlymethod def urls(cls, **kwargs): @@ -366,17 +363,37 @@ class LDPViewSetGenerator(ModelViewSet): for field in kwargs.get('nested_fields') or cls.nested_fields: # the nested property may have a custom viewset defined try: - nested_model = kwargs['model']._meta.get_field(field).related_model + related_field = kwargs['model']._meta.get_field(field) + nested_model = related_field.related_model except FieldDoesNotExist: - nested_model = getattr(kwargs['model'], field).field.model + related_field = getattr(kwargs['model'], field).field + nested_model = related_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 + if related_field.related_query_name: + nested_related_name = related_field.related_query_name() else: - urls_fct = cls.nested_urls + nested_related_name = related_field.remote_field.name - urls.append(re_path('^' + detail_expr + field + '/', urls_fct(field, **kwargs))) + view_set = None + if hasattr(nested_model, 'get_view_set'): + view_set = nested_model.get_view_set() + nested_view_set = cls.build_nested_view_set(view_set) + + urls.append(re_path('^' + detail_expr + field + '/', + nested_view_set.urls( + model=nested_model, + model_prefix=kwargs['model']._meta.object_name.lower(), # prefix with parent name + lookup_field=Model.get_meta(nested_model, 'lookup_field', 'pk'), + lookup_url_kwarg=kwargs['model']._meta.object_name.lower() + '_id', + exclude=(nested_related_name,) if related_field.one_to_many else (), + permission_classes=Model.get_meta(nested_model, 'permission_classes', [LDPPermissions]), + nested_field=field, + fields=Model.get_meta(nested_model, 'serializer_fields', []), + nested_fields=[], + parent_model=kwargs['model'], + parent_lookup_field=cls.get_lookup_arg(**kwargs), + related_field=related_field, + nested_related_name=nested_related_name))) return include(urls) @@ -579,31 +596,6 @@ class LDPNestedViewSet(LDPViewSet): def get_related_fields(cls, model): return {field.get_accessor_name(): field for field in model._meta.fields_map.values()} - @classonlymethod - def nested_urls(cls, nested_field, **kwargs): - try: - related_field = cls.get_model(**kwargs)._meta.get_field(nested_field) - except FieldDoesNotExist: - related_field = cls.get_related_fields(cls.get_model(**kwargs))[nested_field] - if related_field.related_query_name: - nested_related_name = related_field.related_query_name() - else: - nested_related_name = related_field.remote_field.name - - return cls.urls( - lookup_field=Model.get_meta(related_field.related_model, 'lookup_field', 'pk'), - model=related_field.related_model, - exclude=(nested_related_name,) if related_field.one_to_many else (), - parent_model=cls.get_model(**kwargs), - nested_field=nested_field, - nested_related_name=nested_related_name, - related_field=related_field, - parent_lookup_field=cls.get_lookup_arg(**kwargs), - model_prefix=cls.get_model(**kwargs)._meta.object_name.lower(), - permission_classes=Model.get_permission_classes(related_field.related_model, - kwargs.get('permission_classes', [LDPPermissions])), - lookup_url_kwarg=related_field.related_model._meta.object_name.lower() + '_id') - class LDPSourceViewSet(LDPViewSet): model = LDPSource -- GitLab From ca77010491b07997e4931c533497bee6ebde5be8 Mon Sep 17 00:00:00 2001 From: Calum Mackervoy <c.mackervoy@gmail.com> Date: Fri, 27 Nov 2020 16:54:18 +0000 Subject: [PATCH 2/2] syntax: cleaned things up a bit --- djangoldp/views.py | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/djangoldp/views.py b/djangoldp/views.py index 5b026d04..df8edbae 100644 --- a/djangoldp/views.py +++ b/djangoldp/views.py @@ -337,10 +337,10 @@ class LDPViewSetGenerator(ModelViewSet): def build_nested_view_set(cls, view_set=None): '''returns the the view_set parameter mixed into the LDPNestedViewSet class''' if view_set is not None: - class CustomLDPNestedViewSet(LDPNestedViewSet, view_set): + class LDPNestedCustomViewSet(LDPNestedViewSet, view_set): pass - return CustomLDPNestedViewSet + return LDPNestedCustomViewSet return LDPNestedViewSet @@ -374,6 +374,7 @@ class LDPViewSetGenerator(ModelViewSet): else: nested_related_name = related_field.remote_field.name + # urls should be called from _nested_ view set, which may need a custom view set mixed in view_set = None if hasattr(nested_model, 'get_view_set'): view_set = nested_model.get_view_set() @@ -592,10 +593,6 @@ class LDPNestedViewSet(LDPViewSet): if self.related_field.many_to_one or self.related_field.one_to_one: return [getattr(self.get_parent(), self.nested_field)] - @classonlymethod - def get_related_fields(cls, model): - return {field.get_accessor_name(): field for field in model._meta.fields_map.values()} - class LDPSourceViewSet(LDPViewSet): model = LDPSource -- GitLab