@@ -324,6 +324,84 @@ def test_nonexistent_related_field(self):
324324 self .assertEqual (len (list (f )), 4 )
325325
326326
327+ class GetFilterNameTests (TestCase ):
328+
329+ def test_regular_filter (self ):
330+ name = UserFilter .get_filter_name ('email' )
331+ self .assertEqual ('email' , name )
332+
333+ def test_exclusion_filter (self ):
334+ name = UserFilter .get_filter_name ('email!' )
335+ self .assertEqual ('email' , name )
336+
337+ def test_non_filter (self ):
338+ name = UserFilter .get_filter_name ('foobar' )
339+ self .assertEqual (None , name )
340+
341+ def test_related_filter (self ):
342+ # 'exact' matches
343+ name = NoteFilterWithRelated .get_filter_name ('author' )
344+ self .assertEqual ('author' , name )
345+
346+ # related attribute filters
347+ name = NoteFilterWithRelated .get_filter_name ('author__email' )
348+ self .assertEqual ('author' , name )
349+
350+ # non-existent related filters should match, as it's the responsibility
351+ # of the related filterset to handle non-existent filters
352+ name = NoteFilterWithRelated .get_filter_name ('author__foobar' )
353+ self .assertEqual ('author' , name )
354+
355+ def test_twice_removed_related_filter (self ):
356+ class PostFilterWithDirectAuthor (PostFilter ):
357+ note__author = filters .RelatedFilter (UserFilter )
358+ note = filters .RelatedFilter (NoteFilterWithAll )
359+
360+ class Meta :
361+ model = Post
362+
363+ name = PostFilterWithDirectAuthor .get_filter_name ('note__title' )
364+ self .assertEqual ('note' , name )
365+
366+ # 'exact' matches, preference more specific filter name, as less specific
367+ # filter may not have related access.
368+ name = PostFilterWithDirectAuthor .get_filter_name ('note__author' )
369+ self .assertEqual ('note__author' , name )
370+
371+ # related attribute filters
372+ name = PostFilterWithDirectAuthor .get_filter_name ('note__author__email' )
373+ self .assertEqual ('note__author' , name )
374+
375+ # non-existent related filters should match, as it's the responsibility
376+ # of the related filterset to handle non-existent filters
377+ name = PostFilterWithDirectAuthor .get_filter_name ('note__author__foobar' )
378+ self .assertEqual ('note__author' , name )
379+
380+ def test_name_hiding (self ):
381+ class PostFilterWithDirectAuthor (PostFilter ):
382+ note__author = filters .RelatedFilter (UserFilter )
383+ note = filters .RelatedFilter (NoteFilterWithAll )
384+ note2 = filters .RelatedFilter (NoteFilterWithAll )
385+
386+ class Meta :
387+ model = Post
388+
389+ name = PostFilterWithDirectAuthor .get_filter_name ('note__author' )
390+ self .assertEqual ('note__author' , name )
391+
392+ name = PostFilterWithDirectAuthor .get_filter_name ('note__title' )
393+ self .assertEqual ('note' , name )
394+
395+ name = PostFilterWithDirectAuthor .get_filter_name ('note' )
396+ self .assertEqual ('note' , name )
397+
398+ name = PostFilterWithDirectAuthor .get_filter_name ('note2' )
399+ self .assertEqual ('note2' , name )
400+
401+ name = PostFilterWithDirectAuthor .get_filter_name ('note2__author' )
402+ self .assertEqual ('note2' , name )
403+
404+
327405class FilterSubsetTests (TestCase ):
328406
329407 def test_get_subset (self ):
0 commit comments