Skip to content

Fix issue #188: Create winners view V3 #189

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Draft
wants to merge 1 commit into
base: main
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
39 changes: 39 additions & 0 deletions photo/queries.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,9 +30,12 @@
CollectionType,
ContestSubmissionType,
ContestType,
ContestWinnersType,
ContestWinnerType,
PictureCommentType,
PictureType,
UserType,
WinnerSubmissionType,
)
from utils.enums import ContestInternalStates

Expand Down Expand Up @@ -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
106 changes: 106 additions & 0 deletions photo/tests/test_queries/test_contest_winners.py
Original file line number Diff line number Diff line change
@@ -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}
22 changes: 22 additions & 0 deletions photo/types.py
Original file line number Diff line number Diff line change
Expand Up @@ -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]