Skip to content
Snippets Groups Projects
Verified Commit 94d2c56d authored by Nik | Klampfradler's avatar Nik | Klampfradler
Browse files

Implement schema (query/mutation) discovery from apps

parent 782ed64a
No related branches found
No related tags found
2 merge requests!1047Draft: Resolve "[3.0] Introduce Graphene/GraphQL",!1045Introduce Vuetify and GraphQL
Pipeline #79489 failed
......@@ -4,6 +4,7 @@ from graphene_django.forms.mutation import DjangoModelFormMutation
from .forms import PersonForm
from .models import Person
from .util.core_helpers import get_app_module, get_app_packages
class PersonType(DjangoObjectType):
......@@ -34,4 +35,27 @@ class Mutation(graphene.ObjectType):
update_person = PersonMutation.Field()
schema = graphene.Schema(query=Query, mutation=Mutation)
def build_global_schema():
"""Build global GraphQL schema from all apps."""
query_bases = [Query]
mutation_bases = [Mutation]
for app in get_app_packages():
schema_mod = get_app_module(app, "schema")
if not schema_mod:
# The app does not define a schema
continue
if AppQuery := getattr(schema_mod, "Query", None):
query_bases.append(AppQuery)
if AppMutation := getattr(schema_mod, "Mutation", None):
mutation_bases.append(AppMutation)
# Define classes using all query/mutation classes as mixins
# cf. https://docs.graphene-python.org/projects/django/en/latest/schema/#adding-to-the-schema
GlobalQuery = type("GlobalQuery", tuple(query_bases), {})
GlobalMutation = type("GlobalMutation", tuple(mutation_bases), {})
return graphene.Schema(query=GlobalQuery, mutation=GlobalMutation)
schema = build_global_schema()
......@@ -72,13 +72,13 @@ def get_app_packages(only_official: bool = False) -> Sequence[str]:
return apps
def get_app_settings_module(app: str) -> Optional[ModuleType]:
def get_app_module(app: str, name: str) -> Optional[ModuleType]:
"""Get the settings module of an app."""
pkg = ".".join(app.split(".")[:-2])
mod_settings = None
while "." in pkg:
try:
return import_module(pkg + ".settings")
return import_module(f"{app}.{name}")
except ImportError:
# Import errors are non-fatal.
pkg = ".".join(pkg.split(".")[:-1])
......@@ -100,7 +100,7 @@ def merge_app_settings(
potentially malicious apps!
"""
for app in get_app_packages():
mod_settings = get_app_settings_module(app)
mod_settings = get_app_module(app, "settings")
if not mod_settings:
continue
......@@ -131,7 +131,7 @@ def get_app_settings_overrides() -> dict[str, Any]:
overrides = {}
for app in get_app_packages(True):
mod_settings = get_app_settings_module(app)
mod_settings = get_app_module(app, "settings")
if not mod_settings:
continue
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment