From e912cae235d77e35f72c720c6083875720aba602 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Bedna=C5=99=C3=ADk?= <jan.bednarik@gmail.com> Date: Sat, 20 Oct 2018 23:14:47 +0200 Subject: [PATCH] Use Enum for User sort options --- openlobby/core/api/schema.py | 20 +++++++------------- openlobby/core/models.py | 18 +++++++++--------- tests/test_models.py | 18 +++++++----------- 3 files changed, 23 insertions(+), 33 deletions(-) diff --git a/openlobby/core/api/schema.py b/openlobby/core/api/schema.py index 7d8235b..9aab7ee 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 97648f7..a7c9aed 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 12e54d9..7c0876d 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"], ), ], -- GitLab