Skip to content

Commit 8b375d5

Browse files
authored
Merge pull request #647 from python-discord/voice-mute-in-metricity-endpoint
Use voice_mute and voice_ban to determine voice_gate
2 parents 7056e7f + 1b5e7eb commit 8b375d5

File tree

2 files changed

+28
-18
lines changed

2 files changed

+28
-18
lines changed

pydis_site/apps/api/tests/test_users.py

Lines changed: 22 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
1-
from unittest.mock import patch
1+
from unittest.mock import Mock, patch
22

3-
from django.core.exceptions import ObjectDoesNotExist
43
from django.urls import reverse
54

65
from .base import AuthenticatedAPITestCase
7-
from ..models import Role, User
6+
from ..models import Infraction, Role, User
87
from ..models.bot.metricity import NotFoundError
98
from ..viewsets.bot.user import UserListPagination
109

@@ -424,7 +423,7 @@ def test_get_metricity_data(self):
424423
self.assertCountEqual(response.json(), {
425424
"joined_at": joined_at,
426425
"total_messages": total_messages,
427-
"voice_banned": False,
426+
"voice_gate_blocked": False,
428427
"activity_blocks": total_blocks
429428
})
430429

@@ -451,23 +450,36 @@ def test_no_metricity_user_for_review(self):
451450
self.assertEqual(response.status_code, 404)
452451

453452
def test_metricity_voice_banned(self):
453+
queryset_with_values = Mock(spec=Infraction.objects)
454+
queryset_with_values.filter.return_value = queryset_with_values
455+
queryset_with_values.exists.return_value = True
456+
457+
queryset_without_values = Mock(spec=Infraction.objects)
458+
queryset_without_values.filter.return_value = queryset_without_values
459+
queryset_without_values.exists.return_value = False
454460
cases = [
455-
{'exception': None, 'voice_banned': True},
456-
{'exception': ObjectDoesNotExist, 'voice_banned': False},
461+
{'voice_infractions': queryset_with_values, 'voice_gate_blocked': True},
462+
{'voice_infractions': queryset_without_values, 'voice_gate_blocked': False},
457463
]
458464

459465
self.mock_metricity_user("foo", 1, 1, [["bar", 1]])
460466

461467
for case in cases:
462-
with self.subTest(exception=case['exception'], voice_banned=case['voice_banned']):
463-
with patch("pydis_site.apps.api.viewsets.bot.user.Infraction.objects.get") as p:
464-
p.side_effect = case['exception']
468+
with self.subTest(
469+
voice_infractions=case['voice_infractions'],
470+
voice_gate_blocked=case['voice_gate_blocked']
471+
):
472+
with patch("pydis_site.apps.api.viewsets.bot.user.Infraction.objects.filter") as p:
473+
p.return_value = case['voice_infractions']
465474

466475
url = reverse('api:bot:user-metricity-data', args=[0])
467476
response = self.client.get(url)
468477

469478
self.assertEqual(response.status_code, 200)
470-
self.assertEqual(response.json()["voice_banned"], case["voice_banned"])
479+
self.assertEqual(
480+
response.json()["voice_gate_blocked"],
481+
case["voice_gate_blocked"]
482+
)
471483

472484
def test_metricity_review_data(self):
473485
# Given

pydis_site/apps/api/viewsets/bot/user.py

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import typing
22
from collections import OrderedDict
33

4-
from django.core.exceptions import ObjectDoesNotExist
4+
from django.db.models import Q
55
from rest_framework import status
66
from rest_framework.decorators import action
77
from rest_framework.pagination import PageNumberPagination
@@ -261,12 +261,10 @@ def metricity_data(self, request: Request, pk: str = None) -> Response:
261261
"""Request handler for metricity_data endpoint."""
262262
user = self.get_object()
263263

264-
try:
265-
Infraction.objects.get(user__id=user.id, active=True, type="voice_ban")
266-
except ObjectDoesNotExist:
267-
voice_banned = False
268-
else:
269-
voice_banned = True
264+
has_voice_infraction = Infraction.objects.filter(
265+
Q(user__id=user.id, active=True),
266+
Q(type="voice_ban") | Q(type="voice_mute")
267+
).exists()
270268

271269
with Metricity() as metricity:
272270
try:
@@ -275,7 +273,7 @@ def metricity_data(self, request: Request, pk: str = None) -> Response:
275273
data["total_messages"] = metricity.total_messages(user.id)
276274
data["activity_blocks"] = metricity.total_message_blocks(user.id)
277275

278-
data["voice_banned"] = voice_banned
276+
data["voice_gate_blocked"] = has_voice_infraction
279277
return Response(data, status=status.HTTP_200_OK)
280278
except NotFoundError:
281279
return Response(dict(detail="User not found in metricity"),

0 commit comments

Comments
 (0)