mirror of
				https://github.com/graphql-python/graphene-django.git
				synced 2025-10-31 16:07:36 +03:00 
			
		
		
		
	Check for filters defined on base filterset classes
This commit is contained in:
		
							parent
							
								
									59f4f134b5
								
							
						
					
					
						commit
						0425985dab
					
				|  | @ -818,3 +818,86 @@ def test_integer_field_filter_type(): | ||||||
|         } |         } | ||||||
|     """ |     """ | ||||||
|     ) |     ) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def test_filter_filterset_based_on_mixin(): | ||||||
|  |     class ArticleFilterMixin: | ||||||
|  | 
 | ||||||
|  |         @classmethod | ||||||
|  |         def get_filters(cls): | ||||||
|  |             filters = super().get_filters() | ||||||
|  |             filters.update({ | ||||||
|  |                 'viewer__email__in': django_filters.CharFilter( | ||||||
|  |                     method='filter_email_in', | ||||||
|  |                     field_name='reporter__email__in', | ||||||
|  |                 ), | ||||||
|  |             }) | ||||||
|  | 
 | ||||||
|  |             return filters | ||||||
|  | 
 | ||||||
|  |     class NewArticleFilter(ArticleFilterMixin, ArticleFilter): | ||||||
|  |         pass | ||||||
|  | 
 | ||||||
|  |     class NewReporterNode(DjangoObjectType): | ||||||
|  |         class Meta: | ||||||
|  |             model = Reporter | ||||||
|  |             interfaces = (Node,) | ||||||
|  | 
 | ||||||
|  |     class NewArticleFilterNode(DjangoObjectType): | ||||||
|  |         viewer = Field(NewReporterNode) | ||||||
|  | 
 | ||||||
|  |         class Meta: | ||||||
|  |             model = Article | ||||||
|  |             interfaces = (Node,) | ||||||
|  |             filterset_class = NewArticleFilter | ||||||
|  | 
 | ||||||
|  |         def resolve_viewer(self, info): | ||||||
|  |             return self.reporter | ||||||
|  | 
 | ||||||
|  |     class Query(ObjectType): | ||||||
|  |         all_articles = DjangoFilterConnectionField(NewArticleFilterNode) | ||||||
|  | 
 | ||||||
|  |     reporter = Reporter.objects.create( | ||||||
|  |         first_name="John", last_name="Doe", email="john@doe.com") | ||||||
|  | 
 | ||||||
|  |     article = Article.objects.create( | ||||||
|  |         headline="Hello", | ||||||
|  |         reporter=reporter, | ||||||
|  |         editor=reporter, | ||||||
|  |         pub_date=datetime.now(), | ||||||
|  |         pub_date_time=datetime.now()) | ||||||
|  | 
 | ||||||
|  |     schema = Schema(query=Query) | ||||||
|  | 
 | ||||||
|  |     query = """ | ||||||
|  |         query NodeFilteringQuery { | ||||||
|  |             allArticles { | ||||||
|  |                 edges { | ||||||
|  |                     node { | ||||||
|  |                         viewer { | ||||||
|  |                             email | ||||||
|  |                         } | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     """ | ||||||
|  | 
 | ||||||
|  |     expected = { | ||||||
|  |         "allArticles": { | ||||||
|  |             "edges": [ | ||||||
|  |                 { | ||||||
|  |                     "node": { | ||||||
|  |                         "viewer": { | ||||||
|  |                             "email": reporter.email, | ||||||
|  |                         } | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  |             ] | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     result = schema.execute(query) | ||||||
|  | 
 | ||||||
|  |     assert not result.errors | ||||||
|  |     assert result.data == expected | ||||||
|  |  | ||||||
|  | @ -13,21 +13,25 @@ def get_filtering_args_from_filterset(filterset_class, type): | ||||||
|     args = {} |     args = {} | ||||||
|     model = filterset_class._meta.model |     model = filterset_class._meta.model | ||||||
|     for name, filter_field in six.iteritems(filterset_class.base_filters): |     for name, filter_field in six.iteritems(filterset_class.base_filters): | ||||||
|  |         form_field = None | ||||||
|  | 
 | ||||||
|         if name in filterset_class.declared_filters: |         if name in filterset_class.declared_filters: | ||||||
|             form_field = filter_field.field |             form_field = filter_field.field | ||||||
|         else: |         else: | ||||||
|             field_name = name.split("__", 1)[0] |             field_name = name.split("__", 1)[0] | ||||||
|             model_field = model._meta.get_field(field_name) |  | ||||||
| 
 | 
 | ||||||
|             if hasattr(model_field, "formfield"): |             if hasattr(model, field_name): | ||||||
|                 form_field = model_field.formfield( |                 model_field = model._meta.get_field(field_name) | ||||||
|                     required=filter_field.extra.get("required", False) |  | ||||||
|                 ) |  | ||||||
| 
 | 
 | ||||||
|             # Fallback to field defined on filter if we can't get it from the |                 if hasattr(model_field, "formfield"): | ||||||
|             # model field |                     form_field = model_field.formfield( | ||||||
|             if not form_field: |                         required=filter_field.extra.get("required", False) | ||||||
|                 form_field = filter_field.field |                     ) | ||||||
|  | 
 | ||||||
|  |         # Fallback to field defined on filter if we can't get it from the | ||||||
|  |         # model field | ||||||
|  |         if not form_field: | ||||||
|  |             form_field = filter_field.field | ||||||
| 
 | 
 | ||||||
|         field_type = convert_form_field(form_field).Argument() |         field_type = convert_form_field(form_field).Argument() | ||||||
|         field_type.description = filter_field.label |         field_type.description = filter_field.label | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user