@@ -766,3 +766,97 @@ def test_inset_char_filter(self):
766766 self .assertEqual (len (f ), 2 )
767767 self .assertIn (p1 , f )
768768 self .assertIn (p2 , f )
769+
770+
771+ class FilterSetExclutionTests (TestCase ):
772+
773+ if django .VERSION >= (1 , 8 ):
774+ @classmethod
775+ def setUpTestData (cls ):
776+ cls .generateTestData ()
777+
778+ else :
779+ def setUp (self ):
780+ self .generateTestData ()
781+
782+ @classmethod
783+ def generateTestData (cls ):
784+ t1 = Tag .objects .create (name = 'Tag 1' )
785+ t2 = Tag .objects .create (name = 'Tag 2' )
786+ t3 = Tag .objects .create (name = 'Something else entirely' )
787+
788+ p1 = BlogPost .objects .create (title = 'Post 1' , content = 'content 1' )
789+ p2 = BlogPost .objects .create (title = 'Post 2' , content = 'content 2' )
790+
791+ p1 .tags = [t1 , t2 ]
792+ p2 .tags = [t3 ]
793+
794+ def test_exclude_property (self ):
795+ """
796+ Ensure that the filter is set to exclude
797+ """
798+ GET = {
799+ 'name__contains!' : 'Tag' ,
800+ }
801+
802+ filterset = TagFilter (GET , queryset = Tag .objects .all ())
803+ requested_filters = filterset .get_filters ()
804+
805+ self .assertTrue (requested_filters ['name__contains!' ].exclude )
806+
807+ def test_filter_and_exclude (self ):
808+ """
809+ Ensure that both the filter and exclusion filter are available
810+ """
811+ GET = {
812+ 'name__contains' : 'Tag' ,
813+ 'name__contains!' : 'Tag' ,
814+ }
815+
816+ filterset = TagFilter (GET , queryset = Tag .objects .all ())
817+ requested_filters = filterset .get_filters ()
818+
819+ self .assertFalse (requested_filters ['name__contains' ].exclude )
820+ self .assertTrue (requested_filters ['name__contains!' ].exclude )
821+
822+ def test_related_exclude (self ):
823+ GET = {
824+ 'tags__name__contains!' : 'Tag' ,
825+ }
826+
827+ filterset = BlogPostFilter (GET , queryset = BlogPost .objects .all ())
828+ requested_filters = filterset .get_filters ()
829+
830+ self .assertTrue (requested_filters ['tags__name__contains!' ].exclude )
831+
832+ def test_exclusion_results (self ):
833+ GET = {
834+ 'name__contains!' : 'Tag' ,
835+ }
836+
837+ filterset = TagFilter (GET , queryset = Tag .objects .all ())
838+ results = [r .name for r in filterset ]
839+ self .assertEqual (len (results ), 1 )
840+ self .assertEqual (results [0 ], 'Something else entirely' )
841+
842+ def test_filter_and_exclusion_results (self ):
843+ GET = {
844+ 'name__contains' : 'Tag' ,
845+ 'name__contains!' : '2' ,
846+ }
847+
848+ filterset = TagFilter (GET , queryset = Tag .objects .all ())
849+ results = [r .name for r in filterset ]
850+ self .assertEqual (len (results ), 1 )
851+ self .assertEqual (results [0 ], 'Tag 1' )
852+
853+ def test_related_exclusion_results (self ):
854+ GET = {
855+ 'tags__name__contains!' : 'Tag' ,
856+ }
857+
858+ filterset = BlogPostFilter (GET , queryset = BlogPost .objects .all ())
859+ results = [r .title for r in filterset ]
860+
861+ self .assertEqual (len (results ), 1 )
862+ self .assertEqual (results [0 ], 'Post 2' )
0 commit comments