Exemplo n.º 1
0
def extend_schema_type_filter(schema_type, model):
    """Extend schema_type object to be able to filter on multiple levels of a query

    Args:
        schema_type (DjangoObjectType): GraphQL Object type for a given model
        model (Model): Django model

    Returns:
        schema_type (DjangoObjectType)
    """
    for field in model._meta.get_fields():
        # Check attribute is a ManyToOne field
        # OneToOneRel is a subclass of ManyToOneRel, but we don't want to treat is as a list
        if not isinstance(field, ManyToOneRel) or isinstance(
                field, OneToOneRel):
            continue
        child_schema_type = registry["graphql_types"].get(
            field.related_model._meta.label_lower)
        if child_schema_type:
            resolver_name = f"resolve_{field.name}"
            search_params = generate_list_search_parameters(child_schema_type)
            # Add OneToMany field to schema_type
            schema_type._meta.fields[field.name] = graphene.Field.mounted(
                graphene.List(child_schema_type, **search_params))
            # Add resolve function to schema_type
            setattr(
                schema_type, resolver_name,
                generate_filter_resolver(child_schema_type, resolver_name,
                                         field.name))
    return schema_type
Exemplo n.º 2
0
    def test_search_parameters(self):

        fields = SiteFilterSet.get_filters().keys()
        params = generate_list_search_parameters(self.schema)
        exclude_filters = ["type"]

        for field in fields:
            if field not in exclude_filters:
                self.assertIn(field, params.keys())
            else:
                self.assertNotIn(field, params.keys())