aboutsummaryrefslogtreecommitdiffstats
path: root/pydis_site
diff options
context:
space:
mode:
authorGravatar Joe Banks <[email protected]>2020-10-10 18:39:45 +0100
committerGravatar GitHub <[email protected]>2020-10-10 18:39:45 +0100
commit071ef50cffcbe089e2d81933718dee1cfa834782 (patch)
tree53a24c17e89050a701c61ee2dc3647728809a5f3 /pydis_site
parentMerge pull request #409 from dementati/feat/397-398-metricity-db-and-api (diff)
parentRemove multiple objects returning test case (diff)
Merge pull request #411 from ks129/voice-gate
Implement voice bans to API
Diffstat (limited to 'pydis_site')
-rw-r--r--pydis_site/apps/api/migrations/0067_add_voice_ban_infraction_type.py18
-rw-r--r--pydis_site/apps/api/models/bot/infraction.py3
-rw-r--r--pydis_site/apps/api/serializers.py2
-rw-r--r--pydis_site/apps/api/tests/test_users.py21
-rw-r--r--pydis_site/apps/api/viewsets/bot/user.py11
5 files changed, 53 insertions, 2 deletions
diff --git a/pydis_site/apps/api/migrations/0067_add_voice_ban_infraction_type.py b/pydis_site/apps/api/migrations/0067_add_voice_ban_infraction_type.py
new file mode 100644
index 00000000..9a940ff4
--- /dev/null
+++ b/pydis_site/apps/api/migrations/0067_add_voice_ban_infraction_type.py
@@ -0,0 +1,18 @@
+# Generated by Django 3.0.10 on 2020-10-10 16:08
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('api', '0066_merge_20201003_0730'),
+ ]
+
+ operations = [
+ migrations.AlterField(
+ model_name='infraction',
+ name='type',
+ field=models.CharField(choices=[('note', 'Note'), ('warning', 'Warning'), ('watch', 'Watch'), ('mute', 'Mute'), ('kick', 'Kick'), ('ban', 'Ban'), ('superstar', 'Superstar'), ('voice_ban', 'Voice Ban')], help_text='The type of the infraction.', max_length=9),
+ ),
+ ]
diff --git a/pydis_site/apps/api/models/bot/infraction.py b/pydis_site/apps/api/models/bot/infraction.py
index 7660cbba..60c1e8dd 100644
--- a/pydis_site/apps/api/models/bot/infraction.py
+++ b/pydis_site/apps/api/models/bot/infraction.py
@@ -15,7 +15,8 @@ class Infraction(ModelReprMixin, models.Model):
("mute", "Mute"),
("kick", "Kick"),
("ban", "Ban"),
- ("superstar", "Superstar")
+ ("superstar", "Superstar"),
+ ("voice_ban", "Voice Ban"),
)
inserted_at = models.DateTimeField(
default=timezone.now,
diff --git a/pydis_site/apps/api/serializers.py b/pydis_site/apps/api/serializers.py
index 25c5c82e..10eb3839 100644
--- a/pydis_site/apps/api/serializers.py
+++ b/pydis_site/apps/api/serializers.py
@@ -167,7 +167,7 @@ class InfractionSerializer(ModelSerializer):
raise ValidationError({'expires_at': [f'{infr_type} infractions cannot expire.']})
hidden = attrs.get('hidden')
- if hidden and infr_type in ('superstar', 'warning'):
+ if hidden and infr_type in ('superstar', 'warning', 'voice_ban'):
raise ValidationError({'hidden': [f'{infr_type} infractions cannot be hidden.']})
if not hidden and infr_type in ('note', ):
diff --git a/pydis_site/apps/api/tests/test_users.py b/pydis_site/apps/api/tests/test_users.py
index d03785ae..72ffcb3c 100644
--- a/pydis_site/apps/api/tests/test_users.py
+++ b/pydis_site/apps/api/tests/test_users.py
@@ -1,5 +1,6 @@
from unittest.mock import patch
+from django.core.exceptions import ObjectDoesNotExist
from django_hosts.resolvers import reverse
from .base import APISubdomainTestCase
@@ -419,6 +420,7 @@ class UserMetricityTests(APISubdomainTestCase):
self.assertEqual(response.json(), {
"verified_at": verified_at,
"total_messages": total_messages,
+ "voice_banned": False,
})
def test_no_metricity_user(self):
@@ -432,6 +434,25 @@ class UserMetricityTests(APISubdomainTestCase):
# Then
self.assertEqual(response.status_code, 404)
+ def test_metricity_voice_banned(self):
+ cases = [
+ {'exception': None, 'voice_banned': True},
+ {'exception': ObjectDoesNotExist, 'voice_banned': False},
+ ]
+
+ self.mock_metricity_user("foo", 1)
+
+ for case in cases:
+ with self.subTest(exception=case['exception'], voice_banned=case['voice_banned']):
+ with patch("pydis_site.apps.api.viewsets.bot.user.Infraction.objects.get") as p:
+ p.side_effect = case['exception']
+
+ url = reverse('bot:user-metricity-data', args=[0], host='api')
+ response = self.client.get(url)
+
+ self.assertEqual(response.status_code, 200)
+ self.assertEqual(response.json()["voice_banned"], case["voice_banned"])
+
def mock_metricity_user(self, verified_at, total_messages):
patcher = patch("pydis_site.apps.api.viewsets.bot.user.Metricity")
self.metricity = patcher.start()
diff --git a/pydis_site/apps/api/viewsets/bot/user.py b/pydis_site/apps/api/viewsets/bot/user.py
index 3ab71186..5205dc97 100644
--- a/pydis_site/apps/api/viewsets/bot/user.py
+++ b/pydis_site/apps/api/viewsets/bot/user.py
@@ -1,6 +1,7 @@
import typing
from collections import OrderedDict
+from django.core.exceptions import ObjectDoesNotExist
from rest_framework import status
from rest_framework.decorators import action
from rest_framework.pagination import PageNumberPagination
@@ -9,6 +10,7 @@ from rest_framework.response import Response
from rest_framework.serializers import ModelSerializer
from rest_framework.viewsets import ModelViewSet
+from pydis_site.apps.api.models.bot.infraction import Infraction
from pydis_site.apps.api.models.bot.metricity import Metricity, NotFound
from pydis_site.apps.api.models.bot.user import User
from pydis_site.apps.api.serializers import UserSerializer
@@ -240,10 +242,19 @@ class UserViewSet(ModelViewSet):
def metricity_data(self, request: Request, pk: str = None) -> Response:
"""Request handler for metricity_data endpoint."""
user = self.get_object()
+
+ try:
+ Infraction.objects.get(user__id=user.id, active=True, type="voice_ban")
+ except ObjectDoesNotExist:
+ voice_banned = False
+ else:
+ voice_banned = True
+
with Metricity() as metricity:
try:
data = metricity.user(user.id)
data["total_messages"] = metricity.total_messages(user.id)
+ data["voice_banned"] = voice_banned
return Response(data, status=status.HTTP_200_OK)
except NotFound:
return Response(dict(detail="User not found in metricity"),