diff --git a/openlobby/core/api/schema.py b/openlobby/core/api/schema.py
index 7d8235b04d1e0961930d22f7770d351c29472e44..9aab7eeded9b7fe498e171bb1a68d83bbdcd9828 100644
--- a/openlobby/core/api/schema.py
+++ b/openlobby/core/api/schema.py
@@ -1,5 +1,4 @@
 import graphene
-from django.db.models import Count, Q
 from graphene import relay
 
 from . import types
@@ -7,18 +6,10 @@ from .paginator import Paginator
 from .sanitizers import extract_text
 from .. import search
 from ..models import OpenIdClient
-from ..models import User, Report
+from ..models import User, Report, UserSort
 
-AUTHOR_SORT_LAST_NAME_ID = 1
-AUTHOR_SORT_TOTAL_REPORTS_ID = 2
 
-
-class AuthorSortEnum(graphene.Enum):
-    LAST_NAME = AUTHOR_SORT_LAST_NAME_ID
-    TOTAL_REPORTS = AUTHOR_SORT_TOTAL_REPORTS_ID
-
-    class Meta:
-        description = "Sort by field."
+UserSortEnum = graphene.Enum.from_enum(UserSort)
 
 
 class AuthorsConnection(relay.Connection):
@@ -49,9 +40,9 @@ class Query:
     authors = relay.ConnectionField(
         AuthorsConnection,
         description="List of Authors. Returns first 10 nodes if pagination is not specified.",
-        sort=AuthorSortEnum(),
+        sort=UserSortEnum(),
         reversed=graphene.Boolean(
-            default_value=False, description="Reverse order of sort"
+            default_value=False, description="Reverse order of sort."
         ),
     )
     search_reports = relay.ConnectionField(
@@ -70,6 +61,9 @@ class Query:
     )
 
     def resolve_authors(self, info, **kwargs):
+        if "sort" in kwargs:
+            kwargs["sort"] = UserSort(kwargs["sort"])
+
         paginator = Paginator(**kwargs)
 
         total = User.objects.filter(is_author=True).count()
diff --git a/openlobby/core/models.py b/openlobby/core/models.py
index 97648f705dbeaf8bb8c5a9d1fabcdd5a241d4a02..a7c9aed9453ba29649f8aaa232fc2ee11ac7bcdf 100644
--- a/openlobby/core/models.py
+++ b/openlobby/core/models.py
@@ -1,3 +1,4 @@
+from enum import Enum
 import time
 
 from django.conf import settings
@@ -9,6 +10,11 @@ from django.db.models import Q
 from django.utils import timezone
 
 
+class UserSort(Enum):
+    LAST_NAME = "last_name"
+    TOTAL_REPORTS = "total_reports"
+
+
 class CustomUserManager(UserManager):
     def with_total_reports(self):
         return self.get_queryset().annotate(
@@ -19,21 +25,15 @@ class CustomUserManager(UserManager):
         )
 
     def sorted(self, **kwargs):
-        # inline import intentionally
-        from openlobby.core.api.schema import (
-            AUTHOR_SORT_LAST_NAME_ID,
-            AUTHOR_SORT_TOTAL_REPORTS_ID,
-        )
-
         qs = self.with_total_reports()
-        sort_field = kwargs.get("sort", AUTHOR_SORT_LAST_NAME_ID)
+        sort_choice = kwargs.get("sort", UserSort.LAST_NAME)
 
-        if sort_field == AUTHOR_SORT_LAST_NAME_ID:
+        if sort_choice == UserSort.LAST_NAME:
             return qs.order_by(
                 "{}last_name".format("-" if kwargs.get("reversed", False) else ""),
                 "first_name",
             )
-        elif sort_field == AUTHOR_SORT_TOTAL_REPORTS_ID:
+        elif sort_choice == UserSort.TOTAL_REPORTS:
             return qs.order_by(
                 "{}total_reports".format("" if kwargs.get("reversed", False) else "-"),
                 "last_name",
diff --git a/tests/test_models.py b/tests/test_models.py
index 12e54d92581d3cba5544f0d0174107e9bbff942d..7c0876d0bf8039cd6f2e29790a0d40055f8b209b 100644
--- a/tests/test_models.py
+++ b/tests/test_models.py
@@ -3,12 +3,8 @@ from unittest.mock import patch
 import arrow
 import pytest
 from django.conf import settings
-from openlobby.core.api.schema import (
-    AUTHOR_SORT_LAST_NAME_ID,
-    AUTHOR_SORT_TOTAL_REPORTS_ID,
-)
 from openlobby.core.documents import ReportDoc
-from openlobby.core.models import Report, User, OpenIdClient, LoginAttempt
+from openlobby.core.models import Report, User, OpenIdClient, LoginAttempt, UserSort
 
 from .dummy import prepare_reports
 
@@ -152,22 +148,22 @@ def test_user__name_collision_excludes_self_on_update():
         ({}, ["Sheep", "Squarepants", "Wolfe"]),
         ({"reversed": False}, ["Sheep", "Squarepants", "Wolfe"]),
         ({"reversed": True}, ["Wolfe", "Squarepants", "Sheep"]),
-        ({"sort": AUTHOR_SORT_LAST_NAME_ID}, ["Sheep", "Squarepants", "Wolfe"]),
+        ({"sort": UserSort.LAST_NAME}, ["Sheep", "Squarepants", "Wolfe"]),
         (
-            {"sort": AUTHOR_SORT_LAST_NAME_ID, "reversed": False},
+            {"sort": UserSort.LAST_NAME, "reversed": False},
             ["Sheep", "Squarepants", "Wolfe"],
         ),
         (
-            {"sort": AUTHOR_SORT_LAST_NAME_ID, "reversed": True},
+            {"sort": UserSort.LAST_NAME, "reversed": True},
             ["Wolfe", "Squarepants", "Sheep"],
         ),
-        ({"sort": AUTHOR_SORT_TOTAL_REPORTS_ID}, ["Wolfe", "Sheep", "Squarepants"]),
+        ({"sort": UserSort.TOTAL_REPORTS}, ["Wolfe", "Sheep", "Squarepants"]),
         (
-            {"sort": AUTHOR_SORT_TOTAL_REPORTS_ID, "reversed": False},
+            {"sort": UserSort.TOTAL_REPORTS, "reversed": False},
             ["Wolfe", "Sheep", "Squarepants"],
         ),
         (
-            {"sort": AUTHOR_SORT_TOTAL_REPORTS_ID, "reversed": True},
+            {"sort": UserSort.TOTAL_REPORTS, "reversed": True},
             ["Squarepants", "Sheep", "Wolfe"],
         ),
     ],