def test_get_fields_two_queries(self): input = """ query { projects { name } } query { locales { name } } """ query1, query2 = parse_graphql_query(input) info1 = MockResolveInfo(query1) self.assertEqual(get_fields(info1), [ 'projects', 'projects.name', ]) info2 = MockResolveInfo(query2) self.assertEqual(get_fields(info2), [ 'locales', 'locales.name', ])
def test_get_fields_cyclic(): input = """ query { projects { name slug localizations { locale { localizations { totalStrings } } } } } """ (query, ) = parse_graphql_query(input) info = MockResolveInfo(query) assert get_fields(info) == [ "projects", "projects.name", "projects.slug", "projects.localizations", "projects.localizations.locale", "projects.localizations.locale.localizations", "projects.localizations.locale.localizations.totalStrings", ]
def test_get_fields_fragment(): input = """ query { projects { name slug ...stats } } fragment stats on Project { totalStrings missingStrings } """ query, frag = parse_graphql_query(input) info = MockResolveInfo(query, {"stats": frag}) assert get_fields(info) == [ "projects", "projects.name", "projects.slug", "projects.totalStrings", "projects.missingStrings", ]
def test_get_fields_cyclic_in_fragment(self): input = """ query { projects { name slug localizations { locale { ...localizations } } } } fragment localizations on Locale { localizations { totalStrings missingStrings } } """ query, frag = parse_graphql_query(input) info = MockResolveInfo(query, {'localizations': frag}) self.assertEqual(get_fields(info), [ 'projects', 'projects.name', 'projects.slug', 'projects.localizations', 'projects.localizations.locale', 'projects.localizations.locale.localizations', 'projects.localizations.locale.localizations.totalStrings', 'projects.localizations.locale.localizations.missingStrings', ])
def test_get_fields_cyclic_in_fragment(): input = """ query { projects { name slug localizations { locale { ...localizations } } } } fragment localizations on Locale { localizations { totalStrings missingStrings } } """ query, frag = parse_graphql_query(input) info = MockResolveInfo(query, {"localizations": frag}) assert get_fields(info) == [ "projects", "projects.name", "projects.slug", "projects.localizations", "projects.localizations.locale", "projects.localizations.locale.localizations", "projects.localizations.locale.localizations.totalStrings", "projects.localizations.locale.localizations.missingStrings", ]
def resolve_projects( obj, info, include_disabled, include_system): #obj, info, disabled여부(프로젝트 실행 중지 여부), 비활성 시스템 여부 fields = get_fields( info) #api/util.py의 get_fields 메서드: 필드명 구성 목록을 반환하는 메서드 # ProjectModel.objects = ProjectQuerySet.as_manager() # ProjectModel.objects.visible_for(info.context.user) = ProjectQuerySet.visible_for(self, user) 메서드 실행 projects = ProjectModel.objects.visible_for(info.context.user) records = projects.filter(disabled=False, system_project=False) if include_disabled: # |= : a|=b일 경우 a와 b의 비트를 or연산한 후 결과를 a에 할당 records |= projects.filter( disabled=True) # include_disabled가 True일 경우 records도 True if include_system: records |= projects.filter(system_project=True) if "projects.localizations" in fields: records = records.prefetch_related("project_locale__locale") if "projects.localizations.locale.localizations" in fields: raise Exception("Cyclic queries are forbidden") return records.distinct()
def test_get_fields_cyclic(self): input = """ query { projects { name slug localizations { locale { localizations { totalStrings } } } } } """ query, = parse_graphql_query(input) info = MockResolveInfo(query) self.assertEqual(get_fields(info), [ 'projects', 'projects.name', 'projects.slug', 'projects.localizations', 'projects.localizations.locale', 'projects.localizations.locale.localizations', 'projects.localizations.locale.localizations.totalStrings', ])
def resolve_locale(obj, info, code): qs = LocaleModel.objects fields = get_fields(info) if 'locale.localizations' in fields: qs = qs.prefetch_related('project_locale__project') if 'locale.localizations.project.localizations' in fields: raise Exception('Cyclic queries are forbidden') return qs.get(code=code)
def resolve_locales(obj, args, context, info): qs = LocaleModel.objects fields = get_fields(info) if 'locales.localizations' in fields: qs = qs.prefetch_related('project_locale__project') if 'locales.localizations.project.localizations' in fields: raise Exception('Cyclic queries are forbidden') return qs.all()
def resolve_project(obj, info, slug): qs = ProjectModel.objects fields = get_fields(info) if 'project.localizations' in fields: qs = qs.prefetch_related('project_locale__locale') if 'project.localizations.locale.localizations' in fields: raise Exception('Cyclic queries are forbidden') return qs.get(slug=slug)
def resolve_locales(obj, info): qs = LocaleModel.objects fields = get_fields(info) if "locales.localizations" in fields: qs = qs.prefetch_related("project_locale__project") if "locales.localizations.project.localizations" in fields: raise Exception("Cyclic queries are forbidden") return qs.all()
def resolve_project(obj, args, context, info): qs = ProjectModel.objects fields = get_fields(info) if 'project.localizations' in fields: qs = qs.prefetch_related('project_locale__locale') if 'project.localizations.locale.localizations' in fields: raise Exception('Cyclic queries are forbidden') return qs.get(slug=args['slug'])
def test_get_fields_one(self): input = """ query { projects { name } } """ (query, ) = parse_graphql_query(input) info = MockResolveInfo(query) self.assertEqual(get_fields(info), ["projects", "projects.name"])
def test_get_fields_two_queries(): input = """ query { projects { name } } query { locales { name } } """ query1, query2 = parse_graphql_query(input) info1 = MockResolveInfo(query1) assert get_fields(info1) == ["projects", "projects.name"] info2 = MockResolveInfo(query2) assert get_fields(info2) == ["locales", "locales.name"]
def test_get_fields_one(): input = """ query { projects { name } } """ (query, ) = parse_graphql_query(input) info = MockResolveInfo(query) assert get_fields(info) == ["projects", "projects.name"]
def resolve_project(obj, info, slug): qs = ProjectModel.objects fields = get_fields(info) if 'project.localizations' in fields: qs = qs.prefetch_related('project_locale__locale') if 'project.tags' in fields: qs = qs.prefetch_related('tag_set') if 'project.localizations.locale.localizations' in fields: raise Exception('Cyclic queries are forbidden') return qs.get(slug=slug)
def resolve_projects(obj, info, include_disabled): qs = ProjectModel.objects fields = get_fields(info) if 'projects.localizations' in fields: qs = qs.prefetch_related('project_locale__locale') if 'projects.localizations.locale.localizations' in fields: raise Exception('Cyclic queries are forbidden') if include_disabled: return qs.all() return qs.filter(disabled=False)
def resolve_project(obj, info, slug): qs = ProjectModel.objects fields = get_fields(info) if "project.localizations" in fields: qs = qs.prefetch_related("project_locale__locale") if "project.tags" in fields: qs = qs.prefetch_related("tag_set") if "project.localizations.locale.localizations" in fields: raise Exception("Cyclic queries are forbidden") return qs.get(slug=slug)
def test_get_fields_many(self): input = """ query { projects { name slug } } """ query, = parse_graphql_query(input) info = MockResolveInfo(query) self.assertEqual(get_fields(info), [ 'projects', 'projects.name', 'projects.slug', ])
def resolve_projects(obj, info, include_disabled, include_system): qs = ProjectModel.objects fields = get_fields(info) if "projects.localizations" in fields: qs = qs.prefetch_related("project_locale__locale") if "projects.localizations.locale.localizations" in fields: raise Exception("Cyclic queries are forbidden") records = qs.filter(disabled=False, system_project=False) if include_disabled: records = records | qs.filter(disabled=True) if include_system: records = records | qs.filter(system_project=True) return records.distinct()
def test_get_fields_two_fields(self): input = """ query { projects { name } locales { name } } """ query, = parse_graphql_query(input) info = MockResolveInfo(query) self.assertEqual(get_fields(info), [ 'projects', 'projects.name', 'locales', 'locales.name', ])
def test_get_fields_cyclic_with_fragment(self): input = """ query { projects { name slug localizations { locale { localizations { ...stats } } } } } fragment stats on ProjectLocale { totalStrings missingStrings } """ query, frag = parse_graphql_query(input) info = MockResolveInfo(query, {"stats": frag}) self.assertEqual( get_fields(info), [ "projects", "projects.name", "projects.slug", "projects.localizations", "projects.localizations.locale", "projects.localizations.locale.localizations", "projects.localizations.locale.localizations.totalStrings", "projects.localizations.locale.localizations.missingStrings", ], )
def test_get_fields_fragment(self): input = """ query { projects { name slug ...stats } } fragment stats on Project { totalStrings missingStrings } """ query, frag = parse_graphql_query(input) info = MockResolveInfo(query, {'stats': frag}) self.assertEqual(get_fields(info), [ 'projects', 'projects.name', 'projects.slug', 'projects.totalStrings', 'projects.missingStrings' ])