Skip to content

Commit

Permalink
Implement filter expressions for startswith, istartswith, endswith, i…
Browse files Browse the repository at this point in the history
…endswith
  • Loading branch information
gasman committed Nov 15, 2018
1 parent 437b846 commit 469c8a4
Show file tree
Hide file tree
Showing 2 changed files with 50 additions and 0 deletions.
28 changes: 28 additions & 0 deletions modelcluster/queryset.py
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,30 @@ def test_in(model, attribute_name, value_list):
return lambda obj: getattr(obj, attribute_name) in match_values


def test_startswith(model, attribute_name, value):
field = model._meta.get_field(attribute_name)
match_value = field.to_python(value)
return lambda obj: getattr(obj, attribute_name).startswith(match_value)


def test_istartswith(model, attribute_name, value):
field = model._meta.get_field(attribute_name)
match_value = field.to_python(value).upper()
return lambda obj: getattr(obj, attribute_name).upper().startswith(match_value)


def test_endswith(model, attribute_name, value):
field = model._meta.get_field(attribute_name)
match_value = field.to_python(value)
return lambda obj: getattr(obj, attribute_name).endswith(match_value)


def test_iendswith(model, attribute_name, value):
field = model._meta.get_field(attribute_name)
match_value = field.to_python(value).upper()
return lambda obj: getattr(obj, attribute_name).upper().endswith(match_value)


FILTER_EXPRESSION_TOKENS = {
'exact': test_exact,
'iexact': test_iexact,
Expand All @@ -87,6 +111,10 @@ def test_in(model, attribute_name, value_list):
'gt': test_gt,
'gte': test_gte,
'in': test_in,
'startswith': test_startswith,
'istartswith': test_istartswith,
'endswith': test_endswith,
'iendswith': test_iendswith,
}


Expand Down
22 changes: 22 additions & 0 deletions tests/tests/test_cluster.py
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,15 @@ def test_can_create_cluster(self):
self.assertEqual(1, beatles.members.filter(name__in=['Paul McCartney', 'Linda McCartney']).count())
self.assertEqual('Paul McCartney', beatles.members.filter(name__in=['Paul McCartney', 'Linda McCartney'])[0].name)

self.assertEqual(1, beatles.members.filter(name__startswith='Paul').count())
self.assertEqual('Paul McCartney', beatles.members.filter(name__startswith='Paul')[0].name)
self.assertEqual(1, beatles.members.filter(name__istartswith='pauL').count())
self.assertEqual('Paul McCartney', beatles.members.filter(name__istartswith='pauL')[0].name)
self.assertEqual(1, beatles.members.filter(name__endswith='ney').count())
self.assertEqual('Paul McCartney', beatles.members.filter(name__endswith='ney')[0].name)
self.assertEqual(1, beatles.members.filter(name__iendswith='Ney').count())
self.assertEqual('Paul McCartney', beatles.members.filter(name__iendswith='Ney')[0].name)

self.assertEqual('Paul McCartney', beatles.members.get(name='Paul McCartney').name)
self.assertEqual('Paul McCartney', beatles.members.get(name__exact='Paul McCartney').name)
self.assertEqual('Paul McCartney', beatles.members.get(name__iexact='paul mccartNEY').name)
Expand All @@ -73,6 +82,10 @@ def test_can_create_cluster(self):
self.assertEqual('Paul McCartney', beatles.members.get(name__contains='Cart').name)
self.assertEqual('Paul McCartney', beatles.members.get(name__icontains='carT').name)
self.assertEqual('Paul McCartney', beatles.members.get(name__in=['Paul McCartney', 'Linda McCartney']).name)
self.assertEqual('Paul McCartney', beatles.members.get(name__startswith='Paul').name)
self.assertEqual('Paul McCartney', beatles.members.get(name__istartswith='pauL').name)
self.assertEqual('Paul McCartney', beatles.members.get(name__endswith='ney').name)
self.assertEqual('Paul McCartney', beatles.members.get(name__iendswith='Ney').name)

self.assertRaises(BandMember.DoesNotExist, lambda: beatles.members.get(name='Reginald Dwight'))
self.assertRaises(BandMember.MultipleObjectsReturned, lambda: beatles.members.get())
Expand Down Expand Up @@ -301,6 +314,15 @@ def test_queryset_exclude_filtering(self):
self.assertEqual(1, beatles.members.exclude(name__in=['Paul McCartney', 'Linda McCartney']).count())
self.assertEqual('John Lennon', beatles.members.exclude(name__in=['Paul McCartney', 'Linda McCartney'])[0].name)

self.assertEqual(1, beatles.members.exclude(name__startswith='Paul').count())
self.assertEqual('John Lennon', beatles.members.exclude(name__startswith='Paul').first().name)
self.assertEqual(1, beatles.members.exclude(name__istartswith='pauL').count())
self.assertEqual('John Lennon', beatles.members.exclude(name__istartswith='pauL').first().name)
self.assertEqual(1, beatles.members.exclude(name__endswith='ney').count())
self.assertEqual('John Lennon', beatles.members.exclude(name__endswith='ney').first().name)
self.assertEqual(1, beatles.members.exclude(name__iendswith='Ney').count())
self.assertEqual('John Lennon', beatles.members.exclude(name__iendswith='Ney').first().name)

def test_prefetch_related(self):
Band.objects.create(name='The Beatles', members=[
BandMember(id=1, name='John Lennon'),
Expand Down

0 comments on commit 469c8a4

Please sign in to comment.