def get_filtering_args_from_filterset(filterset_class, type): """ Inspect a FilterSet and produce the arguments to pass to a Graphene Field. These arguments will be available to filter against in the GraphQL """ from graphene_django.forms.converter import convert_form_field import six from django_filters.utils import get_model_field args = {} model = filterset_class._meta.model for name, filter_field in six.iteritems(filterset_class.base_filters): form_field = None if name in filterset_class.declared_filters: form_field = filter_field.field else: model_field = get_model_field(model, filter_field.field_name) filter_type = filter_field.lookup_expr if filter_type != "isnull" and hasattr(model_field, "formfield"): form_field = model_field.formfield( required=filter_field.extra.get("required", False)) # Fallback to field defined on filter if we can't get it from the # model field if not form_field: form_field = filter_field.field field_type = convert_form_field(form_field).Argument() field_type.description = filter_field.label args[name] = field_type return args
def input_from_django_form(name, Form, optional_fields=None): fields = {i: convert_form_field(j) for i, j in Form.base_fields.items()} if optional_fields is None: optional_fields = {} for (field_name, field_value) in optional_fields.items(): fields[field_name] = field_value return type(str(name), (graphene.InputObjectType, ), fields)
def fields_for_form(form, model_fields): fields = OrderedDict() for name, field in form.fields.items(): if model_fields != ALL_FIELDS and name not in model_fields: continue fields[name] = convert_form_field(field) return fields
def get_filtering_args_from_non_model_filterset(filterset_class): from graphene_django.forms.converter import convert_form_field args = {} for name, filter_field in filterset_class.declared_filters.items(): form_field = filter_field.field field_type = convert_form_field(form_field).Argument() field_type.description = filter_field.label args[name] = field_type return args
def fields_for_form(form, only_fields, exclude_fields): fields = OrderedDict() for name, field in form.fields.items(): is_not_in_only = only_fields and name not in only_fields is_excluded = name in exclude_fields if is_not_in_only or is_excluded: continue fields[name] = convert_form_field(field) return fields
def get_filtering_args_from_filterset(filterset_class, type, obvious_filters=[]): """ Original: - https://github.com/graphql-python/graphene-django/blob/master/graphene_django/filter/utils.py#L7 - filters not in 'declared_filters' are defined by Graphene-Django for model fields `formfield`. obivius_filters: - Force to use field class defined in filters. """ args = {} model = filterset_class._meta.model for name, filter_field in six.iteritems(filterset_class.base_filters): form_field = None if name in filterset_class.declared_filters: form_field = filter_field.field elif filter_field.__class__ in obvious_filters: form_field = filter_field.field else: model_field = get_model_field(model, filter_field.field_name) filter_type = filter_field.lookup_expr if filter_type != "isnull" and hasattr(model_field, "formfield"): form_field = model_field.formfield( required=filter_field.extra.get("required", False)) # Fallback to field defined on filter if we can't get it from the # model field if not form_field: form_field = filter_field.field field_type = convert_form_field(form_field).Argument() field_type.description = filter_field.label # For RangeFilter, duplicate filter args for suffixes if isinstance(filter_field, RangeFilter) and hasattr( filter_field.field, "widget"): suffixes = getattr(filter_field.field.widget, "suffixes", []) for s in suffixes: if s: args[f"{name}_{s}"] = field_type else: args[name] = field_type return args
def get_filtering_input_from_filterset(filterset_class, node_type): """ Inspect a FilterSet and produce the arguments to pass to a Graphene Field. These arguments will be available to filter against in the GraphQL """ from graphene_django.forms.converter import convert_form_field args = {} for name, filter_field in six.iteritems(filterset_class.base_filters): field_type = convert_form_field(filter_field.field) field_type.description = filter_field.label args[name] = field_type return { 'filter': Argument(type(f'{node_type}FilterInput', (InputObjectType, ), args)) }
def fields_for_form(form, only_fields, exclude_fields): fields = OrderedDict() file_fields = [] for name, field in form.fields.items(): is_not_in_only = only_fields and name not in only_fields is_excluded = ( name in exclude_fields # or # name in already_created_fields ) if is_not_in_only or is_excluded: continue if isinstance(field, FileField): file_fields.append(name) fields[name] = convert_form_field(field) return (fields, file_fields)
def _get_or_make_field(name, filt): return convert_form_field(filt.field)