From 62c92ba6fd852c6ed8017284f2a715ebce1106f6 Mon Sep 17 00:00:00 2001 From: Roberto Rosario Date: Sun, 17 Mar 2019 17:53:30 -0400 Subject: [PATCH] Add support for runtime queryset method Allow passing runtime queryset to FilteredPrimaryKeyRelatedField using a method name via the source_queryset_method attribute or a default method name of "get__queryset". Signed-off-by: Roberto Rosario --- mayan/apps/rest_api/relations.py | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/mayan/apps/rest_api/relations.py b/mayan/apps/rest_api/relations.py index 2083415094..c1371638c4 100644 --- a/mayan/apps/rest_api/relations.py +++ b/mayan/apps/rest_api/relations.py @@ -16,6 +16,7 @@ class FilteredPrimaryKeyRelatedField(serializers.PrimaryKeyRelatedField): self.source_model = kwargs.pop('source_model', None) self.source_permission = kwargs.pop('source_permission', None) self.source_queryset = kwargs.pop('source_queryset', None) + self.source_queryset_method = kwargs.pop('source_queryset_method', None) super(FilteredPrimaryKeyRelatedField, self).__init__(**kwargs) def get_queryset(self): @@ -31,9 +32,17 @@ class FilteredPrimaryKeyRelatedField(serializers.PrimaryKeyRelatedField): # Ensure queryset is re-evaluated whenever used. queryset = queryset.all() else: - raise ImproperlyConfigured( - 'Need to provide a source_model or a source_queryset' + method_name = self.source_queryset_method or 'get_{}_queryset'.format( + self.field_name ) + try: + queryset = getattr(self.parent, method_name)() + except AttributeError: + raise ImproperlyConfigured( + 'Need to provide a source_model, a ' + 'source_queryset, a source_queryset_method, or ' + 'a method named "%s".' % method_name + ) assert 'request' in self.context, ( "`%s` requires the request in the serializer"