From 5369469e54916b8a3dfb2de020c5c395f8f5a3ee Mon Sep 17 00:00:00 2001 From: Albert Feghaly <albert.feghaly@umontreal.ca> Date: Tue, 21 Jun 2022 23:55:57 -0400 Subject: [PATCH] Option to specify multiple key-value pairs with GraphQL --- portal/graphql_schema.py | 32 +++++++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/portal/graphql_schema.py b/portal/graphql_schema.py index 48685dd..1a23437 100644 --- a/portal/graphql_schema.py +++ b/portal/graphql_schema.py @@ -39,7 +39,15 @@ class UserType(DjangoObjectType): class Query(graphene.ObjectType): datafile = graphene.Field(DataFileType, id=graphene.String(), dbid=graphene.Int()) dataset = graphene.Field(DataSetType, id=graphene.String(), dbid=graphene.Int()) - datafiles = graphene.List(DataFileType, key=graphene.String(), value=graphene.String(), dataset=graphene.String()) + datafiles = graphene.List( + DataFileType, + key=graphene.String(), + value=graphene.String(), + key_values=graphene.JSONString(), + keys=graphene.JSONString(), + values=graphene.JSONString(), + dataset=graphene.String() + ) datasets = graphene.List(DataSetType) def resolve_datafile(self, info, **kwargs): @@ -65,10 +73,23 @@ class Query(graphene.ObjectType): def resolve_datafiles(self, info, **kwargs): # qs = DataFile.objects.accessible_to_profile(self.request.user.profile) qs = DataFile.objects + key = kwargs.get('key', None) value = kwargs.get('value', None) + key_values = kwargs.get('key_values', None) + keys = kwargs.get('keys', None) + values = kwargs.get('values', None) dataset = kwargs.get('dataset', None) + if type(key_values) is not dict: + key_values = {} + + if type(keys) is not list: + keys = [] + + if type(values) is not list: + values = [] + if key and value: qs = qs.filter(annotations__contains={key: value}) elif key: @@ -76,6 +97,15 @@ class Query(graphene.ObjectType): elif value: qs = qs.filter(annotations__values__icontains=value) + for k, v in key_values.items(): + qs = qs.filter(annotations__contains={k: v}) + + for k in keys: + qs = qs.filter(annotations__has_key=k) + + for v in values: + qs = qs.filter(annotations__values__icontains=v) + if dataset: qs = qs.filter(datasets__iric_data_id=dataset) -- GitLab