Skip to content

Commit f2bfe76

Browse files
authored
Make voting submissions more random (#4307)
1 parent 4d4f3f7 commit f2bfe76

File tree

2 files changed

+107
-27
lines changed

2 files changed

+107
-27
lines changed

backend/api/submissions/schema.py

Lines changed: 17 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -57,25 +57,22 @@ def submissions(
5757
raise ValueError("Page must be greater than 0")
5858

5959
request = info.context.request
60+
user = request.user
6061
conference = ConferenceModel.objects.filter(code=code).first()
6162

6263
if not conference or not CanSeeSubmissions().has_permission(conference, info):
6364
raise PermissionError("You need to have a ticket to see submissions")
6465

6566
info.context._user_can_vote = True
6667

67-
qs = (
68-
conference.submissions.prefetch_related(
69-
"type",
70-
"duration",
71-
"schedule_items",
72-
"languages",
73-
"audience_level",
74-
"tags",
75-
)
76-
.order_by("id")
77-
.filter(status=SubmissionModel.STATUS.proposed)
78-
)
68+
qs = conference.submissions.prefetch_related(
69+
"type",
70+
"duration",
71+
"schedule_items",
72+
"languages",
73+
"audience_level",
74+
"tags",
75+
).filter(status=SubmissionModel.STATUS.proposed)
7976

8077
if languages:
8178
qs = qs.filter(languages__code__in=languages)
@@ -84,32 +81,27 @@ def submissions(
8481
qs = qs.filter(tags__id__in=tags)
8582

8683
if voted:
87-
qs = qs.filter(votes__user_id=request.user.id)
84+
qs = qs.filter(votes__user_id=user.id)
8885
elif voted is not None:
89-
qs = qs.exclude(
90-
id__in=[s.id for s in qs.filter(votes__user_id=request.user.id)]
91-
)
86+
qs = qs.exclude(id__in=[s.id for s in qs.filter(votes__user_id=user.id)])
9287

9388
if types:
9489
qs = qs.filter(type__id__in=types)
9590

9691
if audience_levels:
9792
qs = qs.filter(audience_level__id__in=audience_levels)
9893

99-
qs = qs.distinct()
100-
total_items = qs.count()
94+
qs = qs.order_by("id").distinct()
10195

102-
# Randomize the order of the submissions
103-
user = info.context.request.user
96+
all_submissions = list(qs)
97+
random.Random(user.id).shuffle(all_submissions)
10498

105-
submissions = list(qs[(page - 1) * page_size : page * page_size])
106-
random.Random(user.id).shuffle(submissions)
99+
total_items = len(all_submissions)
100+
submissions = list(all_submissions[(page - 1) * page_size : page * page_size])
107101

108102
info.context._my_votes = {
109103
vote.submission_id: vote
110-
for vote in Vote.objects.filter(
111-
user_id=request.user.id, submission__in=submissions
112-
)
104+
for vote in Vote.objects.filter(user_id=user.id, submission__in=submissions)
113105
}
114106

115107
return Paginated.paginate_list(

backend/api/submissions/tests/test_submissions.py

Lines changed: 90 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
from submissions.models import Submission
2+
from users.tests.factories import UserFactory
13
from voting.tests.factories.vote import VoteFactory
24
from conferences.tests.factories import ConferenceFactory
35
from submissions.tests.factories import SubmissionFactory
@@ -6,6 +8,62 @@
68
pytestmark = pytest.mark.django_db
79

810

11+
def test_submissions_are_random_by_user(graphql_client, mock_has_ticket):
12+
user_1 = UserFactory(id=100)
13+
user_2 = UserFactory(id=103)
14+
user_3 = UserFactory(id=104)
15+
16+
graphql_client.force_login(user_1)
17+
18+
submission = SubmissionFactory(id=1)
19+
submission_2 = SubmissionFactory(id=2, conference=submission.conference)
20+
submission_3 = SubmissionFactory(id=3, conference=submission.conference)
21+
22+
mock_has_ticket(submission.conference)
23+
24+
query = """query Submissions($code: String!, $page: Int) {
25+
submissions(code: $code, page: $page, pageSize: 1) {
26+
pageInfo {
27+
totalPages
28+
totalItems
29+
}
30+
items {
31+
id
32+
}
33+
}
34+
}"""
35+
36+
data_proposals = {
37+
user_1: [
38+
{"id": submission_3.hashid},
39+
{"id": submission_2.hashid},
40+
{"id": submission.hashid},
41+
],
42+
user_2: [
43+
{"id": submission.hashid},
44+
{"id": submission_2.hashid},
45+
{"id": submission_3.hashid},
46+
],
47+
user_3: [
48+
{"id": submission_2.hashid},
49+
{"id": submission_3.hashid},
50+
{"id": submission.hashid},
51+
],
52+
}
53+
54+
for user in [user_1, user_2, user_3]:
55+
graphql_client.force_login(user)
56+
57+
for page in range(3):
58+
resp = graphql_client.query(
59+
query,
60+
variables={"code": submission.conference.code, "page": page + 1},
61+
)
62+
63+
assert not resp.get("errors")
64+
assert resp["data"]["submissions"]["items"] == [data_proposals[user][page]]
65+
66+
967
def test_returns_submissions_paginated(graphql_client, user):
1068
graphql_client.force_login(user)
1169

@@ -29,14 +87,44 @@ def test_returns_submissions_paginated(graphql_client, user):
2987
)
3088

3189
assert not resp.get("errors")
32-
assert resp["data"]["submissions"]["items"] == [{"id": submission.hashid}]
90+
assert resp["data"]["submissions"]["items"] == [{"id": submission_2.hashid}]
3391
assert resp["data"]["submissions"]["pageInfo"] == {"totalPages": 2, "totalItems": 2}
3492

3593
resp_2 = graphql_client.query(
3694
query,
3795
variables={"code": submission.conference.code, "page": 2},
3896
)
39-
assert resp_2["data"]["submissions"]["items"] == [{"id": submission_2.hashid}]
97+
assert resp_2["data"]["submissions"]["items"] == [{"id": submission.hashid}]
98+
99+
100+
def test_canceled_submissions_are_excluded(graphql_client, user, mock_has_ticket):
101+
graphql_client.force_login(user)
102+
103+
submission = SubmissionFactory()
104+
SubmissionFactory(
105+
status=Submission.STATUS.cancelled, conference=submission.conference
106+
)
107+
mock_has_ticket(submission.conference)
108+
109+
query = """query Submissions($code: String!, $page: Int) {
110+
submissions(code: $code, page: $page, pageSize: 10) {
111+
pageInfo {
112+
totalPages
113+
totalItems
114+
}
115+
items {
116+
id
117+
}
118+
}
119+
}"""
120+
resp = graphql_client.query(
121+
query,
122+
variables={"code": submission.conference.code},
123+
)
124+
125+
assert not resp.get("errors")
126+
assert resp["data"]["submissions"]["items"] == [{"id": submission.hashid}]
127+
assert resp["data"]["submissions"]["pageInfo"] == {"totalPages": 1, "totalItems": 1}
40128

41129

42130
def test_page_size_cannot_be_less_than_1(graphql_client, user):

0 commit comments

Comments
 (0)