graphene icon indicating copy to clipboard operation
graphene copied to clipboard

Cannot use an enum as a graphene.List named argument

Open spacether opened this issue 4 years ago • 6 comments

When defining this query:

class Episode(graphene.Enum):
    NEWHOPE = 4
    EMPIRE = 5
    JEDI = 6

class ListAvailableSubscriptionPlans(graphene.ObjectType):

    available_subscription_plans = graphene.List(
        graphene.NonNull(graphql.SubscriptionPlanObject),
        subscriber_id=graphene.Int(required=True),
        subscriber_type=Episode,
        target_currency=graphene.String(required=True),
    )

    def resolve_available_subscription_plans(
        self, info, subscriber_id, subscriber_type, target_currency
    ):

And running the python module, we get the error:

  File "/app/subscription_management/subscriptions/api.py", line 16, in <module>
    class ListAvailableSubscriptionPlans(graphene.ObjectType):
  File "/app/virtualenv/lib/python3.8/site-packages/graphene/utils/subclass_with_meta.py", line 52, in __init_subclass__
    super_class.__init_subclass_with_meta__(**options)
  File "/app/virtualenv/lib/python3.8/site-packages/graphene/types/objecttype.py", line 112, in __init_subclass_with_meta__
    fields.update(yank_fields_from_attrs(base.__dict__, _as=Field))
  File "/app/virtualenv/lib/python3.8/site-packages/graphene/types/utils.py", line 31, in yank_fields_from_attrs
    field = get_field_as(value, _as)
  File "/app/virtualenv/lib/python3.8/site-packages/graphene/types/utils.py", line 21, in get_field_as
    return _as.mounted(value)
  File "/app/virtualenv/lib/python3.8/site-packages/graphene/types/mountedtype.py", line 15, in mounted
    return cls(
  File "/app/virtualenv/lib/python3.8/site-packages/graphene/types/field.py", line 103, in __init__
    self.args = to_arguments(args or OrderedDict(), extra_args)
  File "/app/virtualenv/lib/python3.8/site-packages/graphene/types/argument.py", line 80, in to_arguments
    extra_args = sorted(extra_args.items(), key=lambda f: f[1])
TypeError: '<' not supported between instances of 'EnumMeta' and 'Int'

Because this line does not work: subscriber_type=Episode

spacether avatar Mar 27 '20 00:03 spacether

A work around is to cast the enum as a graphene.Argument: subscriber_type=graphene.Argument(Episode)

class ListAvailableSubscriptionPlans(graphene.ObjectType):

    available_subscription_plans = graphene.List(
        graphene.NonNull(graphql.SubscriptionPlanObject),
        subscriber_id=graphene.Int(required=True),
        subscriber_type=graphene.Argument(Episode),
        target_currency=graphene.String(required=True),
    )

spacether avatar Mar 27 '20 00:03 spacether

This issue has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. Thank you for your contributions.

stale[bot] avatar Jun 25 '20 02:06 stale[bot]

not stale

iamareebjamal avatar Jul 07 '20 10:07 iamareebjamal

This issue has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. Thank you for your contributions.

stale[bot] avatar Oct 16 '20 18:10 stale[bot]

no

iamareebjamal avatar Oct 16 '20 18:10 iamareebjamal

You need to call Episode like with other GraphQL types.

subscriber_type=Episode()

chrisberks avatar Jul 09 '21 11:07 chrisberks