diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 50eb362cd2e9c0e79882d923b3386fd680b5338c..1e911c7b84e771bbfe7c7d886519d551262da477 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -63,6 +63,7 @@ Fixed * 2FA via messages or phone calls didn't work. * [Dev] Site reference on extensible models can no longer cause name clashes because of its related name. +* GraphQL mutations did not return errors in case of exceptions. Removed ~~~~~~~ diff --git a/aleksis/core/frontend/components/calendar_feeds/Birthdays2.vue b/aleksis/core/frontend/components/calendar_feeds/Birthdays2.vue new file mode 100644 index 0000000000000000000000000000000000000000..d99b5466c485c7774dd173bcd5f4d986e8f38558 --- /dev/null +++ b/aleksis/core/frontend/components/calendar_feeds/Birthdays2.vue @@ -0,0 +1,47 @@ +<template> + <v-menu + v-model="model" + :close-on-content-click="false" + :activator="selectedElement" + offset-x + > + <v-card color="grey lighten-4" min-width="350px" flat> + <v-toolbar :color="selectedEvent.color" dark> + <v-toolbar-title>{{ selectedEvent.name }}</v-toolbar-title> + <v-spacer></v-spacer> + <v-btn icon @click="model = false"> + <v-icon>mdi-close</v-icon> + </v-btn> + </v-toolbar> + <v-card-text> + <span><v-icon>mdi-cake</v-icon>{{ selectedEvent.start }}</span> + <span><v-icon>mdi-cake-layered</v-icon>{{ selectedEvent.start }}</span> + </v-card-text> + </v-card> + </v-menu> +</template> + +<script> +export default { + name: "Birthdays2", + props: { + selectedElement: { + required: true, + }, + selectedEvent: { + required: true, + }, + value: { type: Boolean, required: true }, + }, + computed: { + model: { + get() { + return this.value; + }, + set(value) { + this.$emit("input", value); + }, + }, + }, +}; +</script> diff --git a/aleksis/core/settings.py b/aleksis/core/settings.py index c12ae3371376a0836bdd9898753e7f8d28317daa..63f51b137a21baa17ec83e71f088e453e4d0da01 100644 --- a/aleksis/core/settings.py +++ b/aleksis/core/settings.py @@ -433,6 +433,7 @@ REST_FRAMEWORK = { # Configuration for GraphQL framework GRAPHENE = { "SCHEMA": "aleksis.core.schema.schema", + "MIDDLEWARE": ["graphene_django.debug.middleware.DjangoDebugMiddleware"], } # LDAP config diff --git a/aleksis/core/urls.py b/aleksis/core/urls.py index f5e5899063678abc338ac971d1df3f55db3d0430..47f3cf259a4228e7e0c718bd39fbd169826e2ed3 100644 --- a/aleksis/core/urls.py +++ b/aleksis/core/urls.py @@ -26,7 +26,7 @@ urlpatterns = [ path("sw.js", views.ServiceWorkerView.as_view(), name="service_worker"), path(settings.MEDIA_URL.removeprefix("/"), include("titofisto.urls")), path("__icons__/", include("dj_iconify.urls")), - path("graphql/", csrf_exempt(GraphQLView.as_view(graphiql=True)), name="graphql"), + path("graphql/", csrf_exempt(views.GQLView.as_view(graphiql=True)), name="graphql"), path("logo", force_maintenance_mode_off(views.LogoView.as_view()), name="logo"), path( ".well-known/openid-configuration/", diff --git a/aleksis/core/views.py b/aleksis/core/views.py index e9536003df379d5f97d1cf895d27c2a7b1623600..79f1ba689b6cd381273258724001930d1b8ced52 100644 --- a/aleksis/core/views.py +++ b/aleksis/core/views.py @@ -45,6 +45,7 @@ from django_celery_results.models import TaskResult from django_filters.views import FilterView from django_tables2 import RequestConfig, SingleTableMixin, SingleTableView from dynamic_preferences.forms import preference_form_builder +from graphene_django.views import GraphQLView, graphene_settings from guardian.shortcuts import GroupObjectPermission, UserObjectPermission, get_objects_for_user from haystack.generic_views import SearchView from haystack.inputs import AutoQuery @@ -1543,3 +1544,9 @@ class TwoFactorLoginView(two_factor_views.LoginView): other_devices = list(filter(lambda x: not isinstance(x, type(main_device)), other_devices)) return other_devices + + +class GQLView(GraphQLView): + def __init__(self, *args, **kwargs): + kwargs.update({"middleware":[graphene_settings.MIDDLEWARE]}) + super().__init__(*args, **kwargs)