diff --git a/photo/queries.py b/photo/queries.py index 952b969..4bfd4bf 100644 --- a/photo/queries.py +++ b/photo/queries.py @@ -30,9 +30,12 @@ CollectionType, ContestSubmissionType, ContestType, + ContestWinnersType, + ContestWinnerType, PictureCommentType, PictureType, UserType, + WinnerSubmissionType, ) from utils.enums import ContestInternalStates @@ -130,3 +133,39 @@ def set_order(element): else: query_results.sort(key=set_order) return query_results + + @strawberry.field + def contest_winners(self) -> List[ContestWinnersType]: + contests = Contest.objects.exclude(winners=None).order_by('voting_draw_end') + result = [] + + for contest in contests: + winners_data = [] + for winner in contest.winners.all(): + submission = ContestSubmission.objects.filter( + contest=contest, + picture__user=winner + ).first() + + if submission: + winner_data = ContestWinnerType( + name_first=winner.name_first, + name_last=winner.name_last, + submission=WinnerSubmissionType( + picture=submission.picture, + number_votes=submission.votes.count() + ) + ) + winners_data.append(winner_data) + + if winners_data: + contest_data = ContestWinnersType( + title=contest.title, + description=contest.description, + prize=contest.prize, + voting_draw_end=contest.voting_draw_end.isoformat() if contest.voting_draw_end else None, + winners=winners_data + ) + result.append(contest_data) + + return result diff --git a/photo/tests/test_queries/test_contest_winners.py b/photo/tests/test_queries/test_contest_winners.py new file mode 100644 index 0000000..32e58d5 --- /dev/null +++ b/photo/tests/test_queries/test_contest_winners.py @@ -0,0 +1,106 @@ +import pytest +from django.utils import timezone + +from photo.models import Contest, ContestSubmission, Picture, User +from photo.tests.factories import ( + ContestFactory, + ContestSubmissionFactory, + PictureFactory, + UserFactory, +) + + +@pytest.mark.django_db +def test_contest_winners_query(client): + # Create test data + user1 = UserFactory(name_first="John", name_last="Doe") + user2 = UserFactory(name_first="Jane", name_last="Smith") + + contest1 = ContestFactory( + title="Contest 1", + description="First contest", + prize="Prize 1", + voting_draw_end=timezone.now() + ) + contest1.winners.add(user1) + + contest2 = ContestFactory( + title="Contest 2", + description="Second contest", + prize="Prize 2", + voting_draw_end=timezone.now() + timezone.timedelta(days=1) + ) + contest2.winners.add(user1, user2) + + # Create submissions for winners + picture1 = PictureFactory(user=user1, name="Picture 1") + submission1 = ContestSubmissionFactory(contest=contest1, picture=picture1) + # Add some votes + submission1.votes.add(UserFactory(), UserFactory(), UserFactory()) + + picture2 = PictureFactory(user=user1, name="Picture 2") + submission2 = ContestSubmissionFactory(contest=contest2, picture=picture2) + submission2.votes.add(UserFactory(), UserFactory()) + + picture3 = PictureFactory(user=user2, name="Picture 3") + submission3 = ContestSubmissionFactory(contest=contest2, picture=picture3) + submission3.votes.add(UserFactory(), UserFactory(), UserFactory(), UserFactory()) + + # Execute query + query = """ + query { + contestWinners { + title + description + prize + votingDrawEnd + winners { + nameFirst + nameLast + submission { + picture { + name + file + } + numberVotes + } + } + } + } + """ + + response = client.execute(query) + data = response.data["contestWinners"] + + # Verify response + assert len(data) == 2 + + # Verify first contest + assert data[0]["title"] == "Contest 1" + assert data[0]["description"] == "First contest" + assert data[0]["prize"] == "Prize 1" + assert len(data[0]["winners"]) == 1 + assert data[0]["winners"][0]["nameFirst"] == "John" + assert data[0]["winners"][0]["nameLast"] == "Doe" + assert data[0]["winners"][0]["submission"]["picture"]["name"] == "Picture 1" + assert data[0]["winners"][0]["submission"]["numberVotes"] == 3 + + # Verify second contest + assert data[1]["title"] == "Contest 2" + assert data[1]["description"] == "Second contest" + assert data[1]["prize"] == "Prize 2" + assert len(data[1]["winners"]) == 2 + + # Winners should be present in response + winner_names = { + (winner["nameFirst"], winner["nameLast"]) + for winner in data[1]["winners"] + } + assert winner_names == {("John", "Doe"), ("Jane", "Smith")} + + # Verify vote counts + vote_counts = { + winner["submission"]["numberVotes"] + for winner in data[1]["winners"] + } + assert vote_counts == {2, 4} diff --git a/photo/types.py b/photo/types.py index e63affc..340cfe7 100644 --- a/photo/types.py +++ b/photo/types.py @@ -134,3 +134,25 @@ class CloseContestMutationResponse: success: bool results: ContestType errors: str + + +@strawberry.type +class WinnerSubmissionType: + picture: PictureType + number_votes: int + + +@strawberry.type +class ContestWinnerType: + name_first: str + name_last: str + submission: WinnerSubmissionType + + +@strawberry.type +class ContestWinnersType: + title: str + description: str + prize: str + voting_draw_end: str + winners: List[ContestWinnerType]