mutation.py 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. import re
  2. from ..types import Field, InputObjectType, String
  3. from ..types.mutation import Mutation
  4. from ..utils.thenables import maybe_thenable
  5. class ClientIDMutation(Mutation):
  6. class Meta:
  7. abstract = True
  8. @classmethod
  9. def __init_subclass_with_meta__(
  10. cls, output=None, input_fields=None, arguments=None, name=None, **options
  11. ):
  12. input_class = getattr(cls, "Input", None)
  13. base_name = re.sub("Payload$", "", name or cls.__name__)
  14. assert not output, "Can't specify any output"
  15. assert not arguments, "Can't specify any arguments"
  16. bases = (InputObjectType,)
  17. if input_class:
  18. bases += (input_class,)
  19. if not input_fields:
  20. input_fields = {}
  21. cls.Input = type(
  22. f"{base_name}Input",
  23. bases,
  24. dict(input_fields, client_mutation_id=String(name="clientMutationId")),
  25. )
  26. arguments = dict(
  27. input=cls.Input(required=True)
  28. # 'client_mutation_id': String(name='clientMutationId')
  29. )
  30. mutate_and_get_payload = getattr(cls, "mutate_and_get_payload", None)
  31. if cls.mutate and cls.mutate.__func__ == ClientIDMutation.mutate.__func__:
  32. assert mutate_and_get_payload, (
  33. f"{name or cls.__name__}.mutate_and_get_payload method is required"
  34. " in a ClientIDMutation."
  35. )
  36. if not name:
  37. name = f"{base_name}Payload"
  38. super(ClientIDMutation, cls).__init_subclass_with_meta__(
  39. output=None, arguments=arguments, name=name, **options
  40. )
  41. cls._meta.fields["client_mutation_id"] = Field(String, name="clientMutationId")
  42. @classmethod
  43. def mutate(cls, root, info, input):
  44. def on_resolve(payload):
  45. try:
  46. payload.client_mutation_id = input.get("client_mutation_id")
  47. except Exception:
  48. raise Exception(
  49. f"Cannot set client_mutation_id in the payload object {repr(payload)}"
  50. )
  51. return payload
  52. result = cls.mutate_and_get_payload(root, info, **input)
  53. return maybe_thenable(result, on_resolve)