diff --git a/back/bots/models/chat.py b/back/bots/models/chat.py index a4edc40..9abac72 100644 --- a/back/bots/models/chat.py +++ b/back/bots/models/chat.py @@ -135,7 +135,7 @@ def create_flashcard(deck_name: str, front: str, back: str) -> str: logger.info(f"🃏 CREATE_FLASHCARD_TOOL_INVOKED: deck_name='{deck_name}'") try: with transaction.atomic(): - deck = Deck.objects.filter(profile=self.profile, name=deck_name).first() + deck = Deck.objects.select_for_update().filter(profile=self.profile, name=deck_name).first() if not deck: deck = Deck.objects.create( profile=self.profile, @@ -143,7 +143,7 @@ def create_flashcard(deck_name: str, front: str, back: str) -> str: name=deck_name, description="" ) - deck = Deck.objects.select_for_update().get(pk=deck.pk) + deck = Deck.objects.select_for_update().get(pk=deck.pk) max_order = Flashcard.objects.filter(deck=deck).aggregate(models.Max('order'))['order__max'] or -1 Flashcard.objects.create( deck=deck, diff --git a/back/bots/tests/test_chat.py b/back/bots/tests/test_chat.py index 68663a6..1964f58 100644 --- a/back/bots/tests/test_chat.py +++ b/back/bots/tests/test_chat.py @@ -6,6 +6,9 @@ from bots.models.chat import Chat from bots.models.bot import Bot from bots.models.ai_model import AiModel +from bots.models.deck import Deck +from bots.models.profile import Profile +from bots.models.flashcard import Flashcard from langchain_core.messages import AIMessage import uuid @@ -181,3 +184,20 @@ def it_should_not_use_web_search_when_disabled(load_fixture, chat, ai, ai_output result = chat.get_response(ai=ai) assert result == "Hello! How can I assist you today?" + + +@pytest.mark.django_db +def test_flashcard_order_increments(): + chat = Chat.objects.create() + profile = Profile.objects.create(user=chat.user) + deck = Deck.objects.create(chat=chat, name="Test Deck", profile=profile) + + Flashcard.objects.create(deck=deck, front="front0", back="back0", order=0) + Flashcard.objects.create(deck=deck, front="front1", back="back1", order=1) + Flashcard.objects.create(deck=deck, front="front2", back="back2", order=2) + + card_count = Flashcard.objects.filter(deck=deck).count() + assert card_count == 3, f"Expected 3 cards, got {card_count}" + + orders = list(Flashcard.objects.filter(deck=deck).order_by('order').values_list('order', flat=True)) + assert orders == [0, 1, 2], f"Expected orders [0, 1, 2], got {orders}"