Skip to content

Commit a9f7a44

Browse files
committed
Fix
1 parent c0ebc0a commit a9f7a44

File tree

3 files changed

+116
-34
lines changed

3 files changed

+116
-34
lines changed

backend/api/submissions/schema.py

Lines changed: 19 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1+
import random
12
from api.context import Info
23
from api.submissions.permissions import CanSeeSubmissionRestrictedFields
34

4-
from pycon.db_utils import set_seed
55
import strawberry
66

77
from api.permissions import CanSeeSubmissions, IsAuthenticated
@@ -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,29 +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-
with set_seed(info.context.request.user.id):
100-
qs = qs.order_by("?").distinct()
94+
qs = qs.order_by("id").distinct()
10195

102-
total_items = qs.count()
103-
submissions = list(qs[(page - 1) * page_size : page * page_size])
96+
all_submissions = list(qs)
97+
random.Random(user.id).shuffle(all_submissions)
98+
99+
total_items = len(all_submissions)
100+
submissions = list(all_submissions[(page - 1) * page_size : page * page_size])
104101

105102
info.context._my_votes = {
106103
vote.submission_id: vote
107-
for vote in Vote.objects.filter(
108-
user_id=request.user.id, submission__in=submissions
109-
)
104+
for vote in Vote.objects.filter(user_id=user.id, submission__in=submissions)
110105
}
111106

112107
return Paginated.paginate_list(

backend/api/submissions/tests/test_submissions.py

Lines changed: 97 additions & 0 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,71 @@
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: 10) {
26+
pageInfo {
27+
totalPages
28+
totalItems
29+
}
30+
items {
31+
id
32+
}
33+
}
34+
}"""
35+
36+
resp = graphql_client.query(
37+
query,
38+
variables={"code": submission.conference.code},
39+
)
40+
41+
assert not resp.get("errors")
42+
43+
assert resp["data"]["submissions"]["items"] == [
44+
{"id": submission_3.hashid},
45+
{"id": submission_2.hashid},
46+
{"id": submission.hashid},
47+
]
48+
49+
graphql_client.force_login(user_2)
50+
51+
resp = graphql_client.query(
52+
query,
53+
variables={"code": submission.conference.code},
54+
)
55+
56+
assert resp["data"]["submissions"]["items"] == [
57+
{"id": submission.hashid},
58+
{"id": submission_2.hashid},
59+
{"id": submission_3.hashid},
60+
]
61+
62+
graphql_client.force_login(user_3)
63+
64+
resp = graphql_client.query(
65+
query,
66+
variables={"code": submission.conference.code},
67+
)
68+
69+
assert resp["data"]["submissions"]["items"] == [
70+
{"id": submission_2.hashid},
71+
{"id": submission_3.hashid},
72+
{"id": submission.hashid},
73+
]
74+
75+
976
def test_returns_submissions_paginated(graphql_client, user):
1077
graphql_client.force_login(user)
1178

@@ -39,6 +106,36 @@ def test_returns_submissions_paginated(graphql_client, user):
39106
assert resp_2["data"]["submissions"]["items"] == [{"id": submission_2.hashid}]
40107

41108

109+
def test_canceled_submissions_are_excluded(graphql_client, user, mock_has_ticket):
110+
graphql_client.force_login(user)
111+
112+
submission = SubmissionFactory()
113+
SubmissionFactory(
114+
status=Submission.STATUS.cancelled, conference=submission.conference
115+
)
116+
mock_has_ticket(submission.conference)
117+
118+
query = """query Submissions($code: String!, $page: Int) {
119+
submissions(code: $code, page: $page, pageSize: 10) {
120+
pageInfo {
121+
totalPages
122+
totalItems
123+
}
124+
items {
125+
id
126+
}
127+
}
128+
}"""
129+
resp = graphql_client.query(
130+
query,
131+
variables={"code": submission.conference.code},
132+
)
133+
134+
assert not resp.get("errors")
135+
assert resp["data"]["submissions"]["items"] == [{"id": submission.hashid}]
136+
assert resp["data"]["submissions"]["pageInfo"] == {"totalPages": 1, "totalItems": 1}
137+
138+
42139
def test_page_size_cannot_be_less_than_1(graphql_client, user):
43140
graphql_client.force_login(user)
44141

backend/pycon/db_utils.py

Lines changed: 0 additions & 10 deletions
This file was deleted.

0 commit comments

Comments
 (0)