Skip to content

Instantly share code, notes, and snippets.

@Object905
Created July 14, 2021 16:52
Show Gist options
  • Save Object905/3a206d524dd061f3540a70c564d2fe43 to your computer and use it in GitHub Desktop.
Save Object905/3a206d524dd061f3540a70c564d2fe43 to your computer and use it in GitHub Desktop.
import strawberry
def filter_unset_input(input):
result = {}
for key in input.__annotations__.keys():
value = getattr(input, key)
if value != strawberry.arguments.UNSET:
result[key] = value
return result
def make_ordering_enum(name, fields: Sequence[str]):
# then you order_by(enum._value_)
ordering_variants = []
for field_name in fields:
ordering_variants.append((field_name.upper() + "_ASC", field_name))
ordering_variants.append((field_name.upper() + "_DESC", "-" + field_name))
return strawberry.enum(Enum(name, ordering_variants))
def _parse_money_scalar(raw: Union[dict, str]):
if isinstance(raw, dict):
return DjMoney(raw["amount"], raw["currency"])
if isinstance(raw, str):
spl = raw.split(" ")
return DjMoney(Decimal(spl[0]), spl[1])
return NotImplemented
MoneyScalar = strawberry.scalar(
DjMoney,
serialize=lambda money: {"amount": money.amount, "currency": money.currency.code},
parse_value=_parse_money_scalar,
description="Money type for Django-money package. "
"When used as query input can be in two forms: "
'either `{"amount": 1.5, "currency": "USD"}`'
'or as a string with space separated amount and currency `"1.5 USD"`.'
"For responses first variant is used.",
)
from strawberry_django.types import field_type_map
def fix_strawberry_django():
field_type_map[ImageField] = str
field_type_map[MoneyField] = MoneyScalar
field_type_map[CurrencyField] = Currency
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment