def test_components(self): p = Filter(source='parent', form_field=forms.CharField()) f = Filter(source='child', form_field=forms.CharField()) assert f.components == [] f.parent = p assert f.components == ['child']
def test_source(self): f = Filter(source=None, form_field=forms.CharField()) f.name = 'bar' assert f.source == 'bar' assert Filter(source='foo', form_field=forms.CharField()).source == 'foo'
def test_get_spec(self): p = Filter(source='parent', form_field=forms.CharField()) f = Filter(source='child', form_field=forms.CharField()) f.parent = p assert f.get_spec(LookupConfig('key', 'value')) == FilterSpec(['child'], 'exact', 'value', False) assert f.get_spec(LookupConfig('key!', 'value')) == FilterSpec(['child'], 'exact', 'value', True) assert f.get_spec(LookupConfig( 'key', {'contains': 'value'})) == FilterSpec(['child'], 'contains', 'value', False) with pytest.raises(forms.ValidationError): assert f.get_spec(LookupConfig('key', {'foo': 'value'})) with pytest.raises(forms.ValidationError): assert f.get_spec( LookupConfig('key', { 'foo': 'value', 'happy': 'rainbows', }))
class BarFilterSet(FilterSet): id = Filter(form_field=forms.IntegerField(), is_default=True) other = Filter(source='stuff', form_field=forms.CharField(), default_lookup='contains') thing = Filter( form_field=forms.IntegerField(min_value=0, max_value=15))
class RestaurantFilterSet(FilterSet): pk = Filter(form_field=forms.IntegerField(min_value=0), is_default=True) place = PlaceFilterSet() serves_hot_dogs = Filter(form_field=forms.BooleanField( required=False)) serves_pizza = Filter(form_field=forms.BooleanField( required=False))
def test_clean_value(self): f = Filter(form_field=forms.IntegerField()) assert f.clean_value('5', 'exact') == 5 with pytest.raises(forms.ValidationError): f.clean_value('a', 'exact')
class PlaceFilterSet(ModelFilterSet): address = Filter(forms.IntegerField()) class Meta(object): model = Place allow_related = False allow_related_reverse = False
def filterset_factory(model, fields, virtual_fields=None): filters = {} if virtual_fields: for name, field in virtual_fields.items(): if field.widget == DataBaseLayerVirtualField.WIDGET_CHOICES.relation1n and 'count' in field.config \ and field.config['count']: filters[name] = Filter(form_field=forms.IntegerField()) meta = type(str('Meta'), (object,), {'model': model, 'fields': fields}) filterset = type(str('%sModelFilterSet' % model._meta.object_name), (GISModelFilterSet,), {'Meta': meta, **filters}) return filterset
def test_init(self): f = Filter( source='foo', form_field=forms.CharField(), lookups=['foo', 'bar'], default_lookup='foo', is_default=True, ) assert f.source == 'foo' assert isinstance(f.form_field, forms.CharField) assert f.lookups == ['foo', 'bar'] assert f.default_lookup == 'foo' assert f.is_default is True assert f.parent is None assert f.name is None
def create_filterset(model, definition, name=None): if name is None: name = model.__name__ + "FilterSet" Meta = type('Meta', (object, ), {"model": model, "fields": []}) attrs = {} for f in definition: if f.get("type") == "daterange": f['lookups'] = ["gte", "lte"] if f.get("rel") and not f.get("method"): try: filter = globals()[f["rel"] + "FilterSet"]() except KeyError: filter_class = create_rel_filterset(f["rel"]) filter = filter_class() else: ftype = f.get("type", "text") form_field = get_form_field_for_type(ftype) if f.get("options"): form_field._set_choices(f.get("options")) source = f.get("source", f["name"]) lookups = f.get("lookups", ["exact"]) default_lookup = f.get("default_lookup", lookups[0]) filter = Filter(source=source, form_field=form_field, lookups=lookups, default_lookup=default_lookup) attrs[f["name"]] = filter attrs["Meta"] = Meta attrs["definition"] = definition attrs["filter_backend_class"] = BetterDjangoFilterBackend return type(name, (ModelFilterSet, ), attrs)
class BarFilterSet(FilterSet): other = Filter( source="stuff", form_field=forms.CharField(), default_lookup="contains" ) thing = Filter(form_field=forms.IntegerField(min_value=0, max_value=15))
class FooFilterSet(FilterSet): field = Filter(form_field=forms.CharField(), is_default=True) bar = BarFilterSet()
class RestaurantFilterSet(ModelFilterSet): default_strict_mode = StrictMode.fail place_id = Filter(forms.IntegerField(min_value=0)) class Meta(object): model = Restaurant
class PlaceFilterSet(FilterSet): pk = Filter(form_field=forms.IntegerField(min_value=0), is_default=True) name = Filter(form_field=forms.CharField(max_length=50)) address = Filter(form_field=forms.CharField(max_length=80))
class FooFilterSet(FilterSet): field = Filter(form_field=forms.CharField()) bar = BarFilterSet()
def test_root(self): p = Filter(source='parent', form_field=forms.CharField()) f = Filter(source='child', form_field=forms.CharField()) f.parent = p assert f.root is p
def test_get_form_field(self): f = Filter(form_field=forms.CharField()) assert isinstance(f.get_form_field('exact'), forms.CharField) assert isinstance(f.get_form_field('in'), MultipleValuesField) assert isinstance(f.get_form_field('isnull'), forms.BooleanField)
def test_bind(self): f = Filter(form_field=forms.CharField()) f.bind('foo', 'parent') assert f.name == 'foo' assert f.parent == 'parent'
class WaiterFilterSet(FilterSet): pk = Filter(form_field=forms.IntegerField(min_value=0), is_default=True) restaurant = RestaurantFilterSet() name = Filter(form_field=forms.CharField(max_length=50))
class BarFilterSet(FilterSet): bar = Filter(form_field=forms.IntegerField()) foo = FooFilterSet()
class TestFilterSet(FilterSet): foo = Filter(form_field=forms.CharField())
class TestFilterSet(FilterSet): foo = Filter(form_field=forms.CharField(), is_default=True) bar = Filter(form_field=forms.CharField())