Skip to content
Snippets Groups Projects
graphql_schema.py 3.28 KiB
Newer Older
import graphene
from django.contrib.auth import get_user_model
from graphene_django.types import DjangoObjectType
from graphene_django.views import GraphQLView

from portal.models import DataFile, DataSet, Profile
from portal.views import TokenLoginMixin


# Protect graphql API page
class PrivateGraphQLView(TokenLoginMixin, GraphQLView):
    pass


# Create a GraphQL type for the various models
class DataFileType(DjangoObjectType):
    class Meta:
        model = DataFile
        fields = "__all__"


class DataSetType(DjangoObjectType):
    class Meta:
        model = DataSet
        fields = "__all__"


class ProfileSetType(DjangoObjectType):
    class Meta:
        model = Profile


class UserType(DjangoObjectType):
    class Meta:
        model = get_user_model()


# Create a Query type
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(),
            key_values=graphene.JSONString(),
            keys=graphene.JSONString(),
            values=graphene.JSONString(),
            dataset=graphene.String()
            )
    datasets = graphene.List(DataSetType)

    def resolve_datafile(self, info, **kwargs):
        id = kwargs.get('id')
        dbid = kwargs.get('dbid')

        if id is not None:
            return DataFile.objects.get(iric_data_id=id)
        elif dbid is not None:
            return DataFile.objects.get(pk=dbid)

    def resolve_dataset(self, info, **kwargs):
        id = kwargs.get('id')
        dbid = kwargs.get('dbid')

        if id is not None:
            return DataSet.objects.get(iric_data_id=id)
        elif dbid is not None:
            return DataSet.objects.get(pk=dbid)

        return None

    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:
            qs = qs.filter(annotations__has_key=key)
        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)

        return qs.distinct()

    def resolve_datasets(self, info, **kwargs):
        return DataSet.objects.all()


class Mutation(graphene.ObjectType):
    pass


schema = graphene.Schema(query=Query, auto_camelcase=False)