Beispiel #1
0
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
Beispiel #2
0
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)
Beispiel #3
0
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
Beispiel #4
0
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
Beispiel #5
0
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
Beispiel #6
0
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
Beispiel #7
0
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)
Beispiel #9
0
 def _get_or_make_field(name, filt):
     return convert_form_field(filt.field)