Skip to content

Commit

Permalink
Improve card ordering
Browse files Browse the repository at this point in the history
  • Loading branch information
ldeluigi committed Oct 4, 2024
1 parent d9a6ab4 commit 2af54df
Show file tree
Hide file tree
Showing 3 changed files with 41 additions and 11 deletions.
31 changes: 21 additions & 10 deletions backend/spellbook/tests/test_views/test_card_views.py
Original file line number Diff line number Diff line change
Expand Up @@ -66,13 +66,24 @@ def test_cards_detail_view(self):

def test_cards_list_view_ordering(self):
self.generate_and_publish_variants()
response = self.client.get('/cards?ordering=-variant_count', follow=True)
self.assertEqual(response.status_code, 200)
self.assertEqual(response.get('Content-Type'), 'application/json')
result = json.loads(response.content, object_hook=json_to_python_lambda)
card_count = Card.objects.count()
self.assertEqual(len(result.results), card_count)
previous_variant_count = 0
for i in range(card_count):
self.card_assertions(result.results[i])
self.assertGreaterEqual(result.results[i].variant_count, previous_variant_count)
for ordering, assertion in [
('variant_count', lambda a, b: self.assertGreaterEqual(a.variant_count, b.variant_count)),
('-variant_count', lambda a, b: self.assertLessEqual(a.variant_count, b.variant_count)),
('name', lambda a, b: self.assertGreaterEqual(a.name, b.name)),
('-name', lambda a, b: self.assertLessEqual(a.name, b.name)),
]:
response = self.client.get(f'/cards?ordering={ordering}', follow=True)
self.assertEqual(response.status_code, 200)
self.assertEqual(response.get('Content-Type'), 'application/json')
result = json.loads(response.content, object_hook=json_to_python_lambda)
card_count = Card.objects.count()
self.assertEqual(len(result.results), card_count)
previous_variant = None
variant_count_values = set[int()]()
for i in range(card_count):
self.card_assertions(result.results[i])
if i > 0:
assertion(result.results[i], previous_variant)
previous_variant = result.results[i]
variant_count_values.add(result.results[i].variant_count) # type: ignore
self.assertGreater(len(variant_count_values), 1)
19 changes: 19 additions & 0 deletions backend/spellbook/tests/testing.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,9 @@
import uuid
from functools import reduce
from collections import defaultdict

from django.db.models import Count, OuterRef, Subquery
from django.db.models.functions import Coalesce
from common.testing import TestCaseMixin as BaseTestCaseMixin
from django.conf import settings
from spellbook.models import Card, Feature, Combo, CardInCombo, Template, TemplateInCombo
Expand All @@ -25,10 +28,26 @@ def bulk_serialize_variants(self, q=None, extra_fields=[]):
q = Variant.objects.all()
Variant.objects.bulk_serialize(q, serializer=VariantSerializer, fields=extra_fields) # type: ignore

def update_variants_count(self):
Card.objects.update(
variant_count=Coalesce(
Subquery(
Variant
.objects
.filter(uses=OuterRef('pk'), status__in=('OK', 'E'))
.values('uses')
.annotate(total=Count('pk'))
.values('total'),
),
0,
),
)

def generate_and_publish_variants(self):
self.generate_variants()
self.bulk_serialize_variants()
Variant.objects.update(status=Variant.Status.OK)
self.update_variants_count()

def save_combo_model(self, model: dict[tuple[str, ...] | str, tuple[str, ...]]):
card_ids_by_name: dict[str, int] = {}
Expand Down
2 changes: 1 addition & 1 deletion backend/spellbook/views/cards.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,5 +7,5 @@
class CardViewSet(viewsets.ReadOnlyModelViewSet):
queryset = CardDetailSerializer.prefetch_related(Card.objects)
serializer_class = CardDetailSerializer
ordering = ['variant_count']
ordering = ['variant_count', 'name']
filter_backends = [NameAutocompleteQueryFilter, OrderingFilterWithNullsLast]

0 comments on commit 2af54df

Please sign in to comment.