def __init_subclass_with_meta__(cls, form_class=None, session_key='', _meta=None, **options): if not _meta: _meta = SessionObjectTypeOptions(cls) assert session_key, f'{cls.__name__} must define Meta.session_key.' _meta.session_key = session_key assert form_class is not None, f'{cls.__name__} must define Meta.form_class.' _meta.form_class = form_class form = form_class() fields = yank_fields_from_attrs(fields_for_form(form, [], []), _as=Field) if hasattr(form, 'extra_graphql_output_fields'): fields.update( yank_fields_from_attrs(form.extra_graphql_output_fields, _as=Field)) if _meta.fields: _meta.fields.update(fields) else: _meta.fields = fields super().__init_subclass_with_meta__(_meta=_meta, **options)
def __init_subclass_with_meta__( cls, form_class: Type[forms.Form] = forms.Form, formset_classes: Optional[FormsetClasses] = None, only_fields=(), exclude_fields=(), **options ): form = form_class() input_fields = fields_for_form(form, only_fields, exclude_fields) formset_classes = formset_classes or {} for (formset_name, formset_class) in formset_classes.items(): formset_form = get_formset_form(formset_class()) formset_input_fields = fields_for_form(formset_form, only_fields, exclude_fields) formset_form_type = type( f"{to_capitalized_camel_case(formset_name)}{formset_class.__name__}Input", (graphene.InputObjectType,), yank_fields_from_attrs(formset_input_fields, _as=graphene.InputField) ) if formset_name in input_fields: raise AssertionError(f'multiple definitions for "{formset_name}" exist') input_field_for_form = yank_fields_from_attrs({ formset_name: graphene.List( graphene.NonNull(formset_form_type), required=True ) }) input_fields.update(input_field_for_form) # The original Graphene-Django implementation set the output fields # to the same value as the input fields. We don't need this, and it # bloats our schema, so we'll ignore it. output_fields = {} # type: ignore _meta = DjangoFormMutationOptions(cls) _meta.form_class = form_class _meta.formset_classes = formset_classes _meta.exclude_fields = exclude_fields _meta.fields = yank_fields_from_attrs(output_fields, _as=graphene.Field) input_fields = yank_fields_from_attrs(input_fields, _as=graphene.InputField) super().__init_subclass_with_meta__( _meta=_meta, input_fields=input_fields, **options ) cls._input_type_to_mut_mapping[cls.Input.__name__] = cls
def populate_meta_options_and_get_input_fields( cls, _meta: DjangoFormOptionsMixin, form_class: Type[forms.Form], formset_classes: Optional[FormsetClasses] = None, only_fields=(), exclude_fields=(), ): form = form_class() input_fields = fields_for_form(form, only_fields, exclude_fields) formset_classes = formset_classes or {} for (formset_name, formset_class) in formset_classes.items(): formset_form = get_formset_form(formset_class()) formset_input_fields = fields_for_form(formset_form, only_fields, exclude_fields) type_key = (formset_form.__class__, tuple(only_fields), tuple(exclude_fields)) formset_form_type = cls._register_input_type( type_key, type( f"{to_capitalized_camel_case(formset_name)}{formset_class.__name__}Input", (graphene.InputObjectType, ), yank_fields_from_attrs(formset_input_fields, _as=graphene.InputField), ), ) if formset_name in input_fields: raise AssertionError( f'multiple definitions for "{formset_name}" exist') input_field_for_form = yank_fields_from_attrs({ formset_name: graphene.List(graphene.NonNull(formset_form_type), required=True) }) input_fields.update(input_field_for_form) _meta.form_class = form_class _meta.formset_classes = formset_classes _meta.exclude_fields = exclude_fields input_fields = yank_fields_from_attrs(input_fields, _as=graphene.InputField) return input_fields
class OnboardingStep1Info(graphene.ObjectType): locals().update(fields_for_form(forms.OnboardingStep1Form(), [], [])) address_verified = graphene.Boolean( required=True, description=( "Whether the user's address was verified by a geocoder. " "If False, it is because the geocoder service was unavailable, " "not because the address is invalid." ) )
def __init_subclass_with_meta__(cls, form_class=None, only_fields=(), exclude_fields=(), **options): if not form_class: raise Exception("form_class is required for RelayFormMutation") form = form_class() input_fields = fields_for_form(form, only_fields, exclude_fields) _meta = DjangoFormMutationOptions(cls) _meta.form_class = form_class input_fields = yank_fields_from_attrs(input_fields, _as=graphene.InputField) super().__init_subclass_with_meta__(_meta=_meta, input_fields=input_fields, **options)
class OnboardingStep3Info(graphene.ObjectType): locals().update(fields_for_form(forms.OnboardingStep3Form(), [], []))