diff --git a/aleksis/core/schema/base.py b/aleksis/core/schema/base.py
index e927dadccaaab7b2bf39c2110286970222f70f5b..d487fa74098cfd87fd0b3799a98d9734849ee25d 100644
--- a/aleksis/core/schema/base.py
+++ b/aleksis/core/schema/base.py
@@ -1,3 +1,5 @@
+from django.db.models import Model
+
 import graphene
 from graphene_django import DjangoObjectType
 
@@ -24,3 +26,23 @@ class FieldFileType(graphene.ObjectType):
 
     def resolve_absolute_url(root, info, **kwargs):
         return info.context.build_absolute_uri(root.url) if root else ""
+
+
+class DeleteMutation(graphene.Mutation):
+    """Mutation to delete an object."""
+
+    klass: Model = None
+    permission_required: str = ""
+    ok = graphene.Boolean()
+
+    class Arguments:
+        id = graphene.ID()  # noqa
+
+    @classmethod
+    def mutate(cls, root, info, **kwargs):
+        obj = cls.klass.objects.get(pk=kwargs["id"])
+        if info.context.user.has_perm(cls.permission_required, obj):
+            obj.delete()
+            return cls(ok=True)
+        else:
+            raise Exception("Permission denied")