Skip to content

Commit

Permalink
feat(program_v2): redesigned graphql api
Browse files Browse the repository at this point in the history
  • Loading branch information
japsu committed Sep 26, 2023
1 parent ea3c9eb commit fa14451
Showing 1 changed file with 56 additions and 44 deletions.
100 changes: 56 additions & 44 deletions program_v2/schema.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,21 +6,24 @@
import graphene
from graphene_django import DjangoObjectType

from core.models import Event

from .models import Dimension, DimensionValue, ProgramDimensionValue, Program, ScheduleItem


DEFAULT_LANGUAGE = "fi"


def resolve_localized_field(parent, info, **kwargs):
def resolve_localized_field(parent, info, lang: Optional[str] = DEFAULT_LANGUAGE):
"""
Given a LocalizedCharField or similar, this will resolve into its value in the currently active language.
"""
return getattr(parent, info.field_name).translate()
with translation.override(lang):
return getattr(parent, info.field_name).translate()


class DimensionType(DjangoObjectType):
title = graphene.String()
title = graphene.String(lang=graphene.String())
resolve_title = resolve_localized_field

class Meta:
Expand All @@ -29,7 +32,7 @@ class Meta:


class DimensionValueType(DjangoObjectType):
title = graphene.String()
title = graphene.String(lang=graphene.String())
resolve_title = resolve_localized_field

class Meta:
Expand Down Expand Up @@ -69,71 +72,80 @@ class Meta:
@dataclass
class Language:
code: str
name: str
name_fi: str
name_en: str


LANGUAGES = [Language("fi", "suomi", "Finnish"), Language("en", "englanti", "English")]


class LanguageType(graphene.ObjectType):
code = graphene.String()
name = graphene.String()
name = graphene.String(lang=graphene.String())

@staticmethod
def resolve_name(language: Language, info, lang: Optional[str] = DEFAULT_LANGUAGE):
if lang == "fi":
return language.name_fi
else:
return language.name_en


class DimensionFilterInput(graphene.InputObjectType):
dimension = graphene.String()
value = graphene.String()
values = graphene.List(graphene.String)


class Query(graphene.ObjectType):
languages_by_event = graphene.List(
LanguageType,
event=graphene.String(required=True),
lang=graphene.String(),
)
dimensions_by_event = graphene.List(
DimensionType,
event=graphene.String(required=True),
lang=graphene.String(),
)
programs_by_event = graphene.List(
class EventType(DjangoObjectType):
class Meta:
model = Event
fields = ("slug", "name")

programs = graphene.List(
ProgramType,
event=graphene.String(required=True),
filters=graphene.List(DimensionFilterInput),
lang=graphene.String(),
)

def resolve_languages_by_event(self, info, event, lang=None):
# TODO hard-coded for now
if lang == "fi":
return [Language("fi", "suomi"), Language("en", "englanti")]
else:
return [Language("fi", "Finnish"), Language("en", "English")]

def resolve_dimensions_by_event(
self,
info,
event: str,
lang: str = DEFAULT_LANGUAGE,
):
translation.activate(lang)
return Dimension.objects.filter(event__slug=event)

def resolve_programs_by_event(
self,
@staticmethod
def resolve_programs(
event: Event,
info,
event: str,
filters: Optional[list[DimensionFilterInput]] = None,
lang: str = DEFAULT_LANGUAGE,
):
translation.activate(lang)
queryset = Program.objects.filter(event__slug=event)
queryset = Program.objects.filter(event=event)

if filters:
for filter in filters:
queryset = queryset.filter(
program_dimension_values__dimension__slug=filter.dimension,
program_dimension_values__dimension_value__slug=filter.value,
program_dimension_values__dimension_value__slug__in=filter.values,
)

return queryset

dimensions = graphene.List(
DimensionType,
)

@staticmethod
def resolve_dimensions(
event: Event,
info,
):
return Dimension.objects.filter(event=event)

languages = graphene.List(
LanguageType,
event=graphene.String(required=True),
)


class Query(graphene.ObjectType):
event = graphene.Field(EventType, slug=graphene.String(required=True))

@staticmethod
def resolve_event(root, info, slug: str):
return Event.objects.filter(slug=slug).first()


schema = graphene.Schema(query=Query)

0 comments on commit fa14451

Please sign in to comment.